PHP ftp_get报错PORT命令禁用,FTP文件下载失败求助
FTP下载脚本报错:PORT command is disabled
问题详情
同一FTP下载脚本在其他服务器运行正常,部署到Plesk Obsidian服务器后执行失败,日志报错:
AH01071: Got error 'PHP message: PHP Warning: ftp_get(): PORT command is disabled in /path/to/file
脚本执行后输出There was a problem,FTP连接与登录步骤均成功,但执行ftp_get时触发异常。
脚本完整代码
<?php $server_file = "testfile.xml.gz"; $local_file = 'tfs.xml.gz'; $ftp_server="aftp.xxx.com"; $ftp_user_name="xxx_xxxx"; $ftp_user_pass="xxxxx"; $conn_id = ftp_connect($ftp_server); ftp_pasv($conn_id, true); // login with username and password $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); // try to download $server_file and save to $local_file if (ftp_get($conn_id, $local_file, $server_file)) { echo "Successfully written to $local_file "; } else { echo "There was a problem "; } // close the connection ftp_close($conn_id); ?>
已完成的排查操作
- 临时关闭服务器防火墙,无效果
- 本地目标文件已设置777权限
- 确认远程服务器要求使用Binary传输模式
- 可通过FileZilla正常连接并下载目标文件
- 当前服务器环境为Plesk Obsidian
解决思路
- 调整被动模式调用时机
当前代码在ftp_connect后立即开启被动模式,部分FTP服务器要求完成登录后才能切换被动模式,提前调用可能导致模式切换失败,脚本自动 fallback 到主动模式(PORT命令),而当前服务器禁用了PORT命令。修改代码顺序:
$conn_id = ftp_connect($ftp_server); $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); // 登录成功后再开启被动模式 ftp_pasv($conn_id, true);
- 显式设置Binary传输模式
既然远程服务器要求Binary模式,需在下载前明确配置传输模式:
// 方式一:用ftp_set_option ftp_set_option($conn_id, FTP_BINARY, true); // 方式二:用ftp_binary() ftp_binary($conn_id);
- 检查Plesk相关配置
- 查看PHP配置,确认未禁用
ftp_get等FTP相关函数 - 检查Plesk防火墙/安全组,确保开放FTP被动模式的端口范围(通常为1024-65535),允许服务器对外发起被动连接
- 尝试FTPS连接
若远程服务器支持FTPS,改用加密连接可能绕过端口限制:
$conn_id = ftp_ssl_connect($ftp_server);
- 检查SELinux状态
如果服务器开启了SELinux,可能阻止PHP进程写入本地文件。执行getenforce查看状态,若为Enforcing,可临时执行setenforce 0测试,若问题解决则配置SELinux规则允许PHP写入目标目录。
内容的提问来源于stack exchange,提问作者bertster
相关产品推荐
相关产品推荐

