无法通过本地主机使用PHP ftp_connect连接FTP

6
我可以帮你进行翻译。以下是你所需内容的简化版:

我一直在尝试编写一个脚本,从我的CentOS本地Apache服务器通过FTP下载文件,但是一直无法实现!

我使用的代码是任何基本FTP请求都会使用的代码:

<?php
$ip= FTP_IP_HERE;
$port='21';
$timeout='90';
$un='username';
$pw='password';

// Connect to ftp
$conn_id = ftp_connect($ip,$port,$timeout);

// Open a session to an external ftp site
$login_result = ftp_login ($conn_id, $un, $pw);

// Check open
if ((!$conn_id) || (!$login_result)) {
    print "FTP connection failed!";
    exit();
}

// turn on passive mode transfers
if (ftp_pasv($conn_id, true) == FALSE) {
    print "Passive FTP connection failed!";
    exit();
}

我在远程服务器上尝试了相同的脚本,它可以正常工作!我不确定是否需要进行任何Apache配置,或者这是PHP本身的限制。
更新: 以下是错误日志:
Warning: ftp_login() expects parameter 1 to be resource, boolean given in /var/www/html/ftp/FTP.php on line 16

Warning: ftp_get() expects parameter 1 to be resource, boolean given in /var/www/html/ftp/FTP.php on line 22
Falha ao enviar o arquivo test.pdf<br />Array
(
    [type] => 2
    [message] => ftp_get() expects parameter 1 to be resource, boolean given
    [file] => /var/www/html/ftp/FTP.php
    [line] => 22
)

Warning: ftp_close() expects parameter 1 to be resource, boolean given in /var/www/html/ftp/FTP.php on line 30

1
似乎连接创建失败了,所有的PHP ftp扩展函数都需要一个类型为资源的参数作为第一个参数,该参数是由ftp_connect函数返回的。然而,“expects parameter 1 to be resource”错误意味着该资源是“false”。 - Shakir El Amrani
3个回答

11

好的,我曾遇到同样的问题,并为自己的情况找到了解决方案。在这里发布以帮助其他人。

我的PHP脚本失败了,但我可以轻松通过命令行进行FTP。我验证了我的防火墙没有阻止该脚本,并且我在日志中没有收到任何PHP错误...

在搜索后,看起来我的问题是 SELinux。我不想关闭它,所以我检查了 httpd_can_network_connect 的状态。

通过运行以下命令检查您的状态:

getsebool httpd_can_network_connect 

如果你得到:

httpd_can_network_connect --> off
这可能是您的问题。
注意:
如果您已经设置了此项 on
httpd_can_network_connect --> on
或者
SELinux is disabled

那么这不会解决你的问题...祝你好运找到解决方案。

解决方法

运行以下命令启用 httpd_can_network_connect

setsebool httpd_can_network_connect=1

再次测试您的脚本,看看它是否有效。这对我有用,因此我确保设置了一个策略来保持此功能启用。

setsebool -P httpd_can_network_connect=1

注意: -P 设置策略,以便它可以在重新启动后保持有效


2
谢谢。工作了几个小时,却一无所获,原来是该死的SELinux又出问题了! - nomaam

4

首先确保不是本地防火墙或其他问题。尝试从任何其他工具进行FTP,例如:

wget --user=username --password='password' ftp://FTP_IP_HERE/file_to_download

如果wget也无法连接,则存在网络设置问题。

如果wget测试通过,您还可以尝试启用详细错误报告,以查看您的PHP尝试出了什么问题,方法是在代码顶部添加以下内容:

<?php
ini_set('display_errors',1);
error_reporting(E_ALL|E_STRICT);

最后,这也可能与您的情况相关:使用PHP的ftp_connect()无法连接到FTP服务器


我测试了使用wget下载文件,它成功下载了。 - Gilberto Albino
我看到了你的错误日志,所以在你的情况下ftp_connect返回FALSE。 - Yuriy
尝试将代码中的服务器主机/IP替换为ftp.mozilla.org或任何其他公共FTP服务器,看看是否打开。然后,请确认您在服务器IP前面是否使用了“ftp://”?不确定是否需要该前缀,请尝试使用和不使用两种方式。 - Yuriy
有趣。尝试从命令行运行脚本,而不是通过浏览器调用它。如果这次可以工作,请阅读此讨论以解决您的问题:http://www.linuxquestions.org/questions/red-hat-31/centos-5-3-php-ftp_connect-working-command-line-only-758922/ - Yuriy

2

尝试使用'127.0.0.1'代替'localhost'

ftp_connect('127.0.0.1', 21);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接