2015-07-29 24 views
11

Przenoszę duże pliki (1 gb +) z Dropbox na YouTube i chcę poinformować użytkownika, ile czasu zajmie transakcja. Czy istnieje jakiś sposób pomiaru ruchu sieciowego w PHP?Zmierz pasmo sieciowe w PHP

Znalazłem rozwiązania dla powłoki linuksowej (How to measure network performance (how to benchmark network protocol)), ale nie dla PHP.

Oprócz informowania użytkownika, chcę sprawdzić gwarantowaną przepustowość (100 mbit/s), ponieważ kilka razy napotkałem problemy sieciowe (przepustowość zbyt niska).

+0

Chcesz więc przekazać informację o postępie na żywo (czy to szybkość, pozostały KB, itp.)? Ponieważ myślę, że ReactPHP byłby właściwym narzędziem :) Jeśli tak, mógłbym udowodnić mały przykład. W przeciwnym razie, jeśli chcesz tylko oszacować na podstawie aktualnego obciążenia, zrób to, co powiedział @kost i nie przemyśleć go;) –

Odpowiedz

7

Nie wiem, czy próbujesz zrobić oszacowanie lub przekazać użytkownikowi "żywą" informację zwrotną.

Jeśli robisz szacunek, myślę, że możesz po prostu pójść drogą OS i wykonać polecenie "exec" (jak zasugerowano @kost), które powie ci bieżące obciążenie. Nie trzeba go przemyśleć!

Więc, przejdźmy do live solution :)!

Przede wszystkim zajrzyj do ReactPHP (http://reactphp.org/), a następnie do implementacji strumieniowej ReactPHP (https://github.com/reactphp/stream).

Chodzi o to, aby stworzyć czytelny strumień, w którym będziesz czytał fragmenty danych ze swojego źródła (DropBox?), A gdy to zrobisz, będziesz obliczał pozostały czas i zapisywał go oraz zapisywalny strumień, który może być na przykład gniazdo sieciowe.

Oto mały przykład odczyt z dużego pliku lokalnego, obliczanie% i piśmie do 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(); 

pamiętać, że wszystkie trzeba by zrobić, to zmienić wejście w czytelnej Stream i wyjście strumienia pisywalnego.

Możesz również potokować czytelny strumień do pliku (który później prześlesz na youtube) lub nawet lepiej, jeśli youtube na to pozwoli, po prostu wyłóż go do youtube (to byłoby niesamowite: D).

EDIT dodając kilka moich uwag na widoczność:

od ReactPHP jest po prostu bezczelny kopia NodeJS pojęcie kod i pomysł napisałem może być łatwo realizowane w NodeJS (kod powinien wyglądać podobnie). Z tym nie próbuję powiedzieć ReactPHP jest gorszy lub lepszy :) Po prostu myślę, że możesz osiągnąć ten sam wynik z Węzłem, a ich dokumentacja jest DUŻO lepsza, z ReactPHP przekonasz się, że wkopiesz się w kod, by wymyślić coś na zewnątrz.

Myślę, że rdzeń ReactPHP jest wystarczająco stabilny, ale rozumiem Twój problem z numerem . Biorąc to pod uwagę, jeśli będę tam, to zdecydowanie spróbuję użyć NodeJS . Jeśli znasz podstawy JS, to powinna być praktycznie ta sama krzywa uczenia, którą miałbyś z ReactPHP (jeśli nie mniej, ponieważ tam jest więcej zasobów dla Node niż ReactPHP).

+0

Osobiście nie lubię trasy OS, tworzy ona zależność od systemu operacyjnego i jak tylko wejdziesz do skryptów Bash, otwierasz puszkę z robakami IMHO. To niesamowite rozwiązanie, które utrzymuje rzeczy w języku. Nie próbowałem tego, ale koncepcja jest dobra. – edhurtig

+0

Ponadto: ponieważ ReactPHP to po prostu bezwstydna kopia NodeJS, koncepcja kodu i pomysłu, który zamieściłem mogłaby być łatwo zaimplementowana w NodeJS (kod powinien wyglądać podobnie). Z tym nie próbuję powiedzieć, że ReactPHP jest gorszy lub lepszy :) Po prostu myślę, że możesz osiągnąć ten sam rezultat z Node, a ich dokumentacja jest DUŻO lepsza, z ReactPHP przekonasz się, że wkopiesz się w kod, żeby wymyślić coś. –

+0

@JhulianoMoreno: Piping to dokładnie to, co robimy: http://boxconnect.org (Dropbox na YouTube). Zajrzę do React. Wielkie dzięki. – Jan

2

Utwórz skrypt bash Linux i uruchom go z PHP przy użyciu funkcji exec lub system.

+0

Jest to oczywiście możliwe, ale szukałem czystego rozwiązania PHP. – Jan