我有一台通过 PHP 运行一些 FTP 的 PC,我知道它在 1-2 个月前还可以工作,但现在我返回它,发现该 PC 不再工作了。我知道我一直在使用电脑,但我想不出可能会发生什么变化。
PHP 抛出错误消息读取
无法建立数据连接:连接被拒绝
...当我使用ftp_put()
功能。
我正在使用的缩减代码是:
<?php
$trackErrors = ini_get('track_errors');
ini_set('track_errors', 1);
$server="***.***.***.***";
$port=21;
echo "<LI>Connecting to $server:$port<BR>";
$conn_id = ftp_connect($server,$port,9999999) or die("<BR>Unable to connect to ".$server.":$port server.");
if ( !$conn_id ) {
$errmsg = $php_errormsg;
echo "<BR><LI>ERR:$errmsg";
}
else {
$passive=false;
echo "<LI>Setting Passive Mode=$passive";
ftp_pasv($conn_id, $passive);
$user="*********";
$pass="*********";
echo "<LI>Connecting as $user/*****";
if (!ftp_login($conn_id, $user, $pass)) {
$msg = "Failed to login to $selected_server as $user; <BR>check logincredentials in the Settings";
echo "<BR><LI>$msg";
$errmsg = $php_errormsg;
echo "<LI>ERR:$errmsg";
return $msg;
}
ftp_set_option($conn_id, FTP_TIMEOUT_SEC, 10000);
if (!@ftp_put($conn_id, "test.txt", "C:......test.txt", FTP_BINARY)) {
echo "<BR><LI>ftp_put failed";
$errmsg = $php_errormsg;
echo "<LI>ERR:$errmsg";
}
echo "<HR>Done";
}
?>
作为网页运行时的输出是
Connecting to ***.***.***.***:21
Setting Passive Mode=
Connecting as *******/*****
ftp_put failed
ERR:ftp_put(): Unable to build data connection: Connection refused
Done
结果是ftp_put()
给出错误消息并在服务器上留下具有正确文件名的零 (0) 字节文件。
奇怪的是
- 相同的代码/连接信息可以在另一台笔记本电脑上使用
- 推送文件时使用 FileZilla 可以正常使用相同的连接信息
- 该问题发生在多台服务器上(即,不仅仅是某一特定目的地出现问题)
另外,这似乎与被动模式没有任何关系(启用或不启用此模式都会失败)
请注意,我们看到端口 20 和 21 在ftp_close()
用一个netstat -n
在命令行上。 PHP 文档表明端口 20 是数据通道,但我们正在讨论存在问题的 INBOUND 问题(服务器到 PC)。添加防火墙规则以在 INBOUND 上打开端口 20 和 21 后,我可以看到 PHP 可以正常工作。但尚不清楚
- 为什么 PHP 需要端口 20(而 FileZilla 不需要),
- 为什么另一台电脑没有同样的问题(都是公司电脑,相同的型号/年龄/构造),以及
- 我应该使用什么防火墙修复程序(如果有)。
有没有人有什么建议?
Thanks
Abe