Сбой долго работающего php-скрипта как cron

#php #cron #scheduled-tasks

#php #cron #запланированные задачи

Вопрос:

Я написал PHP-скрипт, который загружает изображения из каталога на удаленный сервер с помощью ftp_put. Я установил это как cron, используя планировщик задач и wget. Изначально он отлично работает, но затем через некоторое время, не знаю точно, когда, процесс зависает, из-за того, что «планировщик задач Windows» говорит, что он выполняет задание, но никакие фотографии больше не загружаются.

Изначально я думал, что проблема связана с max_execution_time , но я установил это значение на 24 часа, используя set_time_limit(3600 * 24); и я установил max_input_time на 600 секунд (10 минут).

Почему он не выполняет задачу?

Вот код:

 if($conn){
    if (is_dir($imagesPath)){
        if($files = opendir($imagesPath)){
            while(($file = readdir($files)) !== false){
                if($file != "." amp;amp; $file != ".." amp;amp; preg_match("/.jpg|.JPG|.gif|.GIF|.png|.PNG|.bmp|.BMP/",$file) amp;amp; date("Ymd",filemtime($imagesPath.'/'.$file)) >= date("Ymd",strtotime(date("Y-m-d")." -".$days." day"))){
                    if(ftp_put($conn, $remotePath.$file, $imagesPath.'/'.$file, FTP_BINARY)){
                        //echo $file;
                        $counter  ;
                    }
                    else{
                        echo '<br>'.$imagesPath.'/'.$file;
                    }
                }
            }
            closedir($files);
            echo $counter.' Files Uploaded on '.date("Y-m-d");
        }
        else{
            echo 'Unable to read '.$imagesPath;
        }
    }
    else{
        echo $imagesPath.' Does not exist';
    }
    ftp_close($conn);
}else{
    echo "Failed to connect";
}
/* End */
exit;
  

Добавлено:

 /* Settings */
// Set Max Execution time
set_time_limit(3600*24);
  

в верхней части скрипта.

Спасибо.

Комментарии:

1. вы проверяли журналы? вы настроили задание cron для сохранения выходных данных в какой-либо файл журнала?

2. Не видя кода, невозможно сказать. Пусть скрипт выплюнет несколько инструкций отладки / ведения журнала в каждом основном состоянии и посмотрит, какой был последний этап перед его блокировкой.

3. Попробуйте разбить задачи и добавить отладочные сообщения, Чтобы вы могли видеть, происходит ли сбой соединения или загрузка и т. Д. — Может быть, в какой-то момент достигнут предел загрузки (общее разрешенное хранилище)? — Я думаю, нам нужно больше информации здесь.

4. @bobo Ну, вы могли бы попробовать позвонить ftp_set_option($conn, FTP_TIMEOUT_SEC, 10); , чтобы уменьшить 90-секундный тайм-аут по умолчанию до 10 секунд, и посмотреть, поможет ли это…

5. Да, но если это начинает приводить к завершению работы вашего скрипта, вы знаете, что это, вероятно, проблема с FTP-сервером, а не с вашим скриптом. Вы также можете попробовать использовать file_put_contents() с полным URL-адресом FTP вместо использования расширения FTP. Что я, вероятно, сделал бы, так это вытащил Wireshark и посмотрел на сетевой трафик между вашим скриптом и FTP-сервером, чтобы посмотреть, есть ли там какие-либо подсказки…

Ответ №1:

Я работаю над чем-то подобным, и я нашел следующее, чтобы помочь:

1) убедитесь, что каждый шаг является условным, Поэтому, если что-то не загружается (например, изображение, ftp-соединение и т. Д.), Процедура продолжает выполняться (повторяется).

2) установите значение small sleep() в конце файла (или между сложными шагами). Я также использую его для изображений, и когда соединение с изображением отстает или время записи изображения отстает, это помогает.

3) настройте планировщик на частое выполнение скрипта (мой — 2 раза в день), но его можно установить на ежечасно, если вы установите флажок: не запускать новый экземпляр, если скрипт уже запущен

4) в зависимости от настроек вашего сервера проверьте, нет ли других задач, которые могут прервать выполнение скрипта. Это не всегда проблема с PHP. Пока у вас есть правильно запланированная задача для повторного выполнения скрипта, все должно быть в порядке.

5) для упрощения отладки вместо оператора echo (который, скорее всего, отображается в вашем окне cmd) используйте простое ведение журнала файлов, например ( $message = fopen($myLogFile, 'w'); ), в дополнение к вашим операторам «Не существует» или «Не удалось подключиться», и включите более подробную информацию, чтобы в случае сбоя вы могли перейти к своему журналуфайл и посмотрите, когда и почему произошел сбой.

6) вы можете попробовать использовать бесконечный цикл, подобный ( while (true) { ... your code... } ) вместо the set_time_limit() .

Надеюсь, это поможет 🙂