Jan*_*Jan 11 php network-programming dropbox-api
我正在将大型文件(1gb +)从Dropbox传输到YouTube,并希望告知用户交易可能需要多长时间.有没有办法测量PHP中的网络流量?
我确实找到了linux shell的解决方案(如何衡量网络性能(如何测试网络协议))但不是PHP.
除了告知用户我想检查保证带宽(100 mbit/s),因为我遇到了几次网络问题(带宽太低).
我真的不知道您是否正在尝试进行估算或向用户提供"实时"反馈.
如果你正在估计我认为你可以去OS路线并做一个"exec"(如@kost建议),它将告诉你当前的负载.无需过度思考!
那么,让我们去实时解决方案 :)!
首先看看ReactPHP(http://reactphp.org/)然后进入ReactPHP的流实现(https://github.com/reactphp/stream).
我们的想法是创建一个可读的流,您将从源中读取数据块(DropBox?),并且当您这样做时,您将继续计算剩余时间并将其写入可写入的流,该流可以是Web Socket for例.
这是一个从大本地文件中读取的一个小例子,计算%并写入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();
Run Code Online (Sandbox Code Playgroud)
请注意,您需要做的就是更改可读流的输入和可写流的输出.
你也可以将可读的流传输到一个文件(你稍后会上传到youtube),或者如果youtube允许它,甚至更好,只需将它传递给youtube(这将是很棒的:D).
编辑添加我的一些评论可见性:
由于ReactPHP基本上是NodeJS的无耻副本,我发布的代码和想法的概念可以很容易地在NodeJS中实现(代码应该看起来相似).有了这个,我不是说ReactPHP更糟或更好:)我只是认为你可以用Node获得相同的结果,他们的文档更好用ReactPHP你会发现自己正在挖掘代码来解决问题.
我认为ReactPHP的核心足够稳定,但我理解你的担忧.话虽如此,如果我在哪里,我肯定会尝试使用NodeJS.如果您了解JS的基础知识,那么它与ReactPHP实际上应该是相同的学习曲线(如果不是更少,因为Node有比ReactPHP更多的资源).