#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()
.
Надеюсь, это поможет 🙂