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

标签 php api integration webhooks

我正在尝试找出将对传入 API POST 的响应发送到我们的系统而不返回的最佳方式。

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

我想更改此设置,以便我们可以使用 XML 响应他们的调用,但在事后进行一些处理,而不进行某种类型的执行/后台调用。

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

最佳答案

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

  1. 到达脚本结尾
  2. exit() 或别名 die() 被调用
  3. 发生致命/解析错误或未捕获的异常,或者您的服务器内存不足
  4. 超过了您可以在 php.ini 中设置的最长脚本执行时间

通常,调用客户端代码也会有某种超时,所以如果您的“消化”代码可能需要更长的时间,并且您想要注意这一点以及列表中的第 4 点,您可以存储请求数据供以后处理,例如在数据库中或在文件中序列化。成功存储数据后,您基本上有 2 个选择:

选项 1:生成后台 PHP 进程

要生成一个在调用脚本的生命周期内存活的后台 PHP 进程,请使用 execnohup。基本用法可能如下所示:

exec('RESOURCE_ID=123 nohup /path/to/your/php/executable your_script.php > /dev/null');

在命令的第一段 RESOURCE_ID=123 中,您可以将先前存储的请求数据的唯一标识符(可能是数据库条目 ID 或存储文件名)传递给后台脚本。在后台脚本中使用 getenv('RESOURCE_ID') 来检索变量。

[EDIT] >/dev/null 用于输出重定向对于在后台运行进程至关重要,否则父脚本将等待后台进程的输出。我还建议将输出以及错误输出写入实际文件,如 &> my_script.out,这将具有相同的效果。您还可以通过将 & echo $! 附加到命令来获取后台进程的进程 ID,然后 exec() 将返回它。

启动后台脚本后,您可以发送“OK”响应并退出父脚本。

选项 2:按照 Jim Panse 的建议使用 Cronjob 进行处理

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

关于PHP - 响应传入的 API 调用而不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58804401/

相关文章:

php - 如何从数据库中的所有表中搜索包含当前月份的日期的所有记录?

api - 日历 API(Google Apps 脚本)项目未找到且无法用于 API 调用

将整个目录和子目录下载到本地驱动器的 PHP FTP 库/函数

php - 尝试将我的数据库导出为 XML 文件并出现 "Extra content at end of document"错误

json - Microsoft Academic API 按标题搜索

php - 我想通过 retrofit2 api 从 Mysql 数据库中获取数据

asp.net - Plon 和 Asp.Net 集成

iphone - IOS 应用程序中的 Revmob 广告

javascript - 如何防止 javascript 和 css 乱码?

javascript - 拒绝执行来自 'file_name.php' 的脚本,因为它的 MIME 类型 ('text/html' ) 不可执行,并且启用了严格的 MIME 类型检查