0

我正在尝试使用 PHP 将文件上传到远程 FTP 服务器(需要 FTPES)。我编写的脚本在本地工作,但在实时服务器上 ftp_login() 返回 false 并且错误日志中出现以下警告:

PHP Warning:  ftp_login(): failed to create the SSL context [...]
PHP Warning:  ftp_login(): AUTH command ok; starting SSL connection. [...]

我知道登录详细信息是正确的(因为相同的代码在本地工作)。我可以在命令行上使用 curl 从实时服务器成功连接到 FTP 服务器。

该服务器正在运行 PHP 5.3.3(CentOS 上的 Zend Server)。我可以从 phpinfo 看到 PHP 配置命令包括 -with-openssl=/usr/local/openssl-0.9.8o

代码很简单:

$ftpConnection = ftp_ssl_connect('hostname');
if (!$ftpConnection) {
    echo "Failed to connect to FTP Site\n";
    return false;
}
if (!ftp_login($ftpConnection, 'xxxxx', 'xxxxx')) {
    echo "Failed to login to FTP site\n";
    return false;
}

作为参考,我的本地盒子(它工作正常)正在运行 PHP 5.3.3-1ubuntu9.3。

谁能指出我正确的方向?

编辑:我注意到此服务器的 SSL 证书实际上无效,因为我要连接的主机名与证书上的公用名不匹配。是否有 PHP 设置控制它或 openSSL 对证书错误的严格程度?这可能是唯一的问题。

4

1 回答 1

1

我最终通过更改代码以使用 PHP cURL 函数解决了这个问题,因为我知道我可以从命令行正常连接。可能有办法让它与 FTP 功能一起使用,但如果这对其他人有帮助,这是我的工作 cURL 版本:

$ch = curl_init();
curl_setopt_array($ch, array(
    CURLOPT_URL => 'ftp://username:password@hostname/path/to/file'
    CURLOPT_UPLOAD => 1,
    CURLOPT_INFILE => $fp,
    CURLOPT_INFILESIZE => $localFileSize,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_SSL_VERIFYHOST => false,
    CURLOPT_FTP_SSL => CURLFTPSSL_TRY,
    CURLOPT_VERBOSE => true
));

if (curl_exec($ch)) {
    curl_close($ch);
}
于 2011-03-11T19:10:21.217 回答