如何从 PHP-FPM 向 ReactPHP/Amp/Swoole/等发送消息?



我正在考虑制作一个worker脚本来处理服务器上的异步任务,使用ReactPHP,Amp或Swoole等框架,这些框架将作为服务永久运行(我还没有在这些框架之间做出选择,因此涉及其中任何一个的解决方案都是有帮助的(。

我的 Web 端点仍将像往常一样由 Apache + PHP-FPM 管理,我希望它们能够将消息发送到永久运行的脚本,以使其知道异步作业已准备好尽快处理。

来自 Web 终结点的伪代码:

$pdo->exec('INSERT INTO Jobs VALUES (...)');
$jobId = $pdo->lastInsertId();
notify_new_job_to_worker($jobId); // how?

您通常如何处理从 PHP-FPM 到这些框架中永久运行的脚本的通信?您是否设置了TCP/Unix套接字服务器并实现了自己的消息传递协议,或者是否有现成的解决方案来解决此问题?


注意:如果您想知道,我不打算使用第三方消息队列软件,因为我希望将异步作业存储为数据库事务的一部分(要么整个事务成功,包括提交挂起的作业,要么整个事务被丢弃(。这是我不会失去工作的保证。如果在最坏的情况下,无法将消息发送到正在运行的服务,则以后仍可能从数据库中检索错过的作业。

如果你的工作线程作为服务"永久运行",它应该提供一些 API 来交互。我在项目中使用 AmPHP 作为异步服务,我的服务实现 HTTP/Websockets 服务器(使用 Amp 库(作为 API 传输。

嘿,ReactPHP 核心团队成员在这里。这完全取决于你的 ReactPHP/Amp/Swoole 进程的作用。看看你的例子,我的建议是使用像 RabbitMQ 这样的消息代理/队列。这样,该过程可以在准备好时将其像素化,并在完成后将其保留。如果您的进程同时发生任何事情并死亡,只要它没有收到消息,它就会重试。您也可以执行小型 HTTP API,但这并不能保证在发生致命故障时重新处理消息。最终,这一切都取决于您的设计,所有 3 个项目都是构建您自己的架构和系统的工具集,这完全取决于您。

最新更新