2010-01-21 37 views
0

我正在編寫一些處理項目隊列的代碼。它的工作方式是這樣的:如何打開多個套接字連接並在PHP中執行回調

  1. 獲得下一個項目標記爲需要 從MySQL的 數據庫行處理。
  2. 使用Curl從google API 請求一些信息,等到信息返回時返回 。
  3. 根據返回的信息執行處理 的其餘部分。
  4. 將項目標記爲在 db中處理,移至下一項。

問題是,在第2步。谷歌有時需要10-15秒才能返回請求的信息,在此期間我的腳本必須保持停止並等待。

我想知道如果我可以改變代碼來執行,而不是執行以下操作:

  1. 得到下一個5個項目要處理 如常。
  2. 索取信息從 項目1-5的谷歌,一個接一個。
  3. 當第1項的信息是 回來了,一個「回調」應該是 做它調用一個函數或 否則調用一些代碼,然後 做處理 對項目1-5的剩餘部分。
  4. 然後腳本從 開始,直到db中的所有待處理項目都標記爲 已處理。

怎麼能這樣做呢?

回答

2

您可以將其拆分爲2種流程類型。

  1. 工作進程(其中還有不少運行):知道正在處理的數據庫行,使得並等待谷歌的API調用,然後做這項工作,並將結果保存到數據庫中。 (一個也是唯一的):週期性地(比如每隔幾秒)檢查是否有工作要做,並確保有N個(5個或其他最佳的)工作人員在運行。如果少於N個工人正在運行,則啓動更多工人(使用exec)將其保留N,直到完成所有工作。

1

我真的不知道,如果這是一個優雅的方法,但在理論上,你可以使用fork()到餐桌的PHP程序的每個項目。這將允許所有代碼在一個文件中。

// Get items from DB 
$items = get_items_from_db(); 
foreach($items as $item) { 
    $pid = pcntl_fork(); 
    if($pid == -1) die("Couldn't fork!"); 
    if(!$pid) { 
     // Process the item in the child process 
     process_item($item); 
     exit(); 
    } 
} 
// Wait for all child processes to end 
pcntl_wait(); 
// We're done! 

但是,是的,這個解決方案將最有可能讓一些人尖叫;)

1

我想你可以創建一個主腳本,將調用同一臺機器上一個孩子的腳本爲特定的項目。子腳本將發送請求到谷歌API並相應地工作。

相關問題