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

时间:2012-10-26 21:29:14

标签: php multithreading curl asynchronous

我的应用程序处理预订,并且我希望它能够将预订详细信息发送给我的应用程序的合作伙伴进行预订,以便他们可以存储对预订的引用, AND 而不保留我应用程序必须执行的其他处理。

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

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

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

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

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

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

很高兴能得到一些关于我在这里想要完成的事情的反馈,特别是那些需要针对我所处的相同情况的解决方案的人。感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

基本上,您正在使用PHP创建其他客户端使用的API。这是我的建议:

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

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

  3. 对于php中的多处理,请查看 Getting into multiprocessing。基本上,有pcntl_fork()功能可以让你分叉一个过程&为多处理创建新的子进程。

  4. 基于redis或类似方法实现后台作业。我们的想法是,所有长时间运行的工作都会被放入后台工作中。然后为每个任务生成一个worker,以便通过多处理执行这些作业。 PHP Workers with Redis & Solo

  5. 希望有所帮助

答案 1 :(得分:1)

如何通过cron运行单独的脚本? 获取最终确认可能需要更长的延迟(每分钟只能发送外部请求),但允许用户界面操作只将信息存储在队列中并继续,然后计划任务可以稍后处理。
队列处理器将能够检查外部服务的有效响应,并在必要时再次尝试,而无需占用用户界面。

为了更及时地处理,您可以创建一个守护程序,该守护程序检查队列中要处理的条目的延迟是否小于cron。 PEAR有System_Daemon package可以帮助用PHP创建守护进程。