2010-01-21 33 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并相应地工作。

相关问题