PHP 如何在 php 中实现队列处理

2022-08-30 18:34:54

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


答案 1

这是您可以使用排队库轻松执行的操作。首先,您可以从各种传输中进行选择,例如AMQP,STOMP,Redis,Amazon SQS,Filesystem等。

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

您必须安装库和其中一个传输。假设您选择了文件系统,请安装库。总结一下:enqueue/simple-clientenqueue/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

这是一个基本的例子,enqueue还有很多其他功能可能会派上用场。如果您有兴趣,请查看排队文档


答案 2

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

参见Rasmus Lerdorf的例子

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


推荐