firstfrost
25.04.2016 - 12:54
Здравствуйте! Есть необходимость выполнять объемный скрипт, состоящий из однотипных итераций. Чтобы его выполнение не "резалось", он был разделен на части. После завершения текущий части идет вызов следующей через curl.
Верно ли составлен алгоритм, в котором по завершению текущей части, она запускает следующую? Тестирование показывает что 9 из 11 частей срабатывают, а потом 504 и оставшиеся части обрубаются.
Подскажите, как можно решить этот вопрос? Есть ли альтернатива запуску по cron, чтобы запуск каждой следующий части был сразу после завершения текущей?
Цитата |
Есть ли альтернатива запуску по cron |
Вообще-то именно так и нужно. И не нужно будет делить на части.
А если запускаешь через браузер – другие части дергай не с сервера, а с клиента.
firstfrost
25.04.2016 - 13:07
Цитата (Guest @ 25.04.2016 - 13:00) |
Цитата | Есть ли альтернатива запуску по cron |
Вообще-то именно так и нужно. И не нужно будет делить на части.
А если запускаешь через браузер – другие части дергай не с сервера, а с клиента.
|
Цитата |
Вообще-то именно так и нужно. И не нужно будет делить на части. |
Делить на части нужно в любом случае, т.к. выполнение всех итераций за 1 проход дольше максимального времени выполнения скрипта.
Цитата |
А если запускаешь через браузер – другие части дергай не с сервера, а с клиента. |
Запуск первой части происходит через cron в определенное время, соответственно, ajax тут врятли поможет.
Запускаешь через cron как? Через веб-сервер (иначе кто же тогда 504 отдает):
curl http://site.ru/script.php
Если так – то это неправильно.
Нужно так:
php /home/www/site.ru/script.php
firstfrost
25.04.2016 - 13:20
да, запускаю через curl, т.к. нужно передать GET-данные.
насколько я знаю, при вызове через php ... GET-переменные не работают.
Верно?
Не работают.
Передают через командную строку:
php /home/www/site.ru/script.php param1 param2 paramN
http://php.net/manual/ru/reserved.variables.argv.php
firstfrost
25.04.2016 - 13:24
Благодарю!
Какие преимущества дает запуск через php ...?
Как это поможет решить данный вопрос?
Ну как минимум не упрешься в Nginx'овский max_execution_time.
Если у тебя VPS/свой сервер – то просто пропиши set_time_limit(0) и не нужно будет делить скрипт на части.
А если shared-хостинг или еще по каким-то причинам нельзя сделать set_time_limit(0) – то следующую часть запускай "асинхронно":
part1.php:
...
shell_exec('php /home/www/site.ru/part2.php &'); // вообще погугли как это правильно делать
exit(0);
Кстати, думаю это должно сработать и если будешь через curl запускать. Может даже не потребуется вообще ничего переделывать.
killer8080
25.04.2016 - 14:38
Цитата (firstfrost @ 25.04.2016 - 13:24) |
Какие преимущества дает запуск через php ...? |
тем что задача запускается в бэкграунде и не отнимает у вебсервера ресурсы понапрасну.
В CLI php использует другой ini файл, в котором обычно по дефолту нет ограничения времени выполнения. Кстати этот момент нужно учитывать, т.к. нужные расширения в нем могут быть не подключены, тогда нужно передать требуемые ini опции аргументами.
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.