Задать вопрос
@yujin1st
Веб-разработчик (Yii)

Отправка пакетов смс: запуск php-скрипта каждые 5-10 секунд

Для внутреннего сервиса решили прикрепить отправку смс: по приблизительной оценке, они будут накапливаться и отправляться пакетами по 100-200 штук в 2-3 часа http-запросами к смс-шлюзу.
Для упрощения схемы разделяем непосредственно постановку сообщений в очередь (база данных mysql), их отправку в фоновом режиме, а также проверку статусов.
Каким образом можно проверять раз в 5-10 секунд php-скриптом на наличие сообщений и запускать длительный (вплоть до пары минут) процесс отправки?
Подскажите, правильным ли будет вышеописанный подход в принципе?

p.s.: почему часто? — нужна оперативность, а минутный период cron'а слишком большой.
p.s.: и наверное, оффтоп-вопрос, каким образом работают смс-шлюзы — не могут же они каждый полученный запрос сразу же отправлять оператору smpp-протоколом, или я ошибаюсь?
  • Вопрос задан
  • 5777 просмотров
Подписаться 11 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
Melkij
@Melkij
PostgreSQL DBA
Демон?
Простой while(true) {проверяем, есть ли в очереди сообщения, если есть — exec'аем скрипт рассылки; sleep(10)}

Не забыть только отвязать stdin и stdout, иначе exec будет ждать окончание скрипта.
Ну и в крон можно воткнуть проверку на то, запущен ли демон и запускать его, если нет.
Ответ написан
@storms
Я бы здесь использовал Gearman. Это сервер организации и распределения задач, или проще говоря сервер очереди сообщений.

Почитать про него можно, например здесь

Рабоать это будет так:
Скрипт, который иницирует отправку смс:

# Подключаемся к серверу
$client= new GearmanClient();
# Регистрируем задачу для фонового выполнения
# "sendsms" - это тип задачи
# $sms - это данные письма
$result = $client->doBackground("sendmail", serialize($sms));

На этом этапе в очередь добавится ваше смс и скрипт продолжает выполнение, и как только освободится один из отправителей (воркеров в терминалогии Gearman) оно будет доставлено.

В этом случае всю черновую работу по хранению смс в очереди, по очередности отправки возьмет на себя сторонее приложение
Ответ написан
avalak
@avalak
> Подскажите, правильным ли будет вышеописанный подход в принципе?
Я бы иначе реализовал. Redis pubsub для очереди + Node.js (вам, вероятно, ближе phpDaemon) + база данных, если нужно вести лог. supervisord для слежки за службой.
Ответ написан
Комментировать
markoffko
@markoffko
Можно так набыдлокодить например (каждые 15сек):
*/1 * * * * root /home/mybin/script.sh; /bin/sleep 15; /home/mybin/script.sh; /bin/sleep 15; /home/mybin/script.sh; /bin/sleep 15; /home/mybin/script.sh

Или делать
exec('myscritp');
sleep(10);
exec('myscritp');
Ответ написан
@WEBIVAN
p.s.: и наверное, оффтоп-вопрос, каким образом работают смс-шлюзы — не могут же они каждый полученный запрос сразу же отправлять оператору smpp-протоколом, или я ошибаюсь?

Ну почему же, не вижу никаких проблем в мгновенной отправке по smpp.

По поводу реализации, не вижу зачем тут использовать базу вообще. Запускаете демон на php, который слушает произвольный порт. На этот же порт отправляете сообщения и ставите их в очередь внутри самого php(скажем в массив), как только количество сообщений достигает нужного количества — отправляете их.
В идеальном варианте вам понадобится libevent что бы не дергать сокеты в вечном цикле и pcntl для форков, дабы не вызывать фоновые задания через exec и прочие.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы