PHP - 验证FTP连接 - 检测FTP超时

时间:2012-09-06 07:06:23

标签: php

我的一个CLI脚本通过FTP下载文件。

该脚本打开FTP连接,登录,下载必要的文件并休眠。它经常会再次检查文件。该脚本预计将作为守护进程运行数天。

我希望能够重新使用开放连接(因此我不必重新连接每个循环)。

$ftpconn = false;
$ftplogin = false;

while(1){

sleep(25);
if(!$ftpconn){
    $ftpconn = ftp_connect(HOST);
}
if(!$ftplogin){
    $ftplogin = ftp_login($ftpconn, USER, PASS);
}

// Do FTP stuff here

}

我的问题是这个。 ftp_connectftp_login都会超时吗?如果是这样,$ftpconn$ftplogin会在发生这种情况时变为FALSE吗?

感谢。

2 个答案:

答案 0 :(得分:1)

你最好的选择是实现你的连接过程。然后构建您的逻辑以尝试检查文件。 (我假设使用像ftp_nlist这样的东西)。如果出于任何原因出错,ftp_nlist将返回FALSE。此时,您可以使用ftp_close关闭现有连接(如果连接因任何原因已经关闭,则会给出FALSE),然后再次运行连接序列。

如果ftp_nlist失败多次以退出应用程序,您将需要构建逻辑。不幸的是,各种ftp_ *命令在确定函数失败的原因方面没有太多深度,所以你必须围绕它构建额外的逻辑来补偿。

答案 1 :(得分:0)

我遇到了同样的问题。我还有一个复杂的问题:由于某种原因,无法区分实际错误和空响应(文件列表为空时)。在这两种情况下,ftp_nlist都返回FALSE(也称为here),在两种情况下,ftp_rawlist都返回一个空数组。

所以我的第一个直觉是打个便宜的电话,例如ftp_pwd,以查看连接是否仍然打开。但是,PHP显然进行了一些缓存,因此无法使用。但是,您可以使用以下方法强制PHP通过FTP连接运行相同的调用:

$result = ftp_raw($ftpConnection, 'pwd');
print_r($result);

// Array
// (
//     [0] => 257 "/www/html"
// )

这应该总是 给出响应(考虑到FTP连接正常),该响应将是一个包含单个项目的数组。如果有错误,它将是一个空数组。