Я хочу, чтобы данные, отправленные моими клиентами (через почту), были помещены в очередь, а php script на моем сервере сначала проверяет, пуста ли очередь. Если очередь не пуста, то script обрабатывает все данные в очереди поочередно. Как это сделать?
PHP Как реализовать обработку очереди в php
Ответ 1
Вы можете использовать что-то вроде Zero MQ
См. Пример от Расмуса Лердорфа.
Вы также можете рассмотреть возможность использования Gearman для распределения нагрузки.
Ответ 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.
Ответ 5
Вот еще один отличный учебник для этого:
Другое решение использует Gearman, который, по-видимому, включен в PHP (это был не последний раз, когда я играл с ним): http://php.net/manual/en/book.gearman.php
Ответ 6
Поскольку реляционные DB (Ex: MySQL) настолько гибкие и хорошо понятны веб-разработчикам, они используются для многих типов очередей заданий. Многие PHP-приложения используют это решение в качестве резервной копии, когда кеширование объектов не сконфигурировано. Это метод последней инстанции, потому что это очень дорогой способ реализовать очередь.
Если вы должны использовать MySQL в качестве очереди, один из инженеров Percona написал эту запись для управления потенциальными точками боли.
Если вы хотите наиболее масштабируемую реализацию, я настоятельно рекомендую ZeroMQ. Однако это не стандартное, или особенно распространенное расширение PHP. Таким образом, для проекта, в котором вы не будете контролировать стек веб-сервера: используйте объекты APC, Memcache или Memcached, а затем вернитесь в таблицу кеша MySQL.