警告:ftp_put():正在连接到端口

Warning: ftp_put(): Connecting to port

我无法将文件上传到我的 ftp 服务器。

总是有警告:

ftp_put(): Connecting to port.

<?php
    set_time_limit(0);
    $host = 'xxxx';
    $usr = 'yyyy';
    $pwd = 'zzzz';
    $local_file = '/home/back.sql';
    $ftp_path = '/public_html/';
    $conn_id = ftp_connect($host, 21) or die ("Cannot connect to host");
    ftp_login($conn_id, $usr, $pwd) or die("Cannot login");
    $upload = ftp_put($conn_id, $ftp_path.'back1.sql', $local_file, FTP_ASCII); 
    print($upload);
?>

代码执行了3次。我收到三个不同的警告。

Warning: ftp_put(): Connecting to port 1926 in filename (i named it) on line 10
Warning: ftp_put(): Connecting to port 1928 in filename (i named it) on line 10
Warning: ftp_put(): Connecting to port 1930 in filename (i named it) on line 10

  1. 警告信息是什么意思?
  2. 为什么要连接到不同的端口?也许端口每次都应该是 21,为什么不呢?

"Connecting to port xxx" 是 PureFTPD 服务器发出的消息,当它尝试连接回 FTP 客户端时它的主动模式数据连接端口(这是随机的,这就是它改变的原因)。

如果您确实需要使用主动模式,则需要允许传入连接到 PHP 使用的主动模式数据连接端口范围。
看我的 guide for network configuration necessary for the active mode FTP.

不过,如果您不需要使用主动模式,请改用被动模式。被动模式一般不需要在客户端进行任何网络配置。

在PHP中,通过在ftp_login之后调用ftp_pasv function切换到被动模式:

...
ftp_login($conn_id, $usr, $pwd) or die("Cannot login");
ftp_pasv($conn_id, true) or die("Cannot switch to passive mode");
...

请参阅以上指南以了解主动和被动 FTP 模式之间的区别。