我希望我的客户(通过邮寄)发送的数据被放置在一个队列中,并且我的服务器上的一个 php 脚本首先检查队列是否为空。如果队列不为空,那么脚本会一一处理队列中的所有数据。我该怎么做呢?
6 回答
这是您可以使用enqueue库轻松完成的事情。首先,您可以从多种传输方式中进行选择,例如 AMQP、STOMP、Redis、Amazon SQS、Filesystem 等。
其次,它超级好用。让我们从安装开始:
您必须安装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();
consumer.php
使用supervisord或其他进程管理器运行与您一样多的进程,在本地计算机上您无需任何额外的库或包即可运行它。
这是一个基本示例,并且 enqueue 有许多其他功能可能会派上用场。如果您有兴趣,请查看入队文档。
看看这个。
它使用 memcached 进行持久化。
cronjob 方法的问题是,cronjob 最多可以设置为 1 分钟间隔,因此作业执行有 1 分钟的延迟,如果可以接受,那很好,否则应该使用带有轮询脚本的队列。
这是另一个很棒的教程:
另一个解决方案是使用他们似乎已经融入 PHP 的 Gearman(这不是我最后一次使用它): http: //php.net/manual/en/book.gearman.php
由于关系数据库(例如:MySQL)非常灵活,并且被 Web 开发人员很好地理解,它们被用于许多类型的作业队列。当对象缓存未配置时,许多 PHP 应用程序使用此解决方案作为后备。这是不得已而为之的方法,因为它是一种非常昂贵的实现队列的方法。
如果您必须使用 MySQL 作为队列,Percona 的一位工程师写了这篇关于管理潜在痛点的 博客文章。
如果您想要最具可扩展性的实现,我强烈推荐 ZeroMQ。但是,它不是默认的或特别常见的 PHP 扩展。因此,对于您不会控制 Web 服务器堆栈的项目:使用 APC 对象、Memcache 或 Memcached,然后回退到 MySQL 缓存表。