23

我希望我的客户(通过邮寄)发送的数据被放置在一个队列中,并且我的服务器上的一个 php 脚本首先检查队列是否为空。如果队列不为空,那么脚本会一一处理队列中的所有数据。我该怎么做呢?

4

6 回答 6

10

这是您可以使用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 有许多其他功能可能会派上用场。如果您有兴趣,请查看入队文档

于 2017-06-20T13:12:09.770 回答
9

你可以使用类似Zero MQ的东西

请参阅Rasmus Lerdorf 的示例

您还可以考虑使用Gearman来分配负载。

于 2012-07-06T06:51:59.377 回答
3

看看这个

它使用 memcached 进行持久化。

于 2012-07-06T06:50:29.720 回答
2

cronjob 方法的问题是,cronjob 最多可以设置为 1 分钟间隔,因此作业执行有 1 分钟的延迟,如果可以接受,那很好,否则应该使用带有轮询脚本的队列。

于 2013-05-31T11:12:23.987 回答
0

这是另一个很棒的教程:

http://squirrelshaterobots.com/programming/php/building-a-queue-server-in-php-part-1-understanding-the-project/

另一个解决方案是使用他们似乎已经融入 PHP 的 Gearman(这不是我最后一次使用它): http: //php.net/manual/en/book.gearman.php

于 2012-07-06T08:16:32.463 回答
0

由于关系数据库(例如:MySQL)非常灵活,并且被 Web 开发人员很好地理解,它们被用于许多类型的作业队列。当对象缓存未配置时,许多 PHP 应用程序使用此解决方案作为后备。这是不得已而为之的方法,因为它是一种非常昂贵的实现队列的方法。

如果您必须使用 MySQL 作为队列,Percona 的一位工程师写了这篇关于管理潜在痛点的 博客文章。

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

于 2014-02-22T07:29:41.370 回答