@yujin1st
Веб-разработчик (Yii)

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

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

p.s.: почему часто? — нужна оперативность, а минутный период cron'а слишком большой.
p.s.: и наверное, оффтоп-вопрос, каким образом работают смс-шлюзы — не могут же они каждый полученный запрос сразу же отправлять оператору smpp-протоколом, или я ошибаюсь?
  • Вопрос задан
  • 5549 просмотров
Пригласить эксперта
Ответы на вопрос 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 и прочие.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
от 80 000 до 100 000 руб.
Teamlead Ставрополь
от 25 000 до 50 000 руб.
Vigrom Москва
До 150 000 руб.
12 нояб. 2019, в 12:51
1 руб./за проект
12 нояб. 2019, в 12:38
3000 руб./за проект
12 нояб. 2019, в 12:35
1200 руб./в час