我的一个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吗?
感谢。
答案 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连接正常),该响应将是一个包含单个项目的数组。如果有错误,它将是一个空数组。