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


PHP - Verifying FTP connection - Detect FTP Timeout

我的一个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吗?

谢谢。

您最好实现连接过程。然后构建用于尝试检查文件的逻辑。(我假设使用类似ftp_nlist的东西)。如果由于任何原因出现错误,ftp_nlist将返回FALSE。此时,您可以让代码使用ftp_close关闭现有连接(如果由于任何原因连接已经关闭,则会显示FALSE),然后再次运行连接序列。

如果ftp_nlist多次失败而退出应用程序,您需要构建这样的逻辑。不幸的是,各种ftp_*命令在识别函数失败的原因方面没有太多深度,因此您将不得不围绕它构建额外的逻辑来进行补偿。

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

所以我的第一个预感是打一个廉价的电话,比如ftp_pwd,看看连接是否仍然打开。然而,PHP显然做了一些缓存,所以这不起作用。但是,您可以使用以下命令强制PHP通过FTP连接运行相同的调用:

$result = ftp_raw($ftpConnection, 'pwd');
print_r($result);
// Array
// (
//     [0] => 257 "/www/html"
// )

这应该总是给出一个响应(给定一个工作的FTP连接),它将是一个带有单个项的数组。如果出现错误,它将是一个空数组。