我希望将客户通过邮寄发送的数据放入队列中,然后在我的服务器上运行一个php脚本来检查队列是否为空。如果队列不为空,则该脚本将一个接一个地处理队列中的所有数据。如何实现这一点?
我希望将客户通过邮寄发送的数据放入队列中,然后在我的服务器上运行一个php脚本来检查队列是否为空。如果队列不为空,则该脚本将一个接一个地处理队列中的所有数据。如何实现这一点?
使用 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文档。
使用cronjob的问题是,cronjob最多只能设置为1分钟的间隔,在作业执行时会有1分钟的延迟。如果这个延迟可以接受,那么就没有问题,否则应该使用带轮询脚本的队列。
由于关系型数据库(例如MySQL)非常灵活,并且被Web开发人员深入了解,它们被用于许多类型的作业队列。当对象缓存未配置时,许多PHP应用程序将其作为备选方案使用。这是最后的手段方法,因为它是一种非常昂贵的实现队列的方式。
如果您必须将MySQL用作队列,请参考Percona工程师撰写的这篇博客文章,以管理潜在的痛点。
如果您想要最可扩展的实现方式,我强烈推荐使用ZeroMQ。但是它不是默认的、也不是特别常见的PHP扩展。因此,在您无法控制Web服务器堆栈的项目中:请使用APC Objects、Memcache或Memcached,然后回退到MySQL缓存表。
这里有另一个关于此的绝佳教程:
另一种解决方案是使用Gearman,他们似乎将其纳入了PHP中(这不是我上次玩的时候):http://php.net/manual/en/book.gearman.php