PHP-响应传入的API调用而不返回
我正试图找出最好的方法,将对传入API帖子的响应发送到我们的系统,而不返回 我们从另一个服务接收XML post,并使用它,然后我们对它们的响应也是XML。我们目前正在做的是消化传入的帖子,在我们这方面做一些事情,然后用XML做一个php返回 我想改变这一点,这样我们就可以用XML响应他们的调用,但之后再进行一些处理,而不需要进行某种类型的exec/后台调用PHP-响应传入的API调用而不返回,php,api,integration,webhooks,Php,Api,Integration,Webhooks,我正试图找出最好的方法,将对传入API帖子的响应发送到我们的系统,而不返回 我们从另一个服务接收XML post,并使用它,然后我们对它们的响应也是XML。我们目前正在做的是消化传入的帖子,在我们这方面做一些事情,然后用XML做一个php返回 我想改变这一点,这样我们就可以用XML响应他们的调用,但之后再进行一些处理,而不需要进行某种类型的exec/后台调用 用PHP发送响应而不返回的最佳方式是什么?如果我们执行“echo”,将关闭连接,并允许我们以后在没有其他服务器的情况下进行更多处理“等待?
用PHP发送响应而不返回的最佳方式是什么?如果我们执行“echo”,将关闭连接,并允许我们以后在没有其他服务器的情况下进行更多处理“等待?调用PHP的
echo
不会关闭连接,事实上,您可以在PHP脚本中多次调用echo
,输出将添加到响应中。只有在以下情况下,连接才会关闭:
exit()
或别名die()
exec
和nohup
。基本用法如下所示:
exec('RESOURCE_ID=123 nohup /path/to/your/php/executable your_script.php > /dev/null');
在命令的第一段中,RESOURCE\u ID=123
,您可以将以前存储的请求数据的唯一标识符(可能是数据库条目ID或存储文件名)传递给后台脚本。在后台脚本中使用getenv('RESOURCE_ID')
检索变量
[编辑]/dev/null
输出重定向对于在后台运行进程至关重要,否则父脚本将等待后台进程的输出。我还建议将输出和错误输出写入实际文件,如&>my_script.out
,这将产生相同的效果。您还可以通过附加&echo$来获取后台进程的进程id对于命令,exec()
将返回它
启动后台脚本后,可以发送“确定”响应并退出父脚本
选项2:Jim Panse建议的用于处理的Cronjob
系统越复杂,您可能需要更多地控制“消化”代码的执行。也许您想要平衡服务器负载峰值,或者重新启动失败的任务,或者限制API的恶意使用。如果你需要这种控制,你最好用这个选项。< p>因为我想你的系统要同步地进行系统通信,你可以考虑多个方面。
即使是耗时的请求,您通常仍然需要快速响应。
要满足此要求,您不能立即处理请求
因此,只需保存请求并在以后处理它(返回客户机202响应)。像队列这样的系统非常流行,它可以为以后运行它们节省耗时的作业。然后,另一个时间控制脚本(cronjob)可以进行轮询并处理堆叠的消息/数据
如果您也想将结果提供给客户机,那么在初始rest调用时为其返回一个唯一的资源id,并使用此参数作为输入实现另一个资源。如果您的系统完成了处理,结果将显示在那里
从另一个php脚本中生成一个进程不是很方便,因为它很难调试并且容易出错
我个人不会选择这种解决方案。我希望情况不是这样,但感谢您提供的信息。当您在代码中连接固定进程调用时,通常无法运行它们。意思是:启动主进程隐式结束于启动后台进程。由于来自另一个php进程的进一步进程调用通常与主进程的每个调试分离,因此它们更难控制,因此也更难调试。另一方面,调度程序可以很容易地停止,php代码可以手动运行。@Jim Panse,我大体上同意,并且必须承认我不知道它如何影响Xdebug,例如,我没有使用它。但我相信选项1有一个用例。有时,等待下一个cronjob运行和任何先前排队的任务完成长达1分钟的时间是不可接受的。@Benni确实存在一些有效的用例,特别是在不需要运行复杂系统的情况下。就像生活中的任何地方一样,这总是一种取舍,取决于具体情况。要解决1分钟的间隔,您可以引入某种工作进程,该进程只运行一分钟并寻找更改。正如我所说,如果你有一个简单的情况,你不需要这些。但是如果系统变得更复杂,你可能会考虑更有效的解决方案。