3

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

谢谢。

4

2 回答 2

1

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

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

于 2012-09-06T07:26:09.470 回答
0

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

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

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

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

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

于 2020-02-26T14:05:52.837 回答