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