当您需要开始发展系统架构并且您的应用程序需要异步工作时,通常会出现扩展问题。你遇到的这个问题很常见(我的一些团队正在处理我写的一个问题)但每个人最终都需要处理它。
解决方案 1:Cron 作业
最常见的解决方案是创建一个定期扫描队列以查找新工作的 cron 作业。我不会解释队列的性质,因为每个人都有自己的队列,有些很好,有些很糟糕,但通常它涉及一个包含相关信息和工作状态的数据库表(<-- 一种糟糕的解决方案),或者涉及 Memcached 的解决方案,MongoDB 也很受欢迎。
这个解决方案的“问题”最终又是“缩放”。Cron 作业以固定的时间间隔定期运行,因此如果一项任务花费了特别长的时间,作业可能会重叠。这意味着您需要使用某种锁定或使用支持顺序运行作业的调度程序。
最后,您不会遇到超时问题,并且您通常可以将整台机器专用于运行这些任务,因此内存也不是什么大问题。
解决方案 2:工人委派
我将使用 Gearman 作为此解决方案的示例,但其他工具包含 AMQP 等标准,例如 RabbitMQ。我更喜欢 Gearman,因为它的设置更简单,而且它的设计更多是为了工作处理而不是消息传递。
这种委托的优点是调用后立即运行。服务器基本上是在等待要做的事情(与 Apache 服务器不同),当它收到请求时,它将工作负载从客户端转移到您的“工作人员”之一,这些是您编写的脚本,它们会无限期地运行工作负载的服务器。
您可以拥有任意数量的这些工作人员,每个工作人员运行相同或不同类型的任务。这意味着扩展取决于您拥有的工人数量,并且水平扩展非常干净。
结论:
Cron 在我看来自动化维护很好,但是当它们需要同时工作时会遇到问题,这使得运行工作者成为理想的选择。
无论哪种方式,您都需要更改用户接收请求反馈的方式。他们需要被告知他们的请求正在处理中并稍后检查以获得结果,或者您可以定期跟踪正在运行的任务的状态,以通过 ajax 向用户提供实时反馈。这对于 cron 作业来说有点棘手,因为您需要在任务执行期间保持任务的状态,但 Gearman 有一个很好的内置解决方案可以做到这一点。
http://php.net/manual/en/book.gearman.php