Модуль [AVP] Фоновые задачи

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

image

image

Во всех моих модулях присутствует такой чекбокс. Если по каким-то причинам надо удалить модуль и затем снова поставить - все Ваши данные останутся, до тех пор, пока Вы не удалите модуль с этим отмеченным чекбоксом.
Единственное что придется снова ввести - это настройки модуля, но над этим я тоже сейчас работаю.

Вам надо добавить лишь одно задание в cron. Добавляйте задание от пользователя, под которым работает веб-сервер. Выполнение: * * * * * - для запуска каждую минуту.

/usr/bin/php /path/to/site/index.php --dispatch=avp_background_tasks.cronjob --switch_company_id=1 --access_key=ваш_ключ

Менеджер задач
Верхнее меню:
Журнал - Переход к журналу выполненных задач
Корзина - Удаление всех задач
Плюс - Создание новой задачи
Действия над задачей:
Корзина - Удалить задачу
Редактирование - Переход к редактированию задачи
Ручной запуск - Ручной запуск запланированной задачи. При этом создается копия задачи (с припиской в названии “ручной запуск”), для копии задачи ставится настройка: “однократный запуск”.
Журнал - Перейти к просмотру журнала выполнения конкретной задачи

Последняя колонка Статус - дает возможность включить или выключить задачу. В процессе выполнения задачи у нее может появиться статус Неподтвержденный. Задача с этим статусом находятся в процессе выполнения (также в списке задач подсвечены розовым цветом, как и отчет в журнале, до момента, когда задание будет завершено). Также, если задача поставлена как выполнение функции - при наличии ощибки - может отвалиться на этой ошибке и не быть завершенной. В этом случае у задачи также останется статус Неподтвержденный. Если вы уверены, что это не ошибка - то можете изменить статус задачи на Вкл - и тогда она снова встанет в очередь. Если она снова выпадет со статусом Неподтвержденный - все же правильней будет попытаться найти ошибку в вызываемой функции. В этом случае придется заглянуть в лог-файл веб-сервера. Задачи, запускаемые двумя другими способами, всегда выполняются успешно, так как запускаются параллельным процессом, считывая их вывод и записывая в лог.

В списке задачи отсортированы по времени исполнения. За один проход запускается одна задача. Допустим, если получилось так, что на 14:00 запланировано несколько задач, первая будет выполнена в 14:00, вторая - 14:01, третья - 14:02 итд, при этом интервал будет отсчитываться не от фактического времени запуска задачи, а именно от запланированного.

Задачи также отсортированы по статусу. Выключенные задачи расположены внизу списка на сером фоне.

Создание/редактирование задачи

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

Форма добавления задачи крайне проста.

Шаг 1: Заполните название задания - короткая фраза, по которой станет понятно, что она делает.

Шаг 2: Опишите процесс выполнения задания более подробно - при их большом количестве через некоторое время это поможет Вам вспомнить, зачем эта задача была нужна.

Шаг 3: Выберите из списка установленных модулей, к какому модулю относится задача. Это даст еще одну возможность идентифицировать принадлежность задачи, а также просмотривать в журнале отчеты, относящиеся к определенному модулю, отдельным списком.

Шаг 4: Выберите тип выполнения. Этот тип также отображается на списке задач и в журнале. F - выполняется как внутренняя функция cs-cart или любая функция PHP. Для этого в поле Задание вводим функцию, а в поле аргументы - аргументы функции, если они нужны, по одному на каждой строке. Пока только значения, в дальнейшем можно будет передавать переменные и массивы. P - задание для исполнения php из командной строки. Обратите внимание - в настройках модуля надо указать правильный путь. Здесь параметры не применяются. L - применяется для скачивания файлов. Обратите внимание, что в настройках модуля указывается папка в которую будут складываться скачанные файлы. первой строкой в аргументах должно идти имя файла, под которым скачанный файл будет сохранен. Полезно например, если надо постоянно забирать с одного адреса прайс поставщика.

image

Журнал.

Если выбрать какую-либо задачу (задачи) - меню по шестеренке можно вывести журнол только для этих задач, или только для всех задач, которые относятся к модулю выбранной задачи.
После того, как будут показаны записи журнала, относящиеся к одной задаче - в меню появится пункт Удалить выбранное, что позволит быстро почистить журнал, не очищая его весь.

Если задание имело какой-то вывод (в консоль, или функция возвращала значение) - показывается ссылка Ответ обработки

А если задание завершилось с ошибкой - будет показан код ошибки и вывод задания в консоль, где эта ошибка часто более подробно описана.

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

Примеры созданных заданий:

Вопросы и предложения - пишите в личку

6 лайков

В списке задач появилась пагинация

Журнал получил форму поиска

image

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

также в шестеренке появился пункт - удалить холостые записи (без вывода)

В выводе журнала - 3 типа отображения данных:

  • как строка
  • как вывод на консоли (для задач запускаемых через php-cli)
  • как массив
  • как html (например вывести в журнал кусок передаваемого html или отправляемого письма - для контроля)

Как консоль:

Как массив:

Как строка:

Также добавил функцию

/**
 * Функция для распечатки дампа переменных и массивов в журнал
 * <pre>
 * Вызов:
  fn_avp_bgt_LITE_journal_record( __FILE__, __FUNCTION__, __LINE__, [$_POST, $order_id], '$_POST, $order_id', "Описание");  
 * </pre>   
 * @param string $afile - всегда __FILE__
 * @param string $afunc - всегда __FUNCTION__
 * @param string $aline - всегда __LINE__
 * @param array $args - например: [$_POST, $_REQUEST, $cart]
 * @param string $nameargs - копируем в строковое значение перечисление из массива (строка в одинарных кавычках(!!!) - '$_POST, $_REQUEST, $cart'
 * @param string $message - Текстовый комментарий к записи в журнал
 */
function fn_avp_bgt_LITE_journal_record($afile = __FILE__, $afunc = __FUNCTION__, $aline = __LINE__, $args = [], $nameargs = "", $message = "")

можно вставить в любое место кода указав нужные данные в массив args - вывод пойдет по тихому в журнал, а не бэк или не дай бог во фронт при fn_print_r

Это очень помогает при отладке кода, или отлова ошибки - в теле функции можно вставить 3, 5 и более вызовов и отследить как изменяются данные в процессе работы, при этом информация выводится не на экран одной “портянкой”, а компактно по шагам:

1 лайк

Приветсвую. Как получить этот модуль?
А то в Кроне сервера уже … ногу сломит…

А у вас одновитринный магазин?

Есть и одновитринник и двувитринник.
Пока хочу на одновитринник.

Тот же вопрос — хочу пощупать и потестить на мультивендоре (1 витрина)! Модуль будете делать платным?

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

Если бы это была реализация на уровне операционки примерно как в ISPmanager, то в таком случае это был бы очень даже рабочий инструмент.

Если использовать панель ISPmanager, то там уже все реализовано и кроны и уведомление на мыло по окончании работы, удобный просмотр логирование и множество других фишек. Если посчитать экономику, то панель ISPmanager на 10 доменов стоит 4950 рублей, но дак это полноценный инструмент. И с проделанной такой большой работой по написанию этого функционала придется конкурировать именно с ISPmanager и в цене и в ценности.

Резюмирую - Если реализовать на уровне связки с железом, БД, ОС и возможностью отслеживать все процессы на сервере - то это будет очень даже востребованный инструмент которым и мы с удовольствием будем пользоваться!

В Захид хосте нет например ИСП.
Да и неужели какой то простенький запрос раз в минуту так повлияет прям на сервер.

зачем isp там через админку спокойно ставится cron вы просто видимо не пытались найти где это делается.

не видимо. уже 2я страница закнчивается.

На самом деле конечно верное замечание, что каждую минуту запускается процесс, который запускает ядро карта, то есть ресурсы постоянно расходуются. Но. Если на текущий момент никакого задания нет (холостая проверка очереди задач) - это микросекунды (из минуты).
Для чего это делалось.
В первую очередь - для удобства. Во вторую - не все главные администраторы админки - владеют управлением и настройкой сервера.
Даже мне, заходя в webmin и глядя на список из 15-20-ти заданий - не так просто выделить нужное. И видя что что-то в магазине не так - не всегда и не сразу догадаешься, что надо заглянуть в админку сервера. Отыскать лог и в том логе - нужное место.
Сейчас - например не прошло обновление из 1С (у меня свой обработчик выгрузки) - я иду в список задач - если задача висит в незавершенном статусе - значит процесс обмена завис или завершился с ошибкой. Если завершен - смотрю в логе (список лога по конкретной задаче). Если есть Завершено с ошибкой - скорее всего там будет причина. В любом случае можно просмотреть вывод каждого запуска (весь консольный вывод пишется в лог, если запуск идет через консоль php).
Да, конечно, в первую очередь это удобство - при разработке, особенно последнее дополнение в виде функции записи в лог любых массивов данных. Особенно при отладке, когда уже в процессе эксплуатации вылезла непонятка. Ведь fn_print_r в админке - ломает админку, а на витрине это вообще неприемлемо без закрытия магазина.

Давайте пару дней я перепроверю код и мы обсудим. Делал давно, делал под себя, хочу во-первых сам вспомнить :slight_smile: , во-вторых - еще раз убедиться в “чистоте” кода.

Что мешает принт выводить на свой АЙПИШНИК? И ошибки будете видеть только вы и более никто, а так же легко сразу вывести принты которые опять же кроме вас никто не удивит!

На “моем” айпишнике сидит весь офис )
если я не в офисе - правлю код с телефона и тут с айпишником вообще не просто
а еще бывает надо отловить событие которое вообще неизвестно когда по времени может произойти

Мы легко справились с этим, выделенный сервер и все! А по ошибкам мы года три назад писали модуль отладчик ошибок, он был у нас в бесплатной версии, сейчас его в наш менеджер лицензий переносим.

На самом деле, вы молодец, что так заморочились! Если интегрировать чуть по глубже в ядро ОС то будет круто!

@alex_vp , приветсвую. Так модуль доступен или нет. В очередной раз закопался в Кроне и снова вот хочется что то с логами и удобством…