Измерение полосы пропускания сети в PHP

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

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

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

Ответ 1

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

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

Итак, перейдите в live-решение:)!

Прежде всего, зайдите в 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).

EDIT добавляет некоторые мои комментарии для видимости:

так как ReactPHP - это в основном бесстыдная копия NodeJS, концепция код и идея, которую я опубликовал, могут быть легко реализованы в NodeJS (код должен выглядеть одинаково). С этим я не пытаюсь сказать ReactPHP хуже или лучше:) Я просто думаю, что вы можете добиться того же результат с Node, и их документация лучше, с ReactPHP вы обнаружите, что вы копаете в код, чтобы нарисовать материал.

Я думаю, что ядро ​​ReactPHP достаточно стабильно, но я понимаю ваш беспокойство. Сказанное: если я, где вы, я бы определенно попытался использовать NodeJS. Если вы знаете основы JS, это должно быть практически одинаковым вы будете иметь с ReactPHP (если не меньше, так как там больше ресурсов для Node, чем ReactPHP).

Ответ 2

Создайте linux bash - script и запустите его с PHP, используя exec или system.