Я передаю большие файлы (1 ГБ +) из Dropbox на YouTube и хочу сообщить пользователю, сколько времени, по-видимому, займет транзакция. Есть ли способы измерения сетевого трафика в PHP?
Я нашел решения для оболочки Linux (Как измерить производительность сети (как оценить сетевой протокол)) но не для PHP.
Кроме того, чтобы проинформировать пользователя, я хочу проверить гарантированную пропускную способность (100 Мбит / с), поскольку пару раз сталкивался с проблемами в сети (слишком низкая пропускная способность).
Я действительно не знаю, пытаетесь ли вы сделать оценку или дать «живой» отзыв пользователю.
Если вы выполняете оценку, я думаю, вы можете просто пойти по пути ОС и выполнить «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 достаточно стабильно, но я понимаю ваше
беспокойство. Тем не менее, если бы я, где вы, я бы определенно попытался использовать
NodeJS. Если вы знакомы с основами JS, это должно быть практически одинаково
Кривая обучения вы бы с ReactPHP (если не меньше, так как там
для Node больше ресурсов, чем для ReactPHP).