PHP FTP文件传输失败/挂起时使用安全的ftp_ssl_connect连接(但与ftp_connect工作).<



我有一个PHP脚本工作时使用ftp_connect,但当使用ftp_ssl_connect它不工作。有人知道为什么吗?

当在只需要ftp_connect的远程服务器上运行脚本时,下面的脚本可以正常工作。但是,一旦切换到需要ftp_ssl_connect的服务器,脚本就会挂起,并且最终出现504错误,没有任何指示出了什么问题。我试图通过删除除登录之外的所有脚本进行调试,并且登录似乎可以自行工作,但是当我添加任何超出登录的请求时,它会导致504

<?php
// set up basic ssl connection
$ftp = ftp_ssl_connect('myremotesite.com');
// login with username and password
$login_result = ftp_login($ftp, 'username', 'password');
if (!$login_result) {
// PHP will already have raised an E_WARNING level message in this case
die("can't login");
}
// get list of files on given path
$files = ftp_nlist($ftp, '/1668161919_DATA/*add.zip') or
die("Could not find file");
$mostRecent = array(
'time' => 0,
'file' => null
);
foreach ($files as $file) {
// get the last modified time for the file
$time = ftp_mdtm($ftp, $file);

if ($time > $mostRecent['time']) {
// this file is the most recent so far
$mostRecent['time'] = $time;
$mostRecent['file'] = $file;
}
}
ftp_get($ftp,
"/home/mysite/public_html/wp-content/uploads/data-zipped/target.zip",
$mostRecent['file'], FTP_BINARY);
ftp_delete($ftp, $mostRecent['file']);
ftp_close($ftp);
?>

您的代码正在使用(默认)活动模式。在活动模式下,客户端(本例中为PHP)将其本地IP地址(在PORT命令中)发送到服务器,以便服务器连接回以进行数据传输。如果你在防火墙/NAT后面(我假设你是),通常会停止工作,因为本地IP地址在你的网络之外无效,所以服务器无法连接回来。

为什么它适用于纯未加密的FTP (ftp_connect)无论如何都可能是因为您的防火墙/NAT将PORT命令中的本地IP地址转换为外部有效的IP地址。但是对于加密的FTP (ftp_ssl_connect)它不能这样做。

一般来说,现在使用主动模式(由于无处不在的防火墙和NAT)是很麻烦的。使用被动语态。在ftp_login:

之后添加以下呼叫
ftp_pasv($ftp, true) or die("Cannot switch to the passive mode");

参见PHP ftp_put失败

相关内容

  • 没有找到相关文章

最新更新