Здравствуйте. Проблема в следующем. Пишу модуль импорта под друпал из xml большого размера, порядка 5000 записей. Функция импорта будет запускаться по крону, раз в сутки. Возможность запуска импорта должна быть организована и по нажатию кнопки в админке. Вопрос в том как реализовать функцию непосредственного импорта материалов. Сейчас все упирается в максимальное время выполнения функции. Хотелось бы чтобы функция, выполнялась максимально возможное время, потом записывала в БД позицию где остановилась. И тут же запускалась снова эта функция, но уже с новой позиции. Когда весь файл прочитан, то в бд меняется статус задачи на "complete" и функция прекращает свое выполнение.
сформулируйте вопрос. в чем собственно остновная проблема? в времени исполнения скрипта? поставьте max_execution_time в ноль. и скрипт будет выполняться столько сколько вам нужно.
Тут всё похоже на постраничную навигацию, разве нет? Допустим решаем, что за раз надо обрабатывать 100 строк. Пусть GET-параметр "p" это номер страницы. В случае открытия через браузер надо рефрешить через meta refresh или javascript на следующую страницу, если данные ещё не закончились. В случае крона надо скрипт-обертку с циклом и контролем возвращаемого кода чтобы обнаружить конец.
Сейчас скрипт так и работает. Установлен set_time_limit(0). Но хотелось бы решение сделать универсальным что ли, в случае если на хостинге будет запрет на max_execution_time то скрипт, работать не будет. Можно поподробней что за скрипт-обертка?
По крону вы же не браузер будете стартовать с нужной страницей ))) Допустим по cron будет выполняться скрипт с вызовом wget. wget может возвращать ненулевой exit-code если сервер вернул ошибку. Т.е. вызываем wget в цикле, постоянно увеличивая номер страницы. Нормально wget завершается с кодом 0. Как только номер страницы превысит реальную величину — в PHP вернём 404 статус. При этом wget завершится с кодом 8, согласно его документации. Это можно использовать чтобы остановить цикл в крон-скрипте. Так понятнее?
Пытался на форумах подставить несуществующий p=999, так все движки как сговорились возвращают статус 200, а не 404 ))) Пример сумел придумать на базе Вики: существовало только 3 лунохода. mytask.sh Код (Text): #!/bin/bash for i in {1..99} do echo "Lunokhod_$i:" wget http://en.wikipedia.org/wiki/Lunokhod_$i -O /dev/null -o /dev/null EXITCODE=$? if [ $EXITCODE -ne 0 ] then echo "Exit code was $EXITCODE" break else echo "ok" fi done скриншот блин Код (Text): $ bash mytask.sh Lunokhod_1: ok Lunokhod_2: ok Lunokhod_3: ok Lunokhod_4: Exit code was 8
А как php-скриптом вернуть null wget, если кол-во страниц динамическое? Т.е. по факту-то страница существует и будет ли ответ от php с этой страницы со статусом 404 достаточным?