我有一个php脚本,当使用ftp_connect时可以工作,但是当使用ftp_ssl_connect时就不行了。有人知道为什么吗?当在只需要ftp_connect的远程服务器上运行这个脚本时,下面的脚本工作没有问题。2但是当我切换到一个需要ftp_ssl_connect的服务器时,脚本挂起,我以一个504错误结束,没有任何错误的指示。我尝试通过删除除登录之外的所有脚本进行调试,登录似乎可以独立工作,但是当我添加登录之外的任何请求时,它会导致504
// 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);
?>
1条答案
按热度按时间ki1q1bka1#
你的代码使用的是(默认的)主动模式。在主动模式下,客户端(PHP)发送它的本地IP地址(在
PORT
命令中)到服务器,服务器连接回来进行数据传输。如果你在防火墙/NAT(我假设你是)后面,通常会停止工作,因为本地IP地址在你的网络之外是无效的,所以服务器无法连接回来。为什么它对你的普通 unencrypted FTP(
ftp_connect
)有效,很可能是因为你的防火墙/NAT将PORT
命令中的本地IP地址转换为外部有效的地址,但它不能对 encrypted FTP(ftp_ssl_connect
)这样做。一般来说,现在使用主动模式(由于防火墙和NAT无处不在)比较麻烦,使用被动模式,在
ftp_login
后面添加如下 call:另请参见PHP ftp_put fails。