【发布时间】:2012-09-20 03:56:03
【问题描述】:
我正在运行一个需要处理一些“繁重工作”任务(从 30 秒到 3 分钟)的 webapp (php)。我知道它不是很重,但我不能让我的用户等待他们,所以我设置了一个内部 API,例如:http://localhost/process-picture/745884/,并将此操作存储在 MySQL 表中。
现在我想创建一个“进程”来获取那个 MySQL 表并执行最早的排队操作,一旦完成,它就会得到下一个,依此类推。
首先我想到了制作一个通过 cURL 调用系统的 PHP 脚本:
fetchOperation.php 连接到 DB 并获取操作的 URL 以通过 cURL 调用它。
每个操作:执行自己,然后从队列中删除自己并再次调用 (cURL) fetchOperation.php。
我觉得这个系统有点棘手,所以我想知道是否有(以及用哪种语言编写)任何方式来设置每 15 秒检查一次数据库的后台进程,并执行以下操作:
- 删除所有标记为
DONE的行。 - 检查是否有任何标记为
PROCESSING的行,如果有,则退出并等待接下来的15秒。 - 如果没有
PROCESSING行,则触发最旧的PENDING一个(FIFO 队列)。
这样我可以随时管理正在处理的内容,甚至控制服务器负载(例如,晚上最多允许拥有三个PROCESSING 项)。
抱歉解释了这么长,提前谢谢!
【问题讨论】:
-
提交到队列,并有一个 crontab 来解析队列工作。
-
这个进程是否必须在没有网络服务器调用的服务器上运行(例如 cron 脚本)?
-
Rows "marked as" 表示有一列包含此信息?您可以在发生这种情况的服务器中编写和运行脚本吗?
-
quinestor,是的,该表很简单:id_operation、url、status ... status 包含以前的值。顺便说一句,我使用的是亚马逊 ec2,所以我可以以 root 身份运行,使用脚本等。
标签: php linux process background amazon