2015-07-29 11 views
11

Tôi đang chuyển các tệp lớn (1gb +) từ Dropbox sang YouTube và muốn thông báo cho người dùng biết thời gian giao dịch có lẽ sẽ mất. Có phương tiện nào để đo lưu lượng mạng trong PHP không?Đo băng thông mạng trong PHP

Tôi đã tìm thấy giải pháp cho vỏ linux (How to measure network performance (how to benchmark network protocol)) nhưng không cho PHP.

Ngoài việc thông báo cho người dùng, tôi muốn kiểm tra băng thông được đảm bảo (100 mbit/s) khi tôi gặp sự cố mạng (băng thông quá thấp) một vài lần.

+0

Vì vậy, bạn muốn cung cấp phản hồi trực tiếp về tiến trình (có thể là tốc độ, còn lại kb, v.v ...) không? Bởi vì tôi nghĩ ReactPHP sẽ là công cụ phù hợp :) Nếu có, tôi có thể minh chứng một ví dụ nhỏ. Nếu không, nếu tất cả những gì bạn muốn là ước tính dựa trên tải trọng hiện tại, hãy làm những gì @kost nói và đừng đánh lừa nó;) –

Trả lời

7

Tôi không thực sự biết nếu bạn đang cố gắng ước tính hoặc đưa ra phản hồi "trực tiếp" cho người dùng.

Nếu bạn đang ước tính tôi nghĩ bạn chỉ có thể đi tuyến hệ điều hành và thực hiện "exec" (như @kost đề xuất) sẽ cho bạn biết tải hiện tại. Không cần phải lật đổ nó!

Vì vậy, hãy truy cập giải pháp trực tiếp trực tiếp :)!

Trước hết hãy xem ReactPHP (http://reactphp.org/) và sau đó thực hiện luồng của ReactPHP (https://github.com/reactphp/stream). Ý tưởng sẽ là tạo ra một luồng có thể đọc được nơi bạn sẽ đọc khối dữ liệu từ nguồn của bạn (DropBox?) Và như bạn làm, bạn sẽ tiếp tục tính toán thời gian còn lại và ghi nó vào và dòng ghi có thể một Web Socket chẳng hạn.

Dưới đây là một ví dụ nhỏ đọc từ một tập tin địa phương lớn, tính% và bằng văn bản cho 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(); 

Lưu ý rằng tất cả các bạn sẽ cần phải làm là thay đổi đầu vào của dòng có thể đọc được và đầu ra của dòng writabble.

Ngoài ra, bạn có thể dẫn luồng có thể đọc được vào tệp (sau này bạn tải lên youtube) hoặc thậm chí tốt hơn nếu youtube cho phép, chỉ cần đưa nó lên youtube (điều đó thật tuyệt vời: D).

EDIT thêm một số ý kiến ​​của tôi cho visibility:

từ ReactPHP về cơ bản là một bản sao không biết xấu hổ của NodeJS, khái niệm về mã và ý tưởng tôi đã đăng có thể dễ dàng được thực hiện trong NodeJS (mã thậm chí sẽ giống nhau). Với điều này tôi không cố gắng để nói ReactPHP là tồi tệ hơn hoặc tốt hơn :) Tôi chỉ nghĩ rằng bạn có thể đạt được cùng một kết quả với Node và tài liệu của họ là WAY tốt hơn, với ReactPHP bạn sẽ thấy mình đào sâu vào mã để tìm thứ ngoài.

Tôi nghĩ cốt lõi của ReactPHP là đủ ổn định nhưng tôi hiểu mối quan tâm của bạn . Điều đó đang được nói, Nếu tôi, nơi bạn chắc chắn tôi sẽ cố gắng sử dụng NodeJS. Nếu bạn biết những điều cơ bản của JS nó thực tế là cùng một đường cong học tập bạn sẽ có với ReactPHP (nếu không ít hơn, vì có là nhiều tài nguyên hơn cho Node hơn ReactPHP).

+0

Cá nhân tôi không thích tuyến hệ điều hành, nó tạo ra sự phụ thuộc vào hệ điều hành và ngay sau khi bạn nhận được vào các tập lệnh bash bạn đang mở một hộp sâu IMHO. Đây là một giải pháp tuyệt vời giúp giữ mọi thứ bằng ngôn ngữ. Tôi đã không thử nó nhưng khái niệm là âm thanh. – edhurtig

+0

Ngoài ra: vì ReactPHP về cơ bản là một bản sao không biết xấu hổ của NodeJS, khái niệm về mã và ý tưởng tôi đã đăng có thể dễ dàng được triển khai trong NodeJS (mã này thậm chí phải giống nhau). Với điều này tôi không cố gắng để nói ReactPHP là tồi tệ hơn hoặc tốt hơn :) Tôi chỉ nghĩ rằng bạn có thể đạt được kết quả tương tự với Node và tài liệu của họ là WAY tốt hơn, với ReactPHP bạn sẽ thấy mình đào vào mã để tìm ra. –

+0

@JhulianoMoreno: Piping nó là chính xác những gì chúng tôi đang làm: http://boxconnect.org (Dropbox to YouTube). Tôi sẽ xem xét React. Cảm ơn rất nhiều. – Jan

2

Tạo tập lệnh bash linux và chạy nó từ PHP bằng cách sử dụng chức năng exec hoặc system.

+0

Điều này tất nhiên là có thể nhưng tôi đang tìm kiếm một giải pháp PHP thuần túy. – Jan

Các vấn đề liên quan