PHP獲取curl傳輸進度

curl上傳或者下載,有以下2個選項:

CURLOPT_NOPROGRESS => false,
CURLOPT_PROGRESSFUNCTION => 'callback',

CURLOPT_NOPROGRESS:是否關閉傳輸進度,默認是true。

CURLOPT_PROGRESSFUNCTION:回調函數,curl傳輸過程中,會每隔一段時間自動調用該函數。我測試過,間隔不到1秒,具體不知道。官方的註釋是這樣:設置一個回調函數,有五個參數,第一個是cURL的資源句柄,第二個是預計要下載的總字節(bytes)數。第三個是目前下載的字節數,第四個是預計傳輸中總上傳字節數,第五個是目前上傳的字節數。
(注意回調函數的命名空間。如:CURLOPT_PROGRESSFUNCTION => ‘namespace_xxx\callback’)

設置完成後,需要定義回調函數:

function callback($resource, $downloadSize = 0, $downloaded = 0, $uploadSize = 0, $uploaded = 0)
{
    // php5.5之前的參數是不同的,所以要考慮到兼容性
    if (version_compare(PHP_VERSION, '5.5.0') > 0) {
        $info = array(
            'downloadSize' => $downloadSize,
            'downloaded'   => $downloaded,
            'uploadSize'   => $uploadSize,
            'uploaded'     => $uploaded,
        );
    } else {
        $info = array(
            'downloadSize' => 0,
            'downloaded'   => 0,
            'uploadSize'   => $downloaded,
            'uploaded'     => $uploadSize,
        );
    }

    S('file_upload_' . session('user_auth.uid'), $info, 300); // 可以將結果存放到緩存(這裏是ThinkPHP例子)
} 

重要:
在curl發起請求時,如果開啓了session,會獨佔session,阻塞其他的請求。所以如果框架默認啓用了session,在curl之前可以用session_write_close()函數關閉session阻塞。
參考:http://www.cnblogs.com/skillCoding/archive/2012/04/09/2439296.html

最後:在進行傳輸時,可以每隔1秒通過ajax來獲取緩存信息,從而顯示傳輸進度。

補充:
傳送大文件時,php會超時,注意設置php-fpm.conf中的request_terminate_timeout值,我設了1000(秒)。
還有個max_children(進程數) ,進程不夠用可改大。
在程序中,可以使用set_time_limit()臨時增加php響應時間。
php.ini中還有max_execution_time設置,看攻略說是跟 set_time_limit累加的,如果攻略是對的,那麼這個不用管。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章