Перезапуск скрипта процессора из админки автоматически
Здравствуйте.
Разрабатываю дополнение по импорту большого кол-ва товаров в минишоп2. Импорт запускается из админки. За импорт отвечает файл процессора synch.class.php.
Столкнулся с проблемой времени выполнения скрипта. Нужно грузить картинки со стороннего сайта, а это по примерным подсчётам на первый импорт всех товаров уйдёт около 2 часа работы. Ясное дело, что php не позволит так долго работать скрипту из браузера. Через консоль сервера запускать скрипт не получится, т.к. клиенту этого не объяснишь.
Думаю может получится как-то организовать автоматический перезапуск скрипта процессора с того места, на котором остановился, через, например, 20-50 товаров, либо через 20 секунд работы скрипта.
В связи с этим вопрос разработчикам дополнений: возможно ли отправлять в админку из процессора такой запрос, который автоматически в админке будет обрабатываться и перезапускать скрипт с нужного места, на котором остановились?
Решение под катом
Решение было найдено на гитхабе Василия, за что ему (и конечно Володе за помощь) — огромное СПАСИБО!
github.com/bezumkin/mSearch2/blob/master/core/components/msearch2/processors/mgr/index/create.class.php#L85
github.com/bezumkin/mSearch2/blob/master/assets/components/msearch2/js/mgr/widgets/index.form.js#L44
Разрабатываю дополнение по импорту большого кол-ва товаров в минишоп2. Импорт запускается из админки. За импорт отвечает файл процессора synch.class.php.
Столкнулся с проблемой времени выполнения скрипта. Нужно грузить картинки со стороннего сайта, а это по примерным подсчётам на первый импорт всех товаров уйдёт около 2 часа работы. Ясное дело, что php не позволит так долго работать скрипту из браузера. Через консоль сервера запускать скрипт не получится, т.к. клиенту этого не объяснишь.
Думаю может получится как-то организовать автоматический перезапуск скрипта процессора с того места, на котором остановился, через, например, 20-50 товаров, либо через 20 секунд работы скрипта.
В связи с этим вопрос разработчикам дополнений: возможно ли отправлять в админку из процессора такой запрос, который автоматически в админке будет обрабатываться и перезапускать скрипт с нужного места, на котором остановились?
Решение под катом
Решение было найдено на гитхабе Василия, за что ему (и конечно Володе за помощь) — огромное СПАСИБО!
github.com/bezumkin/mSearch2/blob/master/core/components/msearch2/processors/mgr/index/create.class.php#L85
github.com/bezumkin/mSearch2/blob/master/assets/components/msearch2/js/mgr/widgets/index.form.js#L44
Комментарии: 19
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
У нас в админке список файлов для импорта, мы кликнув на одном из них попадаем во всплывающее окно с указанием параметров выгрузки. Указываем параметры, жмём кнопку, данные передаются в процессор synch — импорт начался. Дойдя до определённой точки скрипт импорта отправляет данные обратно в админку, в админке этот ответ обрабатывается, если параметр «success» — 0, а «continue» — 1, то снова отправляем в скрипт процессора запрос с параметром «step» — 2, который означает, что импорт нужно продолжить.
Да, костыль, однако другого не придумать на связке PHP + JS.
По крайней мере я пользовался примером Николая-философа и это помогало делать пошаговую разбивку чтения больших данных.
2) Что-то я впервые такую фигню слышу, что sleep предотвращает max_execution_time.
3) В коде на сайте Ильи примерно то же, о чём я говорил. Просто реализовано непосредственно в компоненте Console и запускается через флажок completed установленный в сессию в $_SESSION['Console'].
П.С. Самому интересно стало. Надо будет попробовать.
Хотя последнее время, прихожу к идее, что любые массовые операции нужно фиксировать в таблице. После чего из нее получать к примеру последние 30 записей и производить массовые операции.
В этом плане и лог не нужен будет.
Получаем 30 записей отправляем их на exec_bg_script.
Ждем пока у этих 30 записей поставиться метка: завершено.
После чего получаем следующие 30 и продолжаем дальше.
Пока из обработки не уйдут все записи во временной таблице.
Так всегда можно отследить когда был запуск и завершение.
В общем нужна очередь, и какой то цикл который будет перезапускать всю эту процедуру.
Понятно что на 1000 ресурсов можно использовать. А если обновляется 100к ресурсов, Получается ответ не получен!
Очередь таких заданий забьет память и процессор.
Просто думаю как это встроить к примеру в msPre так как достаточно долго обновляется даже те же 2000 ресурсов при объеме в 100к.
Точней даже понимаю что это работать будет только, в безконтрольном режиме. И это проблема.
Через ajax посылать все запросы разом к примеру в 1000 запросов, и не ждать ответа. Что то типо через цикл запустить.