2010-02-11 29 views
4

我使用curl_multi函數來請求多個URL並在它們完成時處理它們。當一個連接完成時,我真正擁有的是來自curl_multi_info_read()的cURL句柄(和相關數據)。將cURL句柄作爲數組鍵使用

URL來自作業隊列,一旦處理完成,我需要從隊列中刪除作業。我不想依靠URL來識別工作(不應該是是重複的URL,但如果)。

到目前爲止我所做的解決方案是使用cURL句柄作爲指向jobid的數組鍵。形式我可以告訴,當被視爲一個字符串時,句柄是類似的:

"Resource id #1" 

這接縫對我來說合理獨特。基本代碼:

$ch = curl_init($job->getUrl()); 
$handles[$ch] = $job; 
//then later 
$done = curl_multi_info_read($master); 
$handles[$done['handle']]->delete(); 
curl_multi_remove_handle($master, $done['handle']); 

是捲曲處理安全以這種方式使用?

或者還有更好的方法來將cURL句柄映射到創建它們的作業嗎?

回答

2

它可能會工作得益於一些隱式類型轉換,但它根本不適合我。我認爲這是乞求尋找麻煩的地方,未來的版本對待不同的資源,不同的平臺...

我個人不會這樣做,但使用數字索引。

+0

但是對於數字索引,我仍然需要以某種方式將原始作業映射到cURL句柄。你認爲array_search($ ch,$ jobs)會起作用嗎? –

+0

@Tim我不知道,你必須嘗試......確實,你必須用數字索引以某種方式映射原始作業,但是IMO值得付出努力。 '陣列[$ ch]'聞起來非常邪惡! –

2

我不得不同意佩卡...它可能會工作,但它聞起來不好。 id使用直線整數作爲Pekka建議或包裝在一個簡單的類的句柄,然後使用spl_object_hash或讓它的構造函數生成uniqid設置時。

+1

不確定在類中包裝句柄有幫助,因爲我從curl_multi_info_read()返回的所有內容都是[unwrapped]句柄。 –

+0

是的,我想你也必須爲curl_multi功能做一個包裝。 – prodigitalson

+3

這沒有什麼意義。我在這個相同的問題,所以創建一個包裝將仍然留給我們的問題,我們唯一擁有的是句柄。這個想法是我們希望使用某種哈希映射進行O(1)查找。但是,根據資源獲取關鍵值的最佳方式是什麼?當然......'喲,我收到了一個包裝材料,讓你可以在包裝的時候包裝。' –

6

將私密數據存儲在cURL簡單句柄中,例如某些職位ID:

curl_setopt($ch, CURLOPT_PRIVATE, $job->getId()); 
// then later 
$id = curl_getinfo($done['handle'], CURLINFO_PRIVATE); 

此「私人數據」功能尚未記錄在PHP手冊中。它已經在PHP 5.2.4中引入。它允許您在cURL句柄內存儲和檢索您選擇的字符串。將它用作唯一標識作業的密鑰。

編輯:功能現在在PHP手冊中documented(在頁面內搜索CURLOPT_PRIVATE)。

+0

我不知道爲什麼它不是公認的答案。這是一個可行的解決方案(我已經測試過),其他答案只能說明有什麼問題... – Sergi

+0

做的工作,非常好! :) – Sol