Задать вопрос
@topuserman

Теоретический вопрос: можно ли запускать php скрипты и насколько такой подход правильный?

Можно ли написать скрипт, который будет слушать определенный порт и получать сообщения.
При получении каждого сообщения необходимо запускать php скрипт и передать ему параметр (через args) данные сообщение.
Дожидаться работы завершения php скрипта не нужно.
Если пришло несколько сообщений сразу, то запускать их параллельно, отдельными процессами.

Для чего это мне нужно?
Часто бывает необходимо в php-скриптах выполнять какие-то тяжелые задачи.
например пользователь запустил переиндексацию каталога.
И хотелось бы, чтобы сама переиндексация началась сразу, но отдельным процессом, чтобы не тормозить текущий скрипт.

В целом, сейчас подобные задачи я решаю сервером очередей.
В очередь добавляю сообщение, а консюмер забирает и выполняет эти задачи.

Из-за одной небольшой задачи (запуск выполнения задач в фоновом режиме), приходится ставить тяжелые сервера очередей.

Мне кажется, если написать такой скрипт, то можно решить эту задачу, но используя один маленький скрипт.

Хотел бы узнать мнение go-разработчиков, с какими проблемами можно столкнуться, и насколько такой подход работающий?
  • Вопрос задан
  • 130 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 3
Очереди и ограниченные по числу консьюмеры решают одну полезную задачу - если пользователь 50 раз запросит переиндексацию, больше чем N процессов не будет работать единовременно и эти 50 запросов не приведут к коллапсу.
Если под подобные задачи классические mq - тяжело, то можно использовать что полегче - NATS или даже Redis.

А так-то можно запускать скрипты чем угодно, но подход совсем-совсем не очень. Но честно говоря, есть что и похуже - видел проект в которым php-скрипты генерировали и запускали shell-скрипты.
Ответ написан
Комментировать
2ord
@2ord
Если я верно понял, то схема такова:

Producer (1-й PHP скрипт) -> MQ broker -> Consumer (2-й PHP скрипт)

Это обычная микро-сервисная архитектура. Плюс каждого сервиса в том, что каждый из них не хранит состояние. То есть, производителя "не интересует" судьба отправленной задачи и он не ведет никакого учета по тому что и кому было отправлена задача.
Если не хочется брать тяжеловесные брокеры очереди сообщений, то можно взять как посоветовал Дмитрий Шицков или даже ZeroMQ.

Ту же задачу можно решить при помощи создания нового потока в основном потоке программы и ожидания окончания выполнения потока, выполняющего задачу. В случае Го вместо потока создается го-рутина (просто более легковесный вариант потока) - смысл тот же.
Чтобы не сильно нагружать систему, используют ограниченное количество потоков-потребителей.

Добавлено
В случае Го, если не нужно ожидать окончания, то можно отправить задание в канал. Потребители канала должны забирать задания, иначе канал может заблокироваться (по заполнению буфера канала задач или при каждой новой задаче, в зависимости от конфигурации канала).
Ответ написан
Комментировать
artloveyou
@artloveyou
Если php-скрипт консольный, какая разница чем его запускать. Можно и go.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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