在 PHP 中测量网络带宽

问题描述 投票:0回答:2

我正在将大文件(1GB+)从 Dropbox 传输到 YouTube,并希望告知用户该事务可能需要多长时间。有什么方法可以测量PHP中的网络流量吗?

我确实找到了针对 linux shell 的解决方案(如何测量网络性能(如何对网络协议进行基准测试)),但没有找到针对 PHP 的解决方案。

除了通知用户我想检查保证带宽(100 mbit/s),因为我多次遇到网络问题(带宽太低)。

php network-programming dropbox-api
2个回答
7
投票

我真的不知道您是否正在尝试进行估计或向用户提供“实时”反馈。

如果你正在做估计,我认为你可以走操作系统路线并执行“exec”(像@kost建议),它会告诉你当前的负载。没必要想太多!

那么,让我们看看实时解决方案:)!

首先了解 ReactPHP (http://reactphp.org/),然后了解 ReactPHP 的流实现 (https://github.com/reactphp/stream)。

这个想法是创建一个可读流,您可以在其中从源(DropBox?)读取数据块,并且在执行此操作时,您将继续计算剩余时间并将其写入可以是 Web Socket 的可写流例如。

这是一个从本地大文件读取、计算 % 并写入 stdoud 的小示例:

<?php
require 'vendor/autoload.php';
$loop = React\EventLoop\Factory::create();
$read = new \React\Stream\Stream(fopen('hugefile.txt', 'r+'), $loop);
$fileStats = fstat($read->stream);
$totalSize = $fileStats['size'];
$chunkSize = $totalSize/100;
$currChunk = 1;
$write = new \React\Stream\Stream(fopen('php://stdout', 'w+'), $loop);
$totalReadBytes = 0;
$read->on('data', function ($data, $read) use ($write, &$totalReadBytes, $totalSize, &$currChunk, $chunkSize) {
  $totalReadBytes += strlen($data);
  if($totalReadBytes > ($chunkSize * $currChunk)){
    $currChunk = ceil(($totalReadBytes/$totalSize)*100);
    $write->write(sprintf('%010d',$totalReadBytes).'/'.sprintf('%010d',$totalSize).' - '.$currChunk.'%'.PHP_EOL);
  }
});
$loop->run();

请注意,您需要做的就是更改可读流的输入和可写流的输出。

您还可以将可读流传输到一个文件(稍后将其上传到 YouTube),或者如果 YouTube 允许,则更好,只需将其传输到 YouTube(那就太棒了:D)。

编辑添加一些我的评论以提高可见性:

由于 ReactPHP 基本上是 NodeJS 的无耻复制,所以这个概念 我发布的代码和想法可以很容易地在 NodeJS 中实现 (代码甚至应该看起来很相似)。我并不是想说 ReactPHP 是更差还是更好:) 我只是认为你可以实现同样的目标 使用 Node 的结果及其文档要好得多,使用 ReactPHP 你会发现自己正在深入研究代码来解决问题。

我认为 ReactPHP 的核心足够稳定,但我理解你的 忧虑。话虽这么说,如果我在你那里,我肯定会尝试使用 NodeJS。如果你了解 JS 的基础知识,那实际上应该是一样的 ReactPHP 的学习曲线(如果不是更少的话,因为有 Node 的资源比 ReactPHP 更多)。


2
投票

创建一个 Linux bash 脚本并使用 execsystem 函数从 PHP 运行它。

© www.soinside.com 2019 - 2024. All rights reserved.