我正在将大型文件(1gb+)从Dropbox传输到YouTube,并希望通知用户事务可能需要多长时间。有没有任何方法来测量PHP中的网络流量?
我确实找到了linux (如何测量网络性能(如何测试网络协议))的解决方案,但没有为PHP找到解决方案。
除了通知用户,我想检查保证带宽(100 mbit/s),因为我遇到了几次网络问题(带宽太低)。
发布于 2015-08-03 20:33:48
我真的不知道你是想做一个估计,还是给用户一个“实时”反馈。
如果您正在进行估计,我认为您可以选择OS路由并执行一个"exec“(如@kost建议的),它将告诉您当前负载。不用想太多了!
那么,让我们转到实时解决方案 :)!
首先查看ReactPHP (http://reactphp.org/),然后查看ReactPHP (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();请注意,您所需要做的就是更改可读流的输入和写流的输出。
此外,您还可以将可读的流输送到一个文件(稍后将其上传到youtube),或者更好的是,如果youtube允许的话,只需将其输送到youtube (这将是非常棒的:D)。
编辑,为可见性添加一些注释:
由于ReactPHP基本上是NodeJS的一个无耻的副本,所以我发布的代码和想法的概念可以很容易地在NodeJS中实现(代码看起来应该很像)。我并不是说ReactPHP更糟或更好:)我只是认为您可以通过Node实现相同的结果,而且他们的文档要好得多,使用ReactPHP,您会发现自己在代码中挖掘出了一些东西。 我认为ReactPHP的核心是足够稳定的,但我理解您的担忧。尽管如此,如果我在你的地方,我肯定会尝试使用NodeJS。如果您了解JS的基本知识,那么它实际上应该与使用ReactPHP的学习曲线相同(如果不是更少的话,因为Node的资源要比ReactPHP多)。
发布于 2015-07-29 06:25:07
创建一个linux脚本,并使用exec或系统函数从PHP运行它。
https://stackoverflow.com/questions/31692618
复制相似问题