我的一个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?
谢谢。
发布于 2012-09-06 15:26:09
你最好的选择是实现你的连接过程。然后构建您的逻辑来尝试检查该文件。(我假设使用像ftp_nlist这样的东西)。如果由于任何原因出现错误,ftp_nlist将返回FALSE。此时,您可以让代码使用ftp_close关闭现有连接(如果由于某种原因连接已经关闭,则会返回FALSE ),然后再次运行连接序列。
您需要构建这样的逻辑:如果ftp_nlist多次失败,就会退出您的应用程序。不幸的是,在识别函数失败原因方面,各种ftp_*命令没有太多的深度,因此您必须围绕它构建额外的逻辑来进行补偿。
发布于 2020-02-26 22:05:53
我也有同样的问题。我还有一个复合问题:由于某些原因,无法区分实际错误和空响应(当文件列表为空时)。在这两种情况下,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连接),它将是一个包含单个项的数组。如果有错误,它将是一个空数组。
https://stackoverflow.com/questions/12294669
复制相似问题