【问题标题】:PHP How do I implement queue processing in phpPHP 如何在 php 中实现队列处理
【发布时间】:2012-07-06 14:47:42
【问题描述】:

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

【问题讨论】:

  • 在数据库中创建一个表来提交数据,然后运行 ​​crontab 作业ever x 来获取它?
  • 是的。我喜欢这种方法。但是在表格中插入任务后,我如何检索要完成的任务并在任务完成时更新表格?
  • 这就是 cronjob 运行任务来处理、访问数据库并更新它的关键
  • 一个cron任务有问题。它的延迟可能长达 1 分钟。

标签: php queue


【解决方案1】:

使用enqueue 库可以轻松做到这一点。首先,您可以从多种transports中进行选择,例如AMQP、STOMP、Redis、Amazon SQS、Filesystem等。

其次,它超级好用。让我们从安装开始:

您必须安装 enqueue/simple-client 库和 one of the transports。假设您选择文件系统之一,请安装 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 documentation

【讨论】:

    【解决方案2】:

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

    Example by Rasmus Lerdorf

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

    【讨论】:

      【解决方案3】:

      看看this

      它使用 memcached 进行持久化。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          如果您必须使用 MySQL 作为队列,Percona 的一位工程师写了这个blog entry 来管理潜在的痛点。

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

          【讨论】:

            【解决方案6】:

            这是另一个很棒的教程:

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

            另一个解决方案是使用 Gearman,他们似乎已将其整合到 PHP 中(这不是我最后一次使用它):http://php.net/manual/en/book.gearman.php

            【讨论】:

            • 投了反对票,因为我认为这已经过时了 - 该链接似乎指向垃圾邮件站点。
            猜你喜欢
            • 1970-01-01
            • 2018-06-30
            • 1970-01-01
            • 1970-01-01
            • 2017-08-16
            • 1970-01-01
            • 2015-01-25
            • 1970-01-01
            • 2019-07-11
            相关资源
            最近更新 更多