我正在考虑使用可永久作为服务运行的框架(例如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套接字服务器并实现了自己的消息传递协议,或者有现成的解决方案可以解决这个问题?
注意:如果您想知道,我不打算使用第三方消息队列软件,因为我希望将异步作业存储为数据库事务的一部分(整个交易成功,包括提交待处理的作业,或者整个交易被丢弃)。我保证不会丢掉工作。如果在最坏的情况下,该消息无法发送到正在运行的服务,则稍后仍可以从数据库中检索丢失的作业。
答案 0 :(得分:0)
如果您的工作人员作为服务“永久运行”,则应提供一些API进行交互。我在项目中使用AmPHP来提供异步服务,并且我的服务将HTTP / Websockets服务器(使用Amp库)实现为API传输。
答案 1 :(得分:0)
嘿,ReactPHP核心团队成员在这里。这完全取决于您的ReactPHP / Amp / Swoole流程。看您的示例,我的建议是使用像RabbitMQ这样的消息代理/队列。这样,流程可以在准备就绪时对其进行记录,并在完成时进行确认。如果您的进程在此期间发生任何事情并死亡,只要没有确认消息,它就会重试。您也可以使用小型HTTP API,但这不能保证在发生致命故障时可以重新处理消息。最终,这完全取决于您的设计,所有3个项目都是构建您自己的体系结构和系统的工具集,完全取决于您。