I can't work on a FTP server with PHP, the con

2019-08-18 04:36发布

问题:

I have an issue. I'm using PHP to connect to a FTP server, in order to get the list of files stored on the server. I can connect properly (with ftp_connect, and also login with ftp_login, I used passive mode too). Everthing works when I'm just connecting. When I add ftp_nlist or another action to my code, it doesn't work. The page is just loading endlessly. I can use FileZilla to connect and work on the server, but I want to automate this. It works with FileZilla but not with PHP, can you help me ?

It tried to connect to another FTP server and it works well. I can get the file list. But I can't with the server that I want.

Here is my code:

$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>'; 
}

I checked the files permissions, I can read, write, and execute, so the problem doesn't come from file permissions I think.

Here is the log file :

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

I continued searching and I found something weird. The data connection is closed instantly in FileZilla, but it can still get the list of files, maybe I should work on it with 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

And this is how it works with another server

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

回答1:

Check if the directory you are getting files from on the server has the correct permissions, or the folder itself... Assuming the server you are trying to get PHP to work on is a linux server remember you have permissions for the owner of the file or folder, specific users and global users hence when you change permissions you would use chmod 777...

-Another thing to check is whether when you use connect to the server using php what kind of user is your daemon/client identified as from there it would be easier to know what permissions you have.

-Also I would advise you check if the server has been configured to allow for external clients/connections to work on the files. Your Server Administrator might have configured the Server differently, having FileZilla access is your ftp account using a different port, which is port 21 in this instance but the question is which port is your PHP application trying to use. Hope this guides you as to get an idea as to what could be the problem.