24 апр. 2013 г., 14:19

Процессоры, требующие большое количество времени на выполнение

Добрый день, столкнулся с задачей, когда процессор может выполняться несколько минут (возможно часов). Вопрос такой, как наиболее правильно с учетом архитектуры Modx реализовать подобный процессор. В системе есть довольно удобный механизм взаимодействия через modRegistry между процессором и скриптами, но ограничение на выполнение скрипта заведомо меньше самого времени выполнения процессора.
Добрый день. Здесь вопрос MODX-а как бы и не касается. Это вопрос выполнения долгих php-скриптов в принципе. На этот счет на хабре есть отличная статья: habrahabr.ru/post/175651/ А процессор вы можете выполнять как угодно, если позволите серверу обрабатывать скрипты дольше.
Спасибо за ссылку, но меня больше интересует не вопрос, как это реализовать (это обсуждалось многократно), а вопрос как это наиболее красиво интегрировать в Modx, чтобы не потерять функционал процессоров. Ведь что по сути происходит — разработчику необходимо написать свой скрипт, не связанный с modx, который может использовать ModxApi (при этом теряется возможность дефолтной проверки прав пользователя из чего следует невозможность запускать процессоры через runProcessor). Этот скрипт будет вызываться из modProcessor и таким образом modProcessor становится лишь промежуточным звеном по сути не нужным. Интуиция подсказывает мне, что должен существовать способ запуска процессора в другом режиме, скажем, через CLI, чтобы наиболее легко миновать все ограничения (ограничения php, ограничение apache сервера и, возможно, какие-то еще). Немного переформулирую вопрос. Возможно ли запускать процессор через, например, system желательно без изменения ядра?
Короткий вопрос на вопрос: а как вы вообще планируете запускать PHP-скрипт без PHP? Мне кажется, вы немного перефантазировали. Процессор без MODX — это тоже какая-то фантастика, учитывая, что инстанс процессора создается с передачей в него объекта $modx.
Нет, я не перемудрил. Я не писал «Запустить процессор без ModX», я прекрасно понимаю, что это полная ерунда. Предположим, что задача стоит в том, чтобы запустить процессор «в отдельном потоке». Совершенно очевидно, что для этого необходимо инициализировать инстанс ModX. Можно ли вообще запустить ModX в режиме CLI (установка в режиме CLI прекрасно работает) хотя бы только для того, чтобы выполнить определенный процессор? Мой вопрос является больше теоретическим, чем практическим. Практически я могу воспользоваться приведенной вами ссылкой и решить аналогичную задачу.
bezumkin.ru/sections/php/63/ bezumkin.ru/sections/php/170/ Вам ни что не мешает создать обычный php-файл, проинициализировать в нём modx и работать с ним (modx'ом), пользуясь стандартным api (в т.ч. процессорами).
А для этого php-файла можно выставить свои настройки таймаута или запускать его по крону.
В index.php есть такое дело MODX_API_MODE. Может вам поможет. Но самое надежное — это изучить классы xPDO и modX. Если вам нужна только работа с базой данных и небольшая часть API, то достаточно вызывать инстанс xPDO. Но если более расширенные возможности, то придется уже инстанс modX запускать, а вот там уже инициируется все до кучи, в том числе несколько классов, все расширения (extentionPackages), сессия и пользователь. (см modX::__construct() и modX::initialize()). И от этого без танцев никуда не деться. Хоть как вы это вызывайте. Так что если вы хотите это все облегчить, вам придется или расширять modX, или для надежности вообще его копировать и половину вырезать.
Вам ни что не мешает создать обычный php-файл, проинициализировать в нём modx
Написал ниже:
то придется уже инстанс modX запускать, а вот там уже инициируется все до кучи, в том числе несколько классов, все расширения (extentionPackages), сессия и пользователь.
Имеющийся в MODX CLI-режим практические ничего не облегчает. Там все инифиируется в полном объеме на уровне создания инстанса объекта. Потому выносить в отдельный файл — это вообще никак не отличается от использования стандартных коннекторов и процессоров, за небольшим исключением — коннектор проверяет права на выполнения и формирует ответ. Эту мелочь можете облегчить, но придется самому дописывать, если что-то понадобится. ИМХО такой финт вообще ни к чему, овчинка не стоит выделки. А вот в своем коннекторе уже можно прописать таймлимиты.

Добавить комментарий