如何发送消息到ReactPHP / Amp / Swoole / etc。从PHP-FPM?

时间:2019-10-09 13:00:02

标签: reactphp amphp swoole

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

我的Web终结点仍将照常由Apache + PHP-FPM管理,并且我希望它们能够将消息发送到永久运行的脚本,以使它知道已准备好尽快处理异步作业。 / p>

来自网络端点的伪代码:

{
    "compilerOptions": {
        "rootDirs": ["src"],
        "strict": true,
        "target": "es6",
        "module": "commonjs",
        "lib": ["dom", "es6", "es2017", "esnext.asynciterable"],
        "sourceMap": true,
        "outDir": "./dist",
        "moduleResolution": "node",
        "declaration": true,
        "composite": false,
        "removeComments": true,
        "noImplicitAny": true,
        "strictNullChecks": true,
        "strictFunctionTypes": true,
        "noImplicitThis": true,
        "noUnusedLocals": true,
        "noUnusedParameters": true,
        "noImplicitReturns": true,
        "noFallthroughCasesInSwitch": true,
        "allowSyntheticDefaultImports": true,
        "esModuleInterop": true,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "strictPropertyInitialization": false,
        "skipLibCheck": true,
        "baseUrl": ".",
        "rootDir": "src",
        "resolveJsonModule": true
    },
    "exclude": ["node_modules"],
    "include": ["./src/**/*.tsx", "./src/**/*.ts"],
    "typedocOptions": {
        "mode": "modules",
        "out": "docs"
    }
}

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


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

2 个答案:

答案 0 :(得分:0)

如果您的工作人员作为服务“永久运行”,则应提供一些API进行交互。我在项目中使用AmPHP来提供异步服务,并且我的服务将HTTP / Websockets服务器(使用Amp库)实现为API传输。

答案 1 :(得分:0)

嘿,ReactPHP核心团队成员在这里。这完全取决于您的ReactPHP / Amp / Swoole流程。看您的示例,我的建议是使用像RabbitMQ这样的消息代理/队列。这样,流程可以在准备就绪时对其进行记录,并在完成时进行确认。如果您的进程在此期间发生任何事情并死亡,只要没有确认消息,它就会重试。您也可以使用小型HTTP API,但这不能保证在发生致命故障时可以重新处理消息。最终,这完全取决于您的设计,所有3个项目都是构建您自己的体系结构和系统的工具集,完全取决于您。