2012-06-19 20 views
1

我需要做的是使用PHP處理數據庫中未決的多個請求。使用CURL與cronjob進行PHP多處理

我目前想要做的是: 當我的cronjob運行。我想立即調用一個文件「process_a.php」10次,而不用等待它完成處理(process_a.php可能需要幾分鐘)。

我試圖用CURL來做到這一點。但是,當我的cronjob調用process_a.php時,它會等待它完成處理並在調用另一個process_a.php文件之前返回。

我甚至試着把process_a.php中的代碼立即關閉連接,然後在後臺繼續處理。但cronjob仍然等待它完成。

我只想同時執行10次相同的文件,如果有10個不同的用戶請求我的網站的index.php頁面... 任何想法!?

+0

http://php.net/manual/en/function.curl-multi-exec.php – Brad

回答

2

正如@Brad捲曲多高管告訴應該是一種選擇。

http://php.net/manual/en/function.curl-multi-exec.php

<?php 
//create the multiple cURL handle 
$mh = curl_multi_init(); 

// create both cURL resources 
for($i = 0; $i < 10;$i++){ 
    $ch[$i] = curl_init(); 
    curl_setopt($ch[$i], CURLOPT_URL, "http://urhost//path/to/process_a.php"); 
    curl_setopt($ch[$i], CURLOPT_HEADER, 0); 
    curl_multi_add_handle($mh,$ch[$i]);//add the handles 
} 

$active = null; 

//execute the handles 
do { 
    $mrc = curl_multi_exec($mh, $active); 
} while ($mrc == CURLM_CALL_MULTI_PERFORM); 

while ($active && $mrc == CURLM_OK) { 
    if (curl_multi_select($mh) != -1) { 
     do { 
      $mrc = curl_multi_exec($mh, $active); 
     } while ($mrc == CURLM_CALL_MULTI_PERFORM); 
    } 
} 

//close the handles 
for($i = 0; $i < 10;$i++){ 
    curl_multi_remove_handle($mh, $ch[$i]); 
} 
curl_multi_close($mh); 

?> 

我通過調用下面的另一個腳本測試這個腳本:

<?php 
print microtime();//Return current Unix timestamp with microseconds 
print '<br>'; 
?> 

和這裏的結果,每個處理由執行時間微秒不同。

0.27085300 1340214659 
0.44853600 1340214659 
0.46611800 1340214659 
0.48201000 1340214659 
0.50209400 1340214659 
0.48233900 1340214659 
0.52274300 1340214659 
0.54757800 1340214659 
0.57316900 1340214659 
0.59475800 1340214659 
+0

我會試試看,謝謝代碼。 –

+0

當我在自己的服務器上請求文件時,它仍然一次調用第1頁... –

+0

您給出的路徑是什麼?如果您提供完整的URL,http://localhost/path/to/script.php,它將如何知道這是否是同一臺服務器?此外,測試方法是通過在process_a.php頂部打印以毫秒爲單位的時間,然後您可以檢查頁面是否一次調用一次。 –

2

叉到10的過程:

<?php 
for($i = 0; $i < 10;$i++){ 
    $pid = pcntl_fork(): 
    if ($pid == -1) { 
      trigger_error('could not fork'); 
    } else if (!$pid) { 
      //we are the child now 
      require 'process_a.php'; 
    } else { 
     // we are the parent, you could do something here if need be. 
    } 
} 

...但process_a.php可以做任何你的網站呢,所以,而不是調用一個網頁,爲什麼不這樣做實際的工作會導致頁面請求在?讓Web服務器繼續成爲一個Web服務器,而不是一個臃腫的腳本回購。

+0

pcntl_fork默認情況下不可用。你覺得值得安裝嗎?如果我有7個不同的文件,我想每次打電話10次,這會工作嗎? –

+0

我正在使用CURL,因爲處理邏輯可能在某個點上位於不同的服務器上。 –

+0

我有_never_看到一個服務器,它具有cronjobs,但沒有'pcntl_fork'的能力。如果你需要單獨安裝,是的,我會說這是值得的。如果你需要10×7個不同的文件,當然,這也可以工作(但是,分叉70次)。 – Wrikken

1

您是否擁有完整的cron,或者您只能指定php文件?

您可能能夠使用xargs的叉10點的過程與-P參數

seq `1 10`|xargs -n1 -P10 php /path/to/file.php 
+0

這是什麼意思/做什麼? 你是說我應該把這個,而不是調用我的cronjob.php?我需要運行cronjob.php來決定此時應處理的請求。 –