首页 > 解决方案 > 我无法使用 PHP 在 FTP 服务器上工作,连接正常,但我无法获取文件或其他内容。它适用于 FileZilla

问题描述

我有一个问题。我正在使用 PHP 连接到 FTP 服务器,以获取存储在服务器上的文件列表。我可以正确连接(使用 ftp_connect,也可以使用 ftp_login 登录,我也使用被动模式)。当我刚刚连接时,一切正常。当我将 ftp_nlist 或其他操作添加到我的代码时,它不起作用。该页面只是无休止地加载。我可以使用 FileZilla 连接服务器并在服务器上工作,但我想自动执行此操作。它适用于 FileZilla 但不适用于 PHP,你能帮我吗?

它试图连接到另一个 FTP 服务器,并且运行良好。我可以得到文件列表。但我不能使用我想要的服务器。

这是我的代码:

$ftpStream=ftp_connect($hostname,$port);
if($ftpStream==false) 
    echo 'No connection </br>';
else { 
    echo 'Connected </br>';
    if(ftp_login($ftpStream,$ftpUsername,$ftpPassword)!=false) { 
        echo 'Logged </br>';
            if(ftp_pasv($ftpStream,true)!=false) 
                echo 'Passive mode on </br>'; 
        $list=ftp_nlist($ftpStream,'.'); 
    } 
    else echo 'Wrong ftpUsername or ftpPassword</br>'; 
}

我检查了文件权限,我可以读取、写入和执行,所以我认为问题不是来自文件权限。

这是日志文件:

2018-05-04 09:28:10 248 1 Suivi : CControlSocket::SendNextCommand()
2018-05-04 09:28:10 248 1 Suivi : CFtpLogonOpData::Send() in state 0
2018-05-04 09:28:10 248 1 Statut : Connexion à ... //Connecting to the FTP server
2018-05-04 09:28:10 248 1 Statut : Connexion établie, attente du message d'accueil... //Connection established, waiting for the welcome message
2018-05-04 09:28:11 248 1 Suivi : CFtpControlSocket::OnReceive()
2018-05-04 09:28:11 248 1 Réponse : 220 Service ready for new user.
2018-05-04 09:28:11 248 1 Suivi : CFtpLogonOpData::ParseResponse() in state 1
2018-05-04 09:28:11 248 1 Suivi : CControlSocket::SendNextCommand()
2018-05-04 09:28:11 248 1 Suivi : CFtpLogonOpData::Send() in state 2
2018-05-04 09:28:11 248 1 Commande : AUTH TLS
2018-05-04 09:28:11 248 1 Suivi : CFtpControlSocket::OnReceive()
2018-05-04 09:28:11 248 1 Réponse : 500 Syntax error, command unrecognized.
2018-05-04 09:28:11 248 1 Suivi : CFtpLogonOpData::ParseResponse() in state 2
2018-05-04 09:28:11 248 1 Suivi : CControlSocket::SendNextCommand()
2018-05-04 09:28:11 248 1 Suivi : CFtpLogonOpData::Send() in state 3
2018-05-04 09:28:11 248 1 Commande : AUTH SSL
2018-05-04 09:28:11 248 1 Suivi : CFtpControlSocket::OnReceive()
2018-05-04 09:28:11 248 1 Réponse : 500 Syntax error, command unrecognized.
2018-05-04 09:28:11 248 1 Suivi : CFtpLogonOpData::ParseResponse() in state 3
2018-05-04 09:28:11 248 1 Statut : Serveur non sécurisé, celui-ci ne supporte pas FTP sur TLS.// No TLS
2018-05-04 09:28:11 248 1 Suivi : CControlSocket::SendNextCommand()
2018-05-04 09:28:11 248 1 Suivi : CFtpLogonOpData::Send() in state 5
2018-05-04 09:28:11 248 1 Commande : USER user
2018-05-04 09:28:12 248 1 Suivi : CFtpControlSocket::OnReceive()
2018-05-04 09:28:12 248 1 Réponse : 331 User name okay, need password.
2018-05-04 09:28:12 248 1 Suivi : CFtpLogonOpData::ParseResponse() in state 5
2018-05-04 09:28:12 248 1 Suivi : CControlSocket::SendNextCommand()
2018-05-04 09:28:12 248 1 Suivi : CFtpLogonOpData::Send() in state 5
2018-05-04 09:28:12 248 1 Commande : PASS ****
2018-05-04 09:28:12 248 1 Suivi : CFtpControlSocket::OnReceive()
2018-05-04 09:28:12 248 1 Réponse : 230 User logged in, proceed.
2018-05-04 09:28:12 248 1 Suivi : CFtpLogonOpData::ParseResponse() in state 5
2018-05-04 09:28:12 248 1 Suivi : CControlSocket::SendNextCommand()
2018-05-04 09:28:12 248 1 Suivi : CFtpLogonOpData::Send() in state 6
2018-05-04 09:28:12 248 1 Commande : SYST
2018-05-04 09:28:12 248 1 Suivi : CFtpControlSocket::OnReceive()
2018-05-04 09:28:12 248 1 Réponse : 215 Windows_CE version 6.0.
2018-05-04 09:28:12 248 1 Suivi : CFtpLogonOpData::ParseResponse() in state 6
2018-05-04 09:28:12 248 1 Suivi : CControlSocket::SendNextCommand()
2018-05-04 09:28:12 248 1 Suivi : CFtpLogonOpData::Send() in state 7
2018-05-04 09:28:12 248 1 Commande : FEAT
2018-05-04 09:28:13 248 1 Suivi : CFtpControlSocket::OnReceive()
2018-05-04 09:28:13 248 1 Réponse : 211- Features supported
2018-05-04 09:28:13 248 1 Réponse : REST SIZE STREAM
2018-05-04 09:28:13 248 1 Réponse : 211 End
2018-05-04 09:28:13 248 1 Suivi : CFtpLogonOpData::ParseResponse() in state 7
2018-05-04 09:28:13 248 1 Statut : Le serveur ne supporte pas les caractères non-ASCII. //Doesn't support non ASCII characters
2018-05-04 09:28:13 248 1 Statut : Connecté // Connected
2018-05-04 09:28:13 248 1 Suivi : Measured latency of 296 ms
2018-05-04 09:28:13 248 1 Suivi : CFtpControlSocket::ResetOperation(0)
2018-05-04 09:28:13 248 1 Suivi : CControlSocket::ResetOperation(0)
2018-05-04 09:28:13 248 1 Statut : Récupération du contenu du dossier... //Getting directory content
2018-05-04 09:28:13 248 1 Suivi : CControlSocket::SendNextCommand()
2018-05-04 09:28:13 248 1 Suivi : CFtpListOpData::ListSend() in state 0
2018-05-04 09:28:13 248 1 Suivi : CFtpChangeDirOpData::Send() in state 0
2018-05-04 09:28:13 248 1 Suivi : CFtpChangeDirOpData::Send() in state 1
2018-05-04 09:28:13 248 1 Commande : PWD
2018-05-04 09:28:13 248 1 Suivi : CFtpControlSocket::OnReceive()
2018-05-04 09:28:13 248 1 Réponse : 257 "/".
2018-05-04 09:28:13 248 1 Suivi : CFtpChangeDirOpData::ParseResponse() in state 1
2018-05-04 09:28:13 248 1 Suivi : CFtpControlSocket::ResetOperation(0)
2018-05-04 09:28:13 248 1 Suivi : CControlSocket::ResetOperation(0)
2018-05-04 09:28:13 248 1 Suivi : CControlSocket::ParseSubcommandResult(0)
2018-05-04 09:28:13 248 1 Suivi : CFtpListOpData::SubcommandResult() in state 1
2018-05-04 09:28:13 248 1 Suivi : CControlSocket::SendNextCommand()
2018-05-04 09:28:13 248 1 Suivi : CFtpListOpData::ListSend() in state 2
2018-05-04 09:28:13 248 1 Suivi : CFtpRawTransferOpData::Send() in state 1
2018-05-04 09:28:13 248 1 Commande : TYPE I
2018-05-04 09:28:13 248 1 Suivi : CFtpControlSocket::OnReceive()
2018-05-04 09:28:13 248 1 Réponse : 200 Command okay.
2018-05-04 09:28:13 248 1 Suivi : CFtpRawTransferOpData::ParseResponse() in state 1
2018-05-04 09:28:13 248 1 Suivi : CControlSocket::SendNextCommand()
2018-05-04 09:28:13 248 1 Suivi : CFtpRawTransferOpData::Send() in state 2
2018-05-04 09:28:13 248 1 Commande : PASV
2018-05-04 09:28:13 248 1 Suivi : CFtpControlSocket::OnReceive()
2018-05-04 09:28:13 248 1 Réponse : 227 Entering Passive Mode (x,x,x,x,200,64).
2018-05-04 09:28:13 248 1 Suivi : CFtpRawTransferOpData::ParseResponse() in state 2
2018-05-04 09:28:13 248 1 Suivi : CControlSocket::SendNextCommand()
2018-05-04 09:28:13 248 1 Suivi : CFtpRawTransferOpData::Send() in state 4
2018-05-04 09:28:13 248 1 Suivi : Binding data connection source IP to control connection source IP (myIP)
2018-05-04 09:28:13 248 1 Commande : LIST
2018-05-04 09:28:14 248 1 Suivi : CTransferSocket::OnConnect
2018-05-04 09:28:14 248 1 Suivi : CFtpControlSocket::OnReceive()
2018-05-04 09:28:14 248 1 Réponse : 125 Data connection already open; transfer starting.
2018-05-04 09:28:14 248 1 Suivi : CFtpRawTransferOpData::ParseResponse() in state 4
2018-05-04 09:28:14 248 1 Suivi : CControlSocket::SendNextCommand()
2018-05-04 09:28:14 248 1 Suivi : CFtpRawTransferOpData::Send() in state 5
2018-05-04 09:28:14 248 1 Suivi : CFtpControlSocket::OnReceive()
2018-05-04 09:28:14 248 1 Réponse : 226 Closing data connection. 
2018-05-04 09:28:14 248 1 Suivi : CFtpRawTransferOpData::ParseResponse() in state 5
2018-05-04 09:28:14 248 1 Suivi : CControlSocket::SendNextCommand()
2018-05-04 09:28:14 248 1 Suivi : CFtpRawTransferOpData::Send() in state 8
2018-05-04 09:28:14 248 1 Suivi : CTransferSocket::OnClose(0)
2018-05-04 09:28:14 248 1 Suivi : CTransferSocket::TransferEnd(1)
2018-05-04 09:28:14 248 1 Suivi : CFtpControlSocket::TransferEnd()
2018-05-04 09:28:14 248 1 Suivi : CFtpControlSocket::ResetOperation(0)
2018-05-04 09:28:14 248 1 Suivi : CControlSocket::ResetOperation(0)
2018-05-04 09:28:14 248 1 Suivi : CControlSocket::ParseSubcommandResult(0)
2018-05-04 09:28:14 248 1 Suivi : CFtpListOpData::SubcommandResult() in state 3
2018-05-04 09:28:14 248 1 Suivi : CFtpControlSocket::ResetOperation(0)
2018-05-04 09:28:14 248 1 Suivi : CControlSocket::ResetOperation(0)
2018-05-04 09:28:14 248 1 Statut : Contenu du dossier "/" affiché avec succès // "/" directory successfully displayed

我继续搜索,我发现了一些奇怪的东西。数据连接在 FileZilla 中立即关闭,但它仍然可以获得文件列表,也许我应该使用 PHP 处理它:

Commande :  PASV
Réponse :   227 Entering Passive Mode (x,x,x,x,19,201)
Commande :  LIST
Réponse :   150 File status okay; about to open data connection.
Réponse :   226 Closing data connection. 
Statut :    Contenu du dossier affiché avec succès // The directory's content is well displayed

这就是它与另一台服务器一起工作的方式

Commande :  PASV
Réponse :   227 Entering Passive Mode (x,x,x,x,15,73)
Commande :  LIST
Réponse :   150 File status okay; about to open data connection.
Réponse :   226 Transfer complete
Statut :    Contenu du dossier affiché avec succès //Sucessfully displayed

标签: phpftpfilezilla

解决方案


检查您从服务器上获取文件的目录是否具有正确的权限,或者文件夹本身...假设您尝试让 PHP 在其上工作的服务器是 linux 服务器,请记住您拥有文件所有者的权限或文件夹、特定用户和全局用户,因此当您更改权限时,您将使用 chmod 777...

- 要检查的另一件事是,当您使用 php 连接到服务器时,您的守护进程/客户端从那里识别出什么样的用户,这样更容易知道您拥有哪些权限。

-我还建议您检查服务器是否已配置为允许外部客户端/连接处理文件。您的服务器管理员可能对服务器进行了不同的配置,让 FileZilla 访问是您的 ftp 帐户使用不同的端口,在本例中为端口 21,但问题是您的 PHP 应用程序尝试使用哪个端口。希望这可以指导您了解可能是什么问题。


推荐阅读