我正在将大型文件(1gb +)从Dropbox传输到YouTube,并希望告知用户交易可能需要多长时间。有没有办法测量PHP中的网络流量?
我确实找到了linux shell(How to measure network performance (how to benchmark network protocol))的解决方案,但没有找到PHP的解决方案。
除了告知用户我想检查保证带宽(100 mbit / s),因为我遇到网络问题(带宽太低)几次。
答案 0 :(得分:7)
我真的不知道您是否正在尝试进行估算或向用户提供“实时”反馈。
如果你做了一个估计,我认为你可以去OS路线并做一个“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更糟或更好:)我只是觉得你可以达到同样的目的 使用ReactPHP,Node和他们的文档的结果更好 你会发现自己正在深入挖掘代码来解决问题。
我认为ReactPHP的核心足够稳定,但我理解你的 关心。话虽这么说,如果我在哪里你肯定会尝试使用 的NodeJS。如果您了解JS的基础知识,它应该几乎相同 学习曲线你会得到ReactPHP(如果不是更少,那里 节点比ReactPHP更多的资源。
答案 1 :(得分:2)