Здравствуйте уважаемые форумчане. Прошу подсказки у тех кто имеет опыт написания парсеров, демонов либо других "долгоиграющих" php скриптов. Суть такая пишу скрипт загрузки товаров в интернет магазин из xml прайса. Столкнулся с той проблемой что на моем сервере парсер отрабатывает нормально, однако на хостинге клиента прекращает работу спустя 20-60 минут после запуска. В итоге я решил проверить как долго вообще будет выполнятся php скрипт на клиентском хостинге, для проверки написал что то вроде демона: PHP: <?php ini_set('max_execution_time', 0); set_time_limit(0); ini_set("memory_limit", "128M"); ignore_user_abort(true); ini_set('error_reporting', E_ALL); ini_set('display_errors', 1); ini_set('display_startup_errors', 1); function shutdown() { file_put_contents(__DIR__ . '/log/shutdown_log.txt', 'Выполнили функцию shutdown!'.PHP_EOL, FILE_APPEND); $err_arr = error_get_last(); $err = 'type - '.$err_arr['type'] . ' | message - '. $err_arr['message'] . ' | file - '.$err_arr['file']. ' | line - '.$err_arr['line']; file_put_contents(__DIR__ . '/log/shutdown_log.txt', $err, FILE_APPEND); } function sig_handler($signo) { $info = "\n" . 'received signal ' . $signo . "\n"; $info .= "\n" . 'Выполнили функцию sig_handler! ' . $signo . "\n"; file_put_contents(__DIR__ . '/log/sig_handler_log.txt', $info.PHP_EOL, FILE_APPEND); $err_arr = error_get_last(); $err = 'type - '.$err_arr['type'] . ' | message - '. $err_arr['message'] . ' | file - '.$err_arr['file']. ' | line - '.$err_arr['line']; file_put_contents(__DIR__ . '/log/sig_handler_log.txt', $err, FILE_APPEND); exit; } register_shutdown_function('shutdown'); declare(ticks = 1); pcntl_signal(SIGTERM, "sig_handler"); pcntl_signal(SIGINT, "sig_handler"); $time = date('H-i-s'); file_put_contents(__DIR__ . '/log/time_test_ON.txt', $time); while(true){ $time = date('H-i-s'); file_put_contents(__DIR__ . '/log/time_test_log.txt', $time); sleep(1); } После запуска демона через консоль, он прекращает работу примерно через 20 минут, при этом shutdown() и sig_handler() - никаких логов не создают. Хотя если убить скрипт через консоль командой kill pid то обе функции отрабатывают нормально, то есть логи создаются. Вот phpinfo хостинга. В общем я в тупике, предполагаю что это некое ограничение на хостинге, однако не могу понять в чем именно оно состоит и как его пофиксить.
ну во первых, php как-бы не очень предназначен для демонов и прочих долгоиграющих вещей, его философия: отработал - умри во вторых, демонов и прочие вещи запускать на обычном хостинге вам никто не даст, нужен по крайней мере vps/vds ну и в третьих, вы сами же обозначили что на вашем сервере успевает отработать, а на хостинге клиента нет - меняйте хостинг ну и и непонятен цикл while (tru) - я так понимаю чтоб примерно оценить сколько времени дано скрипту на жизнь? может импорт или что у вас там разбить на небольшие блоки и запускать поэтапно по крону?
Получил ответ от хостинга: "Здравствуйте, на наших серверах виртуального хостинга есть ограничение в 1200 секунд на время работы пользовательского процесса. Запущенные Вами процессы были остановлены при превышении данного лимита:" - так что таки да на их стороне была проблема. while (tru) - да был просто чтобы протестировать время работы скрипта. В общем буду либо хостинг менять либо действительно переделывать логику. Правда не совсем понятно как ее правильно переделать, ведь xml файл это все таки не база данных, там чтобы начать парсинг с момента последнего обрыва придется пробежать весь файл в цикле до нужного оффера, боюсь как бы это не заняло те же 20 минут, хотя по идее не должно конечно. --- Добавлено --- В целом согласен, но у меня например на своем сервере еще на php5 крутится несколько парсеров и других долго играющих скриптов по загрузке/выгрузке различной информации, которые прекрасно работают годами. Так что на пыхе это все вполне можно делать, есть куча удобных библиотек для парсинга и т.д. Другое дело что заказчики как правило по незнанию берут виртуальный хостинг, а потом начинаются вот эти танцы с бубном. Так что в будущем буду всех предупреждать что такие задачи только на vds.