【问题标题】:Long running php script failing as a cron长时间运行的 php 脚本作为 cron 失败
【发布时间】:2011-10-24 21:05:26
【问题描述】:

我编写了一个 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);

在脚本的顶部。

谢谢。

【问题讨论】:

  • 你检查过日志吗?您是否设置了 cron 作业以将输出保存到某个日志文件?
  • 没看到代码,没法说。让脚本在每个主要状态输出一些调试/日志记录语句,并查看锁定之前的最后一个阶段是什么。
  • 尝试分解任务并添加调试消息,这样您就可以查看连接是否失败或上传等 - 也许在某个时候达到了上传限制(允许的总存储空间)? - 我认为我们需要更多信息。
  • @bobo 好吧,您可以尝试调用ftp_set_option($conn, FTP_TIMEOUT_SEC, 10); 将默认的 90 秒超时时间缩短到 10 秒,看看是否有帮助...
  • 是的,但是如果这开始导致您的脚本终止,您知道这可能是 FTP 服务器的问题,而不是您的脚本的问题。您也可以尝试使用带有完整 FTP url 的 file_put_contents(),而不是使用 FTP 扩展名。我可能会做的是离开Wireshark,看看你的脚本和FTP服务器之间的网络流量,看看那里是否有任何线索......

标签: php cron scheduled-tasks


【解决方案1】:

我正在做类似的事情,我发现以下内容可以提供帮助:

1) 确保每一步都是有条件的,因此如果加载失败(如图像、ftp 连接等),程序会继续运行(迭代)。

2) 在文件末尾(或困难步骤之间)设置一个小的sleep()。我也将它用于图像,当与图像的连接滞后或“图像写入”时间滞后时,它会有所帮助。

3) 将调度程序设置为经常执行脚本(我是一天 2 次),但只要您选中此框,它就可以设置为每小时:如果脚本已经在运行,请不要启动新实例

4) 根据您的服务器设置,检查可能会中断脚本运行时的其他任务。它并不总是 PHP 问题。只要您有正确安排的任务来重新执行脚本就可以了。

5) 为了便于调试,在“不存在”或“连接失败”之外,使用简单的文件日志记录(如 $message = fopen($myLogFile, 'w');)代替 echo 语句(最有可能显示在您的 cmd 窗口中)声明并包含更多详细信息,以便在失败时,您可以转到日志文件并查看失败的时间和原因。

6) 您可以尝试使用无限循环,例如 (while (true) { ... your code... }) 而不是 the set_time_limit()

我希望这会有所帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2011-05-10
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    相关资源
    最近更新 更多