PHP-响应传入的API调用而不返回

PHP-响应传入的API调用而不返回,php,api,integration,webhooks,Php,Api,Integration,Webhooks,我正试图找出最好的方法,将对传入API帖子的响应发送到我们的系统,而不返回 我们从另一个服务接收XML post,并使用它,然后我们对它们的响应也是XML。我们目前正在做的是消化传入的帖子,在我们这方面做一些事情,然后用XML做一个php返回 我想改变这一点,这样我们就可以用XML响应他们的调用,但之后再进行一些处理,而不需要进行某种类型的exec/后台调用 用PHP发送响应而不返回的最佳方式是什么?如果我们执行“echo”,将关闭连接,并允许我们以后在没有其他服务器的情况下进行更多处理“等待?

我正试图找出最好的方法,将对传入API帖子的响应发送到我们的系统,而不返回

我们从另一个服务接收XML post,并使用它,然后我们对它们的响应也是XML。我们目前正在做的是消化传入的帖子,在我们这方面做一些事情,然后用XML做一个php返回

我想改变这一点,这样我们就可以用XML响应他们的调用,但之后再进行一些处理,而不需要进行某种类型的exec/后台调用


用PHP发送响应而不返回的最佳方式是什么?如果我们执行“echo”,将关闭连接,并允许我们以后在没有其他服务器的情况下进行更多处理“等待?

调用PHP的
echo
不会关闭连接,事实上,您可以在PHP脚本中多次调用
echo
,输出将添加到响应中。只有在以下情况下,连接才会关闭:

  • 到达脚本的末尾
  • 调用
    exit()
    或别名
    die()
  • 发生致命/解析错误或未捕获异常,或者服务器内存不足
  • 超出了您可以在php.ini中设置的最大脚本执行时间
  • 通常,调用的客户机代码也会有某种超时,因此,如果“消化”代码可能需要更长的时间,并且您希望处理这个问题以及列表中的第4点,那么您可以将请求数据存储在数据库中或在文件中序列化,以供以后处理。成功存储数据后,您基本上有两个选择:

    选项1:生成后台PHP进程

    要生成能够在调用脚本的活动周期中生存的后台PHP进程,请使用
    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$来获取后台进程的进程idexec()
    将返回它

    启动后台脚本后,可以发送“确定”响应并退出父脚本

    选项2:Jim Panse建议的用于处理的Cronjob


    系统越复杂,您可能需要更多地控制“消化”代码的执行。也许您想要平衡服务器负载峰值,或者重新启动失败的任务,或者限制API的恶意使用。如果你需要这种控制,你最好用这个选项。

    < p>因为我想你的系统要同步地进行系统通信,你可以考虑多个方面。 即使是耗时的请求,您通常仍然需要快速响应。 要满足此要求,您不能立即处理请求

    因此,只需保存请求并在以后处理它(返回客户机202响应)。像队列这样的系统非常流行,它可以为以后运行它们节省耗时的作业。然后,另一个时间控制脚本(cronjob)可以进行轮询并处理堆叠的消息/数据

    如果您也想将结果提供给客户机,那么在初始rest调用时为其返回一个唯一的资源id,并使用此参数作为输入实现另一个资源。如果您的系统完成了处理,结果将显示在那里

    从另一个php脚本中生成一个进程不是很方便,因为它很难调试并且容易出错


    我个人不会选择这种解决方案。

    我希望情况不是这样,但感谢您提供的信息。当您在代码中连接固定进程调用时,通常无法运行它们。意思是:启动主进程隐式结束于启动后台进程。由于来自另一个php进程的进一步进程调用通常与主进程的每个调试分离,因此它们更难控制,因此也更难调试。另一方面,调度程序可以很容易地停止,php代码可以手动运行。@Jim Panse,我大体上同意,并且必须承认我不知道它如何影响Xdebug,例如,我没有使用它。但我相信选项1有一个用例。有时,等待下一个cronjob运行和任何先前排队的任务完成长达1分钟的时间是不可接受的。@Benni确实存在一些有效的用例,特别是在不需要运行复杂系统的情况下。就像生活中的任何地方一样,这总是一种取舍,取决于具体情况。要解决1分钟的间隔,您可以引入某种工作进程,该进程只运行一分钟并寻找更改。正如我所说,如果你有一个简单的情况,你不需要这些。但是如果系统变得更复杂,你可能会考虑更有效的解决方案。