Измерение пропускной способности сети в PHP


Я переношу большие файлы (1 гб+) из Dropbox на YouTube и хочу сообщить пользователю, сколько времени предположительно займет транзакция. Есть ли какие-либо средства для измерения сетевого трафика в PHP?

Я нашел решения для оболочки Linux ( Как измерить производительность сети (как сравнить сетевой протокол) ), но не для PHP.

В дополнение к информированию пользователя я хочу проверить гарантированную пропускную способность (100 Мбит/с), так как у меня возникли проблемы с сетью (пропускная способность слишком низкая) пару раз.

Author: Community, 2015-07-29

2 answers

Я действительно не знаю, пытаетесь ли вы оценить или дать "живой" отзыв пользователю.

Если вы делаете оценку, я думаю, вы можете просто пойти по маршруту ОС и выполнить "exec" (как предложил @kost), который сообщит вам текущую нагрузку. Не нужно слишком много думать об этом!

Итак, давайте перейдем к живому решению :)!

Прежде всего взгляните на ReactPHP (http://reactphp.org /), а затем в потоковую реализацию ReactPHP (https://github.com/reactphp/stream).

Идея состояла бы в том, чтобы создать читаемый поток, в котором вы читали бы фрагменты данных из своего источника (Dropbox?), и по мере этого вы будете продолжать вычислять оставшееся время и записывать его в доступный для записи поток, который может быть, например, веб-сокетом.

Вот небольшой пример чтения из большого локального файла, вычисления % и записи в 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 достаточно стабильно, но я понимаю вашу озабоченность. Тем не менее, если бы я был там, где вы, я бы определенно попытался использовать НодеЙС. Если вы знаете основы JS, это должно быть практически то же самое кривая обучения, которую вы получили бы с помощью ReactPHP (если не меньше, так как для узла доступно больше ресурсов, чем для ReactPHP).

 7
Author: Jhuliano Moreno, 2015-11-10 14:27:22

Создайте bash-скрипт linux и запустите его с PHP, используя exec или системную функцию.

 2
Author: kost, 2015-07-29 06:25:07