我编写了一个PHP脚本,使用ftp_put将图像从目录上传到远程服务器。我使用任务调度程序和wget将其设置为cron。最初它运行良好,但过了一段时间,不知道确切的时间,过程冻结,“Windows任务调度程序”说它正在运行作业,但没有照片不再被上传。
最初我认为问题是由于max_execution_time,但我已经使用set_time_limit(3600 * 24)将其设置为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);
位于脚本的顶部。
感谢。
答案 0 :(得分:0)
我正在研究类似的东西,我发现以下内容可以提供帮助:
1)确保每一步都是有条件的,这样如果某些内容无法加载(如图像,ftp连接等),程序将继续运行(迭代)。
2)在文件末尾(或困难步骤之间)设置一个小sleep()
。我也将它用于图像,当与图像的连接滞后或“图像写入”时间滞后时,它会有所帮助。
3)将调度程序设置为经常执行脚本(我每天2次),但只要您选中该框,就可以将其设置为每小时:如果脚本已在运行,则不启动新实例强>
4)根据服务器的设置,检查可能会中断脚本运行时的其他任务。它并不总是PHP问题。只要您有正确安排的任务来重新执行脚本,您应该没问题。
5)为了便于调试,而不是echo语句(最有可能在你的cmd窗口中显示)使用一个简单的文件记录,如($message = fopen($myLogFile, 'w');
)另外你的“不存在”或“失败”连接“语句并包含更多详细信息,以便在失败时,您可以转到日志文件,查看失败的时间和原因。
6)您可以尝试使用类似(while (true) { ... your code... }
)的无限循环而不是the set_time_limit()
。
我希望这会有所帮助:)