2015-07-29 16 views
11

Sto trasferendo file di grandi dimensioni (1gb +) da Dropbox a YouTube e desidero informare l'utente sul tempo presumibile che la transazione prenda. C'è qualche mezzo per misurare il traffico di rete in PHP?Misurare la larghezza di banda di rete in PHP

Ho trovato soluzioni per la shell linux (How to measure network performance (how to benchmark network protocol)) ma non per PHP.

Oltre a informare l'utente, desidero controllare la larghezza di banda garantita (100 Mbit/s) mentre corro in problemi di rete (larghezza di banda troppo bassa) un paio di volte.

+0

Quindi, si desidera fornire un feedback in tempo reale sul progresso (che si tratti di velocità, restante kb, ecc.)? Perché penso che ReactPHP sarebbe lo strumento giusto :) Se sì, potrei provare un piccolo esempio. Altrimenti, se tutto ciò che vuoi è di fare una stima in base al carico corrente, fai quello che @kost ha detto e non pensarlo troppo) –

risposta

7

Non so davvero se si sta tentando di fare un preventivo o di fornire un feedback "live" all'utente.

Se si sta facendo una stima, penso che si può semplicemente andare al percorso del sistema operativo e fare un "exec" (come @kost suggerito) che vi dirà il carico corrente. Non c'è bisogno di pensarlo troppo!

Quindi, passiamo alla soluzione live :)!

Prima di tutto, dare un'occhiata a ReactPHP (http://reactphp.org/) e quindi all'implementazione dei flussi di ReactPHP (https://github.com/reactphp/stream).

L'idea sarebbe quella di creare un flusso leggibile in cui si possano leggere blocchi di dati dalla fonte (DropBox?) E, come si fa, si continuerà a calcolare il tempo rimanente e lo si scrive e il flusso scrivibile che potrebbe essere un Web Socket per esempio.

Ecco un piccolo esempio la lettura da un grande file locale, calcolando il% e iscritto al 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(); 

Nota che tutto quello che avrebbe bisogno di fare è cambiare l'ingresso del flusso leggibile ed il output del flusso writabble.

Inoltre, è possibile reindirizzare il flusso leggibile a un file (che in seguito verrà caricato su youtube) o, meglio ancora, se lo consente lo youtube, basta collegarlo a YouTube (sarebbe fantastico: D).

EDIT l'aggiunta di alcuni dei miei commenti per la visibilità:

dal ReactPHP è sostanzialmente una copia spudorata di NodeJS, il concetto di il codice e l'idea che ho postato potrebbe essere facilmente essere implementato in NodeJS (il codice dovrebbe anche assomigliarsi). Con questo non sto cercando di dire ReactPHP è peggio o meglio :) Penso solo che tu possa ottenere lo stesso risultato con Node e la loro documentazione sia MOLTO migliore, con ReactPHP ti troverai a scavare nel codice per capire cose su.

Penso che il core di ReactPHP sia abbastanza stabile ma capisco il vostro problema . Detto questo, se dovessi provare a usare il nostro NodeJS. Se conosci le nozioni di base di JS, dovrebbe essere praticamente la stessa curva di apprendimento che avresti con ReactPHP (se non di meno, dal momento che lo è più risorse là fuori per Node che ReactPHP).

+0

Personalmente non mi piace il percorso del sistema operativo, esso crea una dipendenza dal sistema operativo e non appena si arriva agli script di bash si sta aprendo una lattina di worm IMHO. Questa è una soluzione fantastica che mantiene le cose nella lingua. Non l'ho provato ma il concetto è valido. – edhurtig

+0

Inoltre: dal momento che ReactPHP è fondamentalmente una copia spudorata di NodeJS, il concetto del codice e dell'idea che ho postato potrebbe essere facilmente implementato in NodeJS (il codice dovrebbe anche apparire simile). Con questo non sto cercando di dire che ReactPHP è peggio o meglio :) Penso solo che tu possa ottenere lo stesso risultato con Node e che la loro documentazione sia MOLTO migliore, con ReactPHP ti troverai a scavare nel codice per capire cosa succede. –

+0

@JhulianoMoreno: Piping è esattamente quello che stiamo facendo: http://boxconnect.org (Dropbox to YouTube). Guarderò su React. Molte grazie. – Jan

2

Creare uno script di bash linux ed eseguirlo da PHP utilizzando la funzione exec o system.

+0

Questo è ovviamente possibile ma stavo cercando una soluzione PHP pura. – Jan

Problemi correlati