gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:26:42 26 4
gpt4 key购买 nike

我熟悉 php-resque 和其他用于处理后台作业的作业处理系统,但我认为它无法满足我的需要。

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

我对 php-resque 和其他系统的问题是,即使等待 1 秒才能开始发出这些标注也太长了,我正在考虑另一种方法。

我在想什么:

  1. 每个单独的标注都被描述并存储在具有给定的唯一请求 ID 的数据库中
  2. 我们以异步 php 进程(又名“工作进程”)的形式立即启 Action 业
  3. 每个 worker 将其结果写回作业记录并表明它已完成
  4. 同时,我们每 50-100 毫秒轮询一次作业表,以检查每个作业的状态
  5. 当每个完成时,我们根据需要解析结果并返回响应。

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

想法?我错了吗? php-resque 能否几乎立即并行启动多个作业?

最佳答案

你的计划应该可行,但我认为你可以通过使用 PHP Process Control functions 来避免所有的数据库通信甚至轮询。 .

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

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

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

Process Control should not be enabled within a web server environment and unexpected results may happen if any Process Control functions are used within a web server environment.

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

关于php - 在 PHP 中使用分布式处理系统处理 FOREGROUND 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12722245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com