Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中使用前台请求的分布式处理系统_Php_Background Process_Resque - Fatal编程技术网

在PHP中使用前台请求的分布式处理系统

在PHP中使用前台请求的分布式处理系统,php,background-process,resque,Php,Background Process,Resque,我熟悉处理后台作业的php resque和其他作业处理系统,但我认为它不能满足我的需要 在本例中,我有一个传入的web服务请求,它需要执行多个(2-4个)到外部系统的独立调用,并返回给客户端一个统一的响应。每个调用可能需要300-500毫秒,因此我希望并行执行每个调用,以便整个过程总共不超过500毫秒+/- 我在使用php resque和其他系统时遇到的问题是,等待一秒钟就开始发出这些调用太长了,我正在考虑另一种方法 我在想: 每个单独的标注都用给定的唯一请求ID进行描述并存储在数据库中 我们立

我熟悉处理后台作业的php resque和其他作业处理系统,但我认为它不能满足我的需要

在本例中,我有一个传入的web服务请求,它需要执行多个(2-4个)到外部系统的独立调用,并返回给客户端一个统一的响应。每个调用可能需要300-500毫秒,因此我希望并行执行每个调用,以便整个过程总共不超过500毫秒+/-

我在使用php resque和其他系统时遇到的问题是,等待一秒钟就开始发出这些调用太长了,我正在考虑另一种方法

我在想:

  • 每个单独的标注都用给定的唯一请求ID进行描述并存储在数据库中
  • 我们立即将作业作为一个异步php进程(也称为“工作进程”)启动
  • 每个工作人员将其结果写回作业记录,并指示其已完成
  • 同时,我们每50-100毫秒轮询一次作业表,以检查每个作业的状态
  • 当每个都完成时,我们根据需要解析结果并返回响应
  • 当然,我们会为每个请求和整个过程实现一个超时


    想法?我错了吗?php resque是否可以立即并行启动多个作业?

    您的计划应该可行,但我认为您可以通过使用

  • 按照并行运行所需的任务次数来分叉主进程。见:
  • 在这些分叉流程中执行任务,并让它们正常退出
  • 启动任务的过程应该在任务退出时监听它们的SIGCHLD信号,等待它们全部完成。或者,如果他们在您选择的超时之前没有,则向他们发送SIGTERM信号以进行清理。见:和
  • 但是,您必须在PHP CLI脚本中使用这些函数,因为

    不应在web服务器环境中启用进程控制 如果任何过程控制功能被禁用,则可能会出现意外结果 在web服务器环境中使用


    但是您的web服务器可以轻松地
    exec()
    您的CLI脚本,它将完成所有繁重的工作,返回这些任务的状态,等等。

    如果您的外部调用只是HTTP请求,您可以简单地使用curl并执行多个请求。它们似乎正是你所需要的

    如果有什么不同,我可以强烈推荐


    如果您想弄脏自己的双手并编写自己的守护进程,我建议跳过IPC函数,选择更高级别的函数,例如,如果PHP进程死掉,可以使用它来重新启动PHP进程。编写长时间运行的PHP进程相对比较困难,因此在构建过程中必须考虑外部脚本将随机消亡的概念,并准备优雅地处理这些问题。

    看一看。调用是什么?HTTP请求?