php 文件传输协议连接与文件传输协议ssl连接

fkaflof6  于 2022-12-17  发布在  PHP
关注(0)|答案(1)|浏览(161)

我有一个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);
?>
ki1q1bka

ki1q1bka1#

你的代码使用的是(默认的)主动模式。在主动模式下,客户端(PHP)发送它的本地IP地址(在PORT命令中)到服务器,服务器连接回来进行数据传输。如果你在防火墙/NAT(我假设你是)后面,通常会停止工作,因为本地IP地址在你的网络之外是无效的,所以服务器无法连接回来。
为什么它对你的普通 unencrypted FTP(ftp_connect)有效,很可能是因为你的防火墙/NAT将PORT命令中的本地IP地址转换为外部有效的地址,但它不能对 encrypted FTP(ftp_ssl_connect)这样做。
一般来说,现在使用主动模式(由于防火墙和NAT无处不在)比较麻烦,使用被动模式,在ftp_login后面添加如下 call

ftp_pasv($ftp, true) or die("Cannot switch to the passive mode");

另请参见PHP ftp_put fails

相关问题