我正在将大文件(1GB以上)从Dropbox传输到YouTube,并想通知用户交易大概需要多长时间。有没有办法用php测量网络流量?
我确实找到了linux shell(How to measure network performance (how to benchmark network protocol))的解决方案,但没有找到php的解决方案。
除了通知用户我想检查保证带宽(100mbit/s),因为我遇到了网络问题(带宽太低)几次。
最佳答案
我真的不知道你是想做一个评估还是给用户一个“实时”的反馈。
如果你正在做一个估计,我想你可以走操作系统的路线,做一个“exec”(就像@kost建议的那样)来告诉你当前的负载。不用想太多!
所以,让我们去现场解决:)!
首先查看reactphp(http://reactphp.org/),然后查看reactphp的streams实现(https://github.com/reactphp/stream)。
我们的想法是创建一个可读的流,您可以在其中从源(dropbox?)读取数据块。当您这样做时,您将继续计算剩余时间,并将其写入可写流(例如,可以是web套接字)。
下面是一个从大型本地文件中读取、计算%并写入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();
请注意,您需要做的只是更改可读流的输入和writeabble流的输出。
你也可以将可读的流管道传输到一个文件(稍后你会上传到youtube)或者如果youtube允许的话更好,只需将其管道传输到youtube(这将是非常棒的:d)。
编辑添加一些我的评论以获得可见性:
因为reactphp基本上是nodejs的无耻拷贝,所以
我发布的代码和思想可以很容易地在nodejs中实现
(代码甚至应该看起来相似)。我不是想说
reactphp更差或更好:)我只是认为您可以实现相同的目标
使用node和它们的文档的结果要好得多,使用reactphp
你会发现自己在代码中寻找答案。
我认为reactphp的核心已经足够稳定了,但是我理解
关心。也就是说,如果我在你那里我肯定会用
NodeJS。如果你知道js的基本原理,那么它应该基本相同
使用reactphp的学习曲线(如果不是更少,因为
比reactphp更多的节点资源)。