排队PHP进程

时间:2016-01-01 01:03:52

标签: php shell-exec

我的服务器中有以下两个文件

  1. requests.php(控制器) - 接收传入的请求并在后台执行process_query.php
  2. process_query.php - 包含一个脚本,该脚本调用C可执行文件(使用shell_exec)对一定数量的文件运行并将一些信息写入数据库。
  3. 现在,只要服务器在控制器中收到请求,它就会立即在后台触发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 
    

    我应该采用哪种方法来实现这一目标?

1 个答案:

答案 0 :(得分:2)

您应该使用像gearman这样的职位经理。

说明:

  • 有一个作业服务器,其中包含要执行的作业列表
  • workers,这是为了处理工作而注册到该服务器的程序
  • clients,这是要求使用某些参数完成作业的程序。

想象一下,你有一个工作服务器,你必须写:

  • 一个工人:myworker.php,你在其中调用process_query.php,然后注册到工作' process_query'
  • 客户:在requests.php中,您拨打电话以启动作业' process_query'有一些参数

然后你将启动myworker.php 5次(在后台),所以你最多有5个工作正在进行中,其他工作将等到一个工人可用。

您可以以异步方式从requests.php启动作业,或者使用同步方式(等到作业结束)。