6

По мере создания своего проекта столкнулся с проблемой - есть некоторые действия пользователей, которые могут длиться до нескольких минут. Ясно понятно, что заставлять пользователя ждать, пока выполняются такие длинные запросы к серверу непозволительно! И тут пришел к выводу, что нужно организовать очередь задач, чтобы пользователь нажал ссылку, на сервере сформировалась задача, а пользователю лишь только отображался процесс выполнения задачи.

Даже набросал табличку в БД, но решение получилось не универсальным. Созданная очередь задач умеет выполнять только шелл скрипты, а мне бы хотелось научить ее выполнять еще логику на PHP, и чтобы результаты обоих случаев складывались в БД.

Слышал о RabbitMQ, Apache Message Queue, но мне кажется, что они слишком избыточны для моего случая. Мне нужно-то, делать некоторые проверки на сервере (тут как раз пригодился бы способ выполнения PHP кода, и в зависимости от результата продолжалось бы выполнение задач, или нет), и манипулировать учетными файлами, и просто "тяжелыми" файлами.

Где можно было почитать как организовывать подобные вещи? Может кто сталкивался уже с этим, и нашел решение?

Проект создается на базе фреймворка Yii.

7
  • Так в чем ваша проблема? Вам нужно стандартное решение очереди, почитайте в википедии. Можно сделать на списке, к примеру.
    – PaulD
    28 фев 2013 в 17:05
  • Послушайте, это очень вкусная задумка у вас ). Я так понял получается что-то вроде сервера внутри сервера и на php? Поправьте меня, если что.
    – istem
    28 фев 2013 в 21:20
  • @istem да, верно, что-то типа виртуального(shared) хостинга.
    – nolka
    2 мар 2013 в 15:43
  • В python есть celery для этого. А вот как с ним работать из пхп: PHP client for Celery 24 дек 2013 в 9:25
  • Делал когда то подобную вещь, в том числе на Yii. В БД создаете таблицу с задачами, вводите поле тип, таким образом можно будет определять shell или php. Тут при проектировании "таск трекера" приходят на помощь шаблоны проектирования. Ну и далее запускаете свой консольный скрипт, скорее всего по крону(зависит от специфики задачи) и в нем получается список задач и выполняете актуальную. Сразу после запуска задачи обязательно надо обновить ее статус(in_progress например), чтобы крон, который запустится позже, не подхватил ее снова. Выполнили, обновили статус или удалили. Ищете новую.
    – iurii_n
    24 дек 2013 в 13:09

2 ответа 2

2

Воркер на пхп и запускать его по крону. Не?

2
  • Да, возможен и такой велосипед, но Я не могу придумать, как сделать так, чтобы он мог выполнять как shell скрипты, так и php код. Ввести поле "task_type", к примеру?)
    – nolka
    2 мар 2013 в 15:48
  • Это уже какая-то псевдоочередь ( Будет теряться время.
    – frops
    5 окт 2016 в 9:59
0

ПО мере создания своего проекта столкнулся с проблемой такого плана - есть некоторые действия пользователей, которые могут длиться до нескольких минут.

Это ужасно! Это следствие плохой структуры БД и скриптов. Что такого может выполняться, да к тому же у каждого пользователя по минуте по две?

Ладно обработка нескольких таблиц с математическими действиями по подсчете скидок у 16К клиентов и 25К заказов. Тут да у меня на серваке до 8 минут считаются, но раз в день и для всех сразу, а не для каждого по отдельности.

Я даже набросал табличку в БД, и все бы хорошо, но решение получилось не универсальным. Созданная очередь задач умеет выполнять только шелл скрипты, а мне бы хотелось научить ее выполнять еще логику на php, и чтобы результаты обоих случаев складывались в БД.

В Yii есть консольные приложения(и тут), юзай их. Делай там и логику и операции с данными. Не нужно изобретать с данном случае велосипед.

4
  • @Shrek бывает всякое. Один мой знакомый (тогда -- коллега) для таких вот запросов делал специальную "выжимку" из базы (раз в сутки). А пользовательские запросы уже брали информацию из этой выжимки. (Недостаток -- пока "большой" запрос не завершён, информацию пытаться получить бесполезно. Но по тем условиям работы это было приемлемо)
    – alexlz
    1 мар 2013 в 9:34
  • @Shrek, когда в проекте предполагается работа с архивами большого размера - это плохая структура БД? Увы, у меня нет таких мощностей, как например во вконтакте, или гугла, которые способны "на-лету" делать все) Подсчет скидок - вещь весьма тривиальная, и Я бы ее реализовал сам, без вопроса здесь)
    – nolka
    2 мар 2013 в 15:42
  • 2
    @nolka, тогда php вам не подходит, именно но причите однопоточности. Посмотрите в сторону java.
    – dlarchikov
    2 мар 2013 в 15:59
  • @dimka3210, многопоточность здесь не при чем :] Никто не мешает запускать пхп скрипты в несколько потоков :]
    – nolka
    2 мар 2013 в 16:10

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.