我的一个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_connect
和ftp_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连接),它将是一个带有单个项的数组。如果出现错误,它将是一个空数组。