排队PHP进程

排队PHP进程,php,shell-exec,Php,Shell Exec,我的服务器中有以下两个文件 requests.php(控制器)-接收传入请求并在后台执行process\u query.php process\u query.php-包含一个脚本,该脚本调用C可执行文件(使用shell\u exec)以针对一定数量的文件运行,并将一些信息写入数据库 现在,只要服务器在控制器中接收到请求,它就会立即在后台触发process\u query.php脚本。如果传入请求太多,可能会导致服务器CPU中断。因此,我计划对可以在特定时刻运行的process\u query.

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

  • requests.php
    (控制器)-接收传入请求并在后台执行
    process\u query.php
  • process\u query.php
    -包含一个脚本,该脚本调用
    C
    可执行文件(使用
    shell\u exec
    )以针对一定数量的文件运行,并将一些信息写入数据库
  • 现在,只要服务器在控制器中接收到请求,它就会立即在后台触发
    process\u query.php
    脚本。如果传入请求太多,可能会导致服务器CPU中断。因此,我计划对可以在特定时刻运行的
    process\u query.php
    进程的数量进行最大限制。例如,我们假设最大限制为4,这意味着一次只能运行4个
    process\u query.php
    实例,其他实例在4个进程中的一个进程完成之前无法启动

    我尝试通过一个带有
    request\u id
    的表和一个
    标志来指示流程完成状态来实现这一点。如果现在有4个请求正在运行,那么表中将有4个条目,每个条目的状态
    flag
    0

    当一个新请求到达时,
    process\u query.php
    脚本运行到一个无限循环中,如下面的代码所示,并在数据库中检查当前运行的进程总数。因为根据我们的场景是4,所以脚本进入睡眠状态(例如
    10s
    )。循环每隔10秒执行一次,直到其中一个过程完成。当条件满足时,脚本退出循环并执行
    C
    调用。在实现这一点之后,我希望我的活动监视器只显示4个正在运行的进程。不太可能有n个(请求总数)进程在运行,因为无限循环使
    process\u query.php
    进程滴答作响。这对我来说很有意义

    process\u 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 
    

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

    您应该使用像
    gearman
    这样的工作经理

    说明:

    • 有一个作业服务器,包含要执行的作业列表
    • 工作者
      ,他们是注册到该服务器以处理作业的程序
    • 客户端
      ,它们是请求使用某些参数完成作业的程序
    假设您有一个作业服务器,您必须编写:

    • 工作者:
      myworker.php
      在其中调用process\u query.php,并注册到作业“process\u query”
    • 客户机:在requests.php中,您可以调用一些参数来启动作业“process\u query”
    然后,您将启动myworker.php 5次(在后台),因此您最多有5个作业在处理中,其他作业将等待一个可用的工作


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

    谢谢你让我知道gearman的事。我希望在长期的基础上实现它,因为我现在在服务器上没有足够的权限安装它。是否有一个以
    PHP
    为中心的解决方案,而不安装任何外部软件包?bcoz我需要在未来两天左右完成并运行它。sql解决方案中的问题是无法保证$max_request_limit将==to req count。您必须使用>=但可能有很多请求。另一种方法是使用“文件互斥”,这里有一个实现,它允许您创建一个文件,当您完成时,它被删除,然后第二个进程现在创建文件并执行其代码,等等。。