Длительный PHP-скрипт не работает как cron - PullRequest
0 голосов
/ 25 октября 2011

Я написал скрипт 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 != "." && $file != ".." && preg_match("/\.jpg|\.JPG|\.gif|\.GIF|\.png|\.PNG|\.bmp|\.BMP/",$file) && 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 Ответ

0 голосов
/ 07 ноября 2013

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

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

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

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

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

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

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

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

...