问题 用PHP测量网络带宽


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

我确实找到了linux shell的解决方案(如何衡量网络性能(如何对网络协议进行基准测试))但不适用于PHP。

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


4523
2017-07-29 06:19


起源

那么,你想提供进度的实时反馈(速度,剩余kb等)?因为我认为ReactPHP将是正确的工具:)如果是的话,我可以提供一个小例子。否则,如果您想要根据当前负载进行估算,请执行@kost所说的并且不要过度思考;) - Jhuliano Moreno


答案:


我真的不知道您是否正在尝试进行估算或向用户提供“实时”反馈。

如果你正在估计我认为你可以去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();

请注意,您需要做的就是更改可读流的输入和可写流的输出。

你也可以将可读的流传输到一个文件(你稍后会上传到youtube),或者如果youtube允许它,甚至可以更好地将它传输到youtube(这将是很棒的:D)。

编辑添加我的一些评论可见性:

因为ReactPHP基本上是NodeJS的无耻副本,其概念   我发布的代码和想法可以很容易地在NodeJS中实现   (代码应该看起来很相似)。有了这个,我不想说   ReactPHP更糟或更好:)我只是觉得你可以达到同样的目的   使用ReactPHP,Node和他们的文档的结果更好   你会发现自己正在挖掘代码来解决问题。

我认为ReactPHP的核心足够稳定,但我理解你的   关心。话虽如此,如果我在哪里,我肯定会尝试使用   的NodeJS。如果您了解JS的基础知识,它应该几乎相同   你可以用ReactPHP获得学习曲线(如果不是更少,那就是那里   节点比ReactPHP更多的资源)。


7
2017-08-03 20:33



我个人不喜欢操作系统路由,它创建了对操作系统的依赖,并且一旦你进入bash脚本,你就会打开一堆蠕虫恕我直言。这是一个很棒的解决方案,可以保持语言。我没试过,但概念很合理。 - edhurtig
另外:由于ReactPHP基本上是NodeJS的无耻副本,我发布的代码和想法的概念可以很容易地在NodeJS中实现(代码应该看起来相似)。有了这个,我不是说ReactPHP更糟或更好:)我只是认为你可以用Node获得相同的结果,他们的文档更好用ReactPHP你会发现自己正在挖掘代码来解决问题。 - Jhuliano Moreno
@JhulianoMoreno:管道它正是我们正在做的事情: boxconnect.org (Dropbox到YouTube)。我会研究一下React。非常感谢。 - Jan
@Jan因为看起来你的应用程序的主要目的是处理流尝试尽可能使用NodeJS路由,并且,不要误解我!我认为ReactPHP是一个伟大的倡议和一个很棒的工具,但不幸的是,它处于早期阶段,你将有“早期采用者的麻烦”。祝你好运项目:)! - Jhuliano Moreno
虽然这似乎仍处于测试阶段,但它确实有效。然而,正如您所建议的那样,我将继续使用系统路线,因为它仍然看起来更值得信赖。 - Jan


创建一个linux bash脚本并使用PHP从PHP运行它 EXEC 要么 系统 功能。


2
2017-07-29 06:25



这当然是可能的,但我一直在寻找一个纯PHP解决方案。 - Jan