2013-06-20 49 views
2

我試圖建立一種使用PHP和cURL擴展的基於web的下載管理器,但我仍然遇到了一個問題,我如何使用cURL下載和保存文件,而不必讓用戶等待,這意味着他將提出請求並在後臺處理。如何在PHP的後臺運行cURL請求?

現在我不能使用系統調用(exec,system ...等),因爲我使用的大多數主機都禁用了這些函數,另一個問題是PHP腳本的最大執行時間,但我想這個一個可以在.htaccess中改變或使用ini_set或不可以?

我讀過的地方,將connect_timeout設置爲1將工作,但不會終止連接?

一個解決方案是使用cronjobs,在用戶提交他想下載的文件後,cronjob會檢查數據庫,如果隊列中有文件,它會開始下載它,但我想我想盡可能避免使用cron作業。

所以回的主要問題,是有沒有辦法告訴PHP腳本在後臺運行一些特定的功能,無論提供該功能的結果給用戶的響應

感謝

回答

4

我認爲還有其他職位已經探索過這些選項。鑑於你的約束,我看其他兩種方法:

+0

我剛剛閱讀了你發佈的鏈接,這就是爲什麼我用粗體表示的問題,問題依然存在,這是否會終止連接?說我有一個大文件,我用cURL請求它,然後將超時設置爲1,請求被終止?,再加上使用JS意味着vvisitor將不得不保持打開頁面,直到下載完成爲止?如果他們關閉該頁面,下載將停止?我在這裏討論1 GB文件,所以它必須依賴於服務器,因爲訪問者不應該等待那麼長時間,他們會排隊文件並離開 –

+1

HTTP是一種無狀態協議,即沒有連接服務器會關心。它接收到一個請求並運行它應該執行的任何邏輯,直到完成爲止,然後發送響應。客戶是否仍然收到該響應並不重要。響應超時告訴客戶端等待響應需要多長時間,但與服務器上發生的情況無關。 – joerx

+0

感謝您的鏈接:) –

2
  1. 使從PHP簡單捲曲請求像下面或使用javascript

    $curl = curl_init('http://mutant-tech.com/execjob.php'); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
    $result = curl_exec($curl); 
    echo $result; // should get - Closing Curl Request 
    
  2. AJAX調用用頭在出發
  3. 關閉HTTP連接,後來寫PHP代碼。如果你需要更多的exec時間/內存執行

    // File - execjob.php START 
    ob_end_clean(); 
    header("Connection: close"); 
    ignore_user_abort(); 
    ob_start(); 
    echo ('Closing Curl Request'); 
    $size = ob_get_length(); 
    header("Content-Length: $size"); 
    ob_end_flush(); 
    flush(); 
    // BELOW YOUR BACKGROUND JOB/CODE 
    

,因此使用功能

1

我的經驗是要包裝你的命令正確。

$time = microtime(true); 
$command = '/usr/bin/curl -H \'Content-Type: application/json\' -d \'' . $curlPost . '\' --url \'' . $wholeUrl . '\' >> /dev/shm/request.log 2> /dev/null &'; 
exec($command); 
echo (microtime(true) - $time) * 1000 . ' ms'; 

以上適合我的工作,只需要3ms,但以下將無法工作,需要1500ms。

$time = microtime(true); 
$command = '/usr/bin/curl -H \'Content-Type: application/json\' -d \'' . $curlPost . '\' --url ' . $wholeUrl; 
exec($command . ' >> /dev/shm/request.log 2> /dev/null &'); 
echo (microtime(true) - $time) * 1000 . ' ms'; 

總體而言,加入「&>的/ dev/null的&」你的命令到底能使其在後臺運行,不掛PHP和Apache的過程,只記得妥善包裝您的命令。