用PHP测量网络带宽

时间:2015-07-29 06:19:46

标签: php network-programming dropbox-api

我正在将大型文件(1gb +)从Dropbox传输到YouTube,并希望告知用户交易可能需要多长时间。有没有办法测量PHP中的网络流量?

我确实找到了linux shell(How to measure network performance (how to benchmark network protocol))的解决方案,但没有找到PHP的解决方案。

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

2 个答案:

答案 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)

创建一个linux bash-script并使用execsystem函数从PHP运行它。