Подтвердить что ты не робот

PHP Как реализовать обработку очереди в php

Я хочу, чтобы данные, отправленные моими клиентами (через почту), были помещены в очередь, а php script на моем сервере сначала проверяет, пуста ли очередь. Если очередь не пуста, то script обрабатывает все данные в очереди поочередно. Как это сделать?

4b9b3361

Ответ 2

Это то, что вы можете легко сделать с 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();

Запустите столько процессов consumer.php, сколько и вы, используя supervisord или другие менеджеры процессов, на локальном компьютере вы можете запустить его без каких-либо дополнительных библиотек или пакетов.

Это базовый пример и enqueue имеет много других функций, которые могут пригодиться. Если вам интересно, ознакомьтесь с постановочной документацией.

Ответ 3

Взгляните на this.

Он использует memcached для сохранения.

Ответ 4

Проблема с подходом cronjob заключается в том, что cronjob может быть максимально установленным на 1-минутный интервал, поэтому в выполнении задания есть 1 минуту, если это приемлемо, тогда это штраф в противном случае должен использовать очереди с опросом script.

Ответ 6

Поскольку реляционные DB (Ex: MySQL) настолько гибкие и хорошо понятны веб-разработчикам, они используются для многих типов очередей заданий. Многие PHP-приложения используют это решение в качестве резервной копии, когда кеширование объектов не сконфигурировано. Это метод последней инстанции, потому что это очень дорогой способ реализовать очередь.

Если вы должны использовать MySQL в качестве очереди, один из инженеров Percona написал эту запись для управления потенциальными точками боли.

Если вы хотите наиболее масштабируемую реализацию, я настоятельно рекомендую ZeroMQ. Однако это не стандартное, или особенно распространенное расширение PHP. Таким образом, для проекта, в котором вы не будете контролировать стек веб-сервера: используйте объекты APC, Memcache или Memcached, а затем вернитесь в таблицу кеша MySQL.