8

我的应用程序处理预订,并且在处理过程中,我希望它将预订详细信息发送给我的应用程序的任何一个进行预订的合作伙伴,这样他们就可以存储对预订的参考,并且不会阻止我的应用程序必须执行的其他处理。

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

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

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

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

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

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

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

4

2 回答 2

2

所以本质上你是在用 PHP 创建一个其他客户端使用的 API。这是我的建议:

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

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

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

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

希望能帮助到你

于 2012-10-26T22:27:36.437 回答
1

让一个单独的脚本通过 cron 运行怎么样?
获得最终确认可能需要更大的延迟(只能每分钟发送外部请求),但允许用户界面操作仅将信息存储在队列中并继续,然后计划任务稍后可以处理它.
队列处理器将能够检查来自外部服务的有效响应,并在必要时重试,而无需占用用户界面。

为了更及时的处理,您可以创建一个守护进程来检查队列中要处理的条目,其延迟比使用 cron 可能的延迟更小。PEAR 有一个System_Daemon 包,可以帮助在 PHP 中创建守护程序。

于 2012-10-26T22:24:34.270 回答