我的服务器中有以下两个文件
requests.php
(控制器) - 接收传入的请求并在后台执行process_query.php
。 process_query.php
- 包含一个脚本,该脚本调用C
可执行文件(使用shell_exec
)对一定数量的文件运行并将一些信息写入数据库。现在,只要服务器在控制器中收到请求,它就会立即在后台触发process_query.php
脚本。如果传入请求太多,可能会导致服务器CPU中断。所以我计划最多。限制可以在特定时刻运行的process_query.php
进程数。举个例子,让我们假设最大值。 limit为4,表示一次只能运行4个process_query.php
个实例,而其他实例只有4个进程中的一个完成才能启动。
我尝试通过提供一个包含request_id
&{39}和flag
的表格来表明流程完成状态。如果现在有4个请求正在运行,那么该表将有4个状态为flag
的条目,每个条目为0
。
当新请求到达时,process_query.php
脚本将进入无限循环,如下面的代码所示,并在数据库中检查此刻运行的进程总数。由于根据我们的场景它是4,因此脚本进入睡眠状态(例如10s
)。循环继续为每个10s
执行,直到其中一个进程完成。满足条件时,脚本将退出循环并执行C
调用。实现之后,我希望我的活动监视器只显示4个正在运行的进程。不太可能有n个(请求总数)进程正在运行,因为无限循环保持process_query.php
进程滴答作响。这对我来说很有意义。
process_query.php
while(1) {
$req_count = execute("SELECT count(status) FROM `requests` WHERE status=0");
if($req_count == $max_request_limit) {
sleep(10);
continue;
}
break;
}
// ...code to execute the C script
// end of process_query.php
我应该采用哪种方法来实现这一目标?
答案 0 :(得分:2)
您应该使用像gearman
这样的职位经理。
说明:
workers
,这是为了处理工作而注册到该服务器的程序clients
,这是要求使用某些参数完成作业的程序。想象一下,你有一个工作服务器,你必须写:
myworker.php
,你在其中调用process_query.php,然后注册到工作' process_query' 然后你将启动myworker.php 5次(在后台),所以你最多有5个工作正在进行中,其他工作将等到一个工人可用。
您可以以异步方式从requests.php启动作业,或者使用同步方式(等到作业结束)。