【问题标题】:How to open multiple socket connections and do callbacks in PHP如何在 PHP 中打开多个套接字连接并进行回调
【发布时间】:2011-01-07 15:07:21
【问题描述】:
我正在编写一些处理项目队列的代码。它的工作方式是这样的:
- 获取标记为需要的下一个项目
从mysql处理
数据库行。
- 从 google API 请求一些信息
使用 Curl,等到信息
返回。
- 执行剩余的处理
根据返回的信息。
- 将项目标记为在
db,继续下一项。
问题在于,在第 2 步。Google 有时需要 10-15 秒才能返回请求的信息,在此期间我的脚本必须保持暂停并等待。
我想知道是否可以更改代码以执行以下操作:
- 获取接下来要处理的 5 个项目
像往常一样。
- 请求项目 1-5 的信息
谷歌,一个接一个。
- 当第 1 项的信息是
返回,“回调”应该是
done 调用一个函数或
否则调用一些代码,然后
完成剩余的处理
关于第 1-5 项。
- 然后脚本重新开始
直到 db 中的所有待处理项目都
标记为已处理。
这样的事情是如何实现的?
【问题讨论】:
标签:
php
sockets
curl
callback
【解决方案1】:
您可以将其拆分为 2 种流程类型。
-
工作进程(其中有很多正在运行):知道正在处理的数据库行,进行并等待 Google API 调用,然后执行工作,并将结果保存到数据库中。
调度程序(只有一个):定期(例如,每隔几秒)检查是否有工作要做,并确保有 N 个(5 个或任何最佳)工作人员在运行。如果少于 N 个正在运行的工作人员,则启动更多工作人员(使用exec)以保持 N 个工作,直到所有工作完成。
【解决方案2】:
我真的不知道这是否是一种优雅的方法,但理论上您可以使用 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!
但是是的,这个解决方案很可能会让一些人尖叫;)
【解决方案3】:
我认为您可以创建一个主脚本,该脚本将在同一台机器上为特定项目调用子脚本。子脚本将向 google API 发送请求并相应地工作。