PHP在单独的线程中发送POST请求而忘记了

Mar*_*tin 6 php multithreading curl asynchronous

我的应用程序处理预订,并且在处理过程中我希望将预订详细信息发送给我的应用程序的合作伙伴进行预订,以便他们可以存储对预订的引用,并且不会阻止我的应用程序必须执行的其他处理.

我已经考虑过如何向合作伙伴发送消息,而我的解决方案是向我的合作伙伴发出预订POST请求(除了回答我的问题,也许有人有比这更好的解决方案?).

每个合作伙伴都有一个特定的URL,他们将设置这些URL以接收此POST请求并存储我们发送的预订信息.

问题: 如果我们尝试发送此POST请求并且他们的Web服务器速度很慢或者下降,那么我们可能会等待不必要的长时间来获得响应,这反过来会延迟确认使用我们服务的实际用户的预订.

理想的解决方案: 我想在另一个线程中发送此PHP cURL请求,以便我们继续以愉快的方式确认预订.如果在另一个线程中有延迟,这不会阻止我们.

我考虑的其他解决方案是:

  • 调用外部脚本(例如用python编写)来发送此请求.我已经读过使用exec()可能非常耗费资源.我们有很多预订,所以我们会发送大量的预订POST.理想情况下,我们需要一些资源良心.
  • 使用套接字.我不熟悉这些的配置,我担心我们的套接字服务器出现问题.这也是维护的使命.也许我错了?
  • 使用像Pusher这样的服务,它实际上是一个套接字服务.缺点是,如果听众错过了一条消息,他们将永远不会再得到它.例如,合作伙伴将错过存储该预订.

能够得到一些关于我在这里想要完成的事情的反馈会很棒,尤其是那些需要解决同样情况的人.感谢您的帮助!

Cur*_*ind 2

因此,本质上您是在 PHP 中创建一个可供其他客户端使用的 API。这是我的建议:

  1. 让您的客户通过 POST/GET 方法向您发出请求;而不是您作为 API 服务器尝试将数据推送到您的客户端。这是更好的方法,因为它可以让您摆脱客户端服务器宕机、缓慢或其他问题的困扰。因此,当他们向您发送请求时,这意味着他们完全有能力处理响应。

  2. 使用 HTTP 持久连接:在 apache 中,keep-alive将其值设置为高,以便客户端可以重用现有连接,从而减少延迟。

  3. 对于 php 中的多重处理,请查看 入门多重处理。基本上,有一个pcntl_fork()功能允许您分叉进程并为多处理创建新的子进程。

  4. 基于redis或者类似的东西实现一个后台作业队列。想法是,所有长时间运行的作业都会被放入后台作业队列中,然后为每个任务生成一个工作线程,以便这些作业通过多处理来执行。使用 Redis 和 Solo 的 PHP Worker

希望能帮助到你