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

rhu*_*uff 6 php background-process resque

我熟悉用于处理后台工作的php-resque和其他工作处理系统,但我不认为它会做我需要的工作.

在这种情况下,我有一个传入的Web服务请求,需要对外部系统执行多个(2-4)独立调用,并返回到客户端的综合响应.每个标注可能需要300-500ms,因此我希望每个标注并行执行,以便整个过程不超过500ms +/-总计.

我的php-resque和其他系统的问题是等待甚至1秒开始发出这些标注太长时间不能等待,我正在考虑另一种方法.

我在想什么:

  1. 描述每个单独的标注并将其存储在具有给定唯一请求ID的数据库中
  2. 我们立即开始作为异步php进程(也称为"工作进程")
  3. 每个工作人员将其结果写回作业记录并指示它已完成
  4. 同时,我们每50-100ms轮询一次工作表,以检查每项工作的状态
  5. 当每个完成后,我们会根据需要解析结果并返回响应.

当然,我们会为每个请求和整个过程实施超时...

思考?我错了吗?php-resque几乎可以立即启动多个并行工作吗?

jim*_*imp 2

您的计划应该可行,但我认为您可以通过使用PHP 进程控制函数来避免所有数据库通信甚至轮询。

  1. 分叉主进程的次数与您需要并行运行的任务的次数相同。请参阅:pcntl_fork
  2. 在这些分叉进程中执行您的任务并让它们正常退出。
  3. 启动任务的进程应该在任务退出时监听 SIGCHLD 信号,等待它们全部完成。或者,如果他们在您选择的超时之前没有这样做,则向他们发送 SIGTERM 信号以进行清理。请参阅:pcntl_sigtimedwaitposix_kill

不过,您必须在 PHP CLI 脚本中使用这些函数,因为...

http://www.php.net/manual/en/intro.pcntl.php

不应在 Web 服务器环境中启用进程控制,如果在 Web 服务器环境中使用任何进程控制功能,则可能会发生意外结果。

但是您的 Web 服务器可以轻松地exec()使用 CLI 脚本,该脚本将完成所有艰苦的工作,返回这些任务的状态等。