За последние 24 часа нас посетили 7922 программиста и 449 роботов. Сейчас ищут 249 программистов ...

Скрипт php падает без причины

Тема в разделе "Настройка веб-сервера", создана пользователем sitesoft1, 22 мар 2020.

  1. sitesoft1

    sitesoft1 Новичок

    С нами с:
    22 мар 2020
    Сообщения:
    2
    Симпатии:
    0
    Здравствуйте уважаемые форумчане.
    Прошу подсказки у тех кто имеет опыт написания парсеров, демонов либо других "долгоиграющих" php скриптов. Суть такая пишу скрипт загрузки товаров в интернет магазин из xml прайса. Столкнулся с той проблемой что на моем сервере парсер отрабатывает нормально, однако на хостинге клиента прекращает работу спустя 20-60 минут после запуска. В итоге я решил проверить как долго вообще будет выполнятся php скрипт на клиентском хостинге, для проверки написал что то вроде демона:
    PHP:
    1. <?php
    2. ini_set('max_execution_time', 0);
    3. ini_set("memory_limit", "128M");
    4. ini_set('error_reporting', E_ALL);
    5. ini_set('display_errors', 1);
    6. ini_set('display_startup_errors', 1);
    7.  
    8. function shutdown()
    9. {
    10.     file_put_contents(__DIR__ . '/log/shutdown_log.txt', 'Выполнили функцию shutdown!'.PHP_EOL, FILE_APPEND);
    11.     $err_arr = error_get_last();
    12.     $err = 'type - '.$err_arr['type'] . ' | message - '. $err_arr['message'] . ' | file - '.$err_arr['file']. ' | line - '.$err_arr['line'];
    13.     file_put_contents(__DIR__ . '/log/shutdown_log.txt', $err, FILE_APPEND);
    14.    
    15. }
    16.  
    17. function sig_handler($signo)
    18. {
    19.     $info = "\n" . 'received signal ' . $signo . "\n";
    20.     $info .= "\n" . 'Выполнили функцию sig_handler! ' . $signo . "\n";
    21.     file_put_contents(__DIR__ . '/log/sig_handler_log.txt', $info.PHP_EOL, FILE_APPEND);
    22.     $err_arr = error_get_last();
    23.     $err = 'type - '.$err_arr['type'] . ' | message - '. $err_arr['message'] . ' | file - '.$err_arr['file']. ' | line - '.$err_arr['line'];
    24.     file_put_contents(__DIR__ . '/log/sig_handler_log.txt', $err, FILE_APPEND);
    25.     exit;
    26. }
    27.  
    28. declare(ticks = 1);
    29. pcntl_signal(SIGTERM, "sig_handler");
    30. pcntl_signal(SIGINT, "sig_handler");
    31.  
    32.  
    33. $time = date('H-i-s');
    34. file_put_contents(__DIR__ . '/log/time_test_ON.txt', $time);
    35.  
    36. while(true){
    37.     $time = date('H-i-s');
    38.     file_put_contents(__DIR__ . '/log/time_test_log.txt', $time);
    39.     sleep(1);
    40. }
    После запуска демона через консоль, он прекращает работу примерно через 20 минут, при этом shutdown() и sig_handler() - никаких логов не создают. Хотя если убить скрипт через консоль командой kill pid то обе функции отрабатывают нормально, то есть логи создаются. Вот phpinfo хостинга.

    В общем я в тупике, предполагаю что это некое ограничение на хостинге, однако не могу понять в чем именно оно состоит и как его пофиксить.
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    2.332
    Симпатии:
    462
    Адрес:
    Татарстан
    ну во первых, php как-бы не очень предназначен для демонов и прочих долгоиграющих вещей, его философия: отработал - умри
    во вторых, демонов и прочие вещи запускать на обычном хостинге вам никто не даст, нужен по крайней мере vps/vds
    ну и в третьих, вы сами же обозначили что на вашем сервере успевает отработать, а на хостинге клиента нет - меняйте хостинг

    ну и и непонятен цикл while (tru) - я так понимаю чтоб примерно оценить сколько времени дано скрипту на жизнь?
    может импорт или что у вас там разбить на небольшие блоки и запускать поэтапно по крону?
     
  3. sitesoft1

    sitesoft1 Новичок

    С нами с:
    22 мар 2020
    Сообщения:
    2
    Симпатии:
    0
    Получил ответ от хостинга:
    "Здравствуйте, на наших серверах виртуального хостинга есть ограничение в 1200 секунд на время работы пользовательского процесса. Запущенные Вами процессы были остановлены при превышении данного лимита:" - так что таки да на их стороне была проблема.
    while (tru) - да был просто чтобы протестировать время работы скрипта. В общем буду либо хостинг менять либо действительно переделывать логику. Правда не совсем понятно как ее правильно переделать, ведь xml файл это все таки не база данных, там чтобы начать парсинг с момента последнего обрыва придется пробежать весь файл в цикле до нужного оффера, боюсь как бы это не заняло те же 20 минут, хотя по идее не должно конечно.
    --- Добавлено ---
    В целом согласен, но у меня например на своем сервере еще на php5 крутится несколько парсеров и других долго играющих скриптов по загрузке/выгрузке различной информации, которые прекрасно работают годами. Так что на пыхе это все вполне можно делать, есть куча удобных библиотек для парсинга и т.д. Другое дело что заказчики как правило по незнанию берут виртуальный хостинг, а потом начинаются вот эти танцы с бубном. :) Так что в будущем буду всех предупреждать что такие задачи только на vds.