2011-11-30 60 views
1

在我的代碼中,我使用curl_exec向另一個頁面發送請求。我不需要腳本其餘部分的curl_exec結果,我不希望它在curl_exec請求完成並收到響應之前阻止。分叉一部分的PHP代碼

任何想法,如果我可以叉腳本的特定部分?

或其他任何設計思路......?

回答

2

這裏有一些想法:

  • 使用curl_multi,並在請求的最後接近捲曲。你甚至可以做到這一點「關機後」
  • 使用工作的腳本,利用例如「Gearman的」

或者:

  • 你可以異步使用libevent的擴展手動打開插座,並處理的東西
0

PHP不支承實

function curl_post_async($url, $params) 
{ 
    foreach ($params as $key => &$val) { 
    if (is_array($val)) $val = implode(',', $val); 
     $post_params[] = $key.'='.urlencode($val); 
    } 
    $post_string = implode('&', $post_params); 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_USERAGENT, 'curl'); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 1); 
    $result = curl_exec($ch); 
    curl_close($ch); 
} 

來自:T叉子和線程,但你可以通過設置響應超時擺脫響應How to post an asynchronous HTTP request in PHP

隨着CURL documentation,您可以使用CURLOPT_TIMEOUT_MS自PHP 5.2.3和捲曲7.16 0.2。

+0

這仍然會阻止至少一秒 –

1

您是否需要cURL請求的回覆?

首先,你需要fork的pcntl函數通常是一個壞主意。

一種方法是將cURL代碼放置在一個單獨的腳本和exec()腳本中,以便它在後臺運行。

$command = "php ..../wherever/your/kohana/cli/controller/is.php"; 
exec('php /path/to/curlscript.php > /dev/null &'); 

1.4.3到/ dev/null的&允許腳本在後臺繼續運行。

或者,也許更好的解決方案是實現隊列系統,如Gearman或RabbitMQ。

+0

聽起來像是個好主意。我的問題是,當我不使用&時從命令行執行腳本時,腳本工作正常。但是,當添加失敗。有任何想法嗎? – Henrik

+0

'&'告訴終端不要等待迴應。至於爲什麼它不工作......很好的問題。您是否有權訪問終端,以便您可以在PHP之外進行嘗試?此外,如果這是要經常執行的事情,例如由於面向公衆的頁面,在這種情況下實現隊列系統會更好。 – simshaun

+0

是的,我從控制檯做到了,我也遇到了同樣的問題。我用「php test.php> log.txt」實現了一個簡單的腳本,它工作正常。該腳本只做了一個回聲「你好」;。當我添加&我沒有得到任何log.txt。奇怪的indeeed。 – Henrik