如何在PHP中实现队列处理

25

我希望将客户通过邮寄发送的数据放入队列中,然后在我的服务器上运行一个php脚本来检查队列是否为空。如果队列不为空,则该脚本将一个接一个地处理队列中的所有数据。如何实现这一点?


创建一个数据库表来提交数据,然后运行 crontab 作业每隔 x 时间来获取它? - BugFinder
是的,我喜欢这种方法。但在将任务插入表中后,如何检索要完成的任务并在任务完成时更新表格呢? - ASHUTOSH
1
这就是 cronjob 的目的,运行一个任务来处理、访问数据库并更新它。 - BugFinder
1
一个cron任务出现了问题。它的延迟可能长达1分钟。 - Urizev
6个回答

11

使用 enqueue 库,您可以轻松完成此操作。首先,您可以选择多种传输工具,如 AMQP、STOMP、Redis、Amazon SQS、文件系统等。

其次,这非常容易使用。让我们从安装开始:

您需要安装 enqueue/simple-client 库和 其中一种传输工具,假设您选择了文件系统,则安装 enqueue/fs 库。总之:

composer require enqueue/simple-client enqueue/fs 
现在让我们看一下如何从您的POST脚本发送消息:
<?php
// producer.php

use Enqueue\SimpleClient\SimpleClient;

include __DIR__.'/vendor/autoload.php';

$client = new SimpleClient('file://'); // the queue will store messages in tmp folder

$client->sendEvent('a_topic', 'aMessageData');
消费脚本:
<?php
// consumer.php

use Enqueue\SimpleClient\SimpleClient;
use Enqueue\Psr\PsrProcessor;
use Enqueue\Psr\PsrMessage;

include __DIR__.'/vendor/autoload.php';

$client = new SimpleClient('file://');

$client->bind('a_topic', 'a_processor_name', function(PsrMessage $psrMessage) {
   // processing logic here

   return PsrProcessor::ACK;
});

// this call is optional but it worth to mention it.
// it configures a broker, for example it can create queues and excanges on RabbitMQ side. 
$client->setupBroker();

$client->consume();

使用Supervisord或其他进程管理器,您可以运行尽可能多的consumer.php进程。在本地计算机上,您可以在无需任何额外的库或软件包的情况下运行它。

这只是一个基本例子,enqueue还有许多其他有用的功能。如果您感兴趣,请查阅enqueue文档


9

3

2

使用cronjob的问题是,cronjob最多只能设置为1分钟的间隔,在作业执行时会有1分钟的延迟。如果这个延迟可以接受,那么就没有问题,否则应该使用带轮询脚本的队列。


0

由于关系型数据库(例如MySQL)非常灵活,并且被Web开发人员深入了解,它们被用于许多类型的作业队列。当对象缓存未配置时,许多PHP应用程序将其作为备选方案使用。这是最后的手段方法,因为它是一种非常昂贵的实现队列的方式。

如果您必须将MySQL用作队列,请参考Percona工程师撰写的这篇博客文章,以管理潜在的痛点。

如果您想要最可扩展的实现方式,我强烈推荐使用ZeroMQ。但是它不是默认的、也不是特别常见的PHP扩展。因此,在您无法控制Web服务器堆栈的项目中:请使用APC Objects、Memcache或Memcached,然后回退到MySQL缓存表。


0

2
因为我认为这已经过时了,所以我给它点了踩 - 链接似乎指向了一个垃圾网站。 - xgretsch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接