为何PHP ftp_get在命令行和Filezilla可用,网页index.php中却超时?
问题详情
网站中的ftp_get命令开始超时,但已确认ftp_login登录成功。相同的PHP代码在命令行可正常运行,使用相同凭据在Filezilla中也能正常操作,仅在网页端收到警告:PHP Warning: "ftp_get(): Opening BINARY mode data connection",无其他错误信息。
该问题始于Godaddy迁移我的网站后(其他功能正常,权限无异常),但Godaddy无法排查问题。怀疑是服务器设置问题,或是FTP站点发生了意外变更。
相关PHP代码
// connect and login to FTP server $ftp_server = "ftp.mdt.mt.gov"; $ftp_user = "anonymous"; $ftp_pass = ""; $ftp_conn = ftp_connect($ftp_server) or die("Could not connect to $ftp_server"); $login_result = ftp_login($ftp_conn, $ftp_user, $ftp_pass); if ($login_result == 1) { $local_file = "webcam_images/Image-000150000-00-04.jpg"; $server_file = "/rwis/images/Image-150-00-ptz4.jpg"; echo "login result true" ; ftp_get($ftp_conn, $local_file, $server_file, FTP_BINARY); }
(注:原代码缺少变量符号$,已补充)
排查方向与解决方案建议
- 启用FTP被动模式:网页端PHP运行在Web服务器环境下,大概率受防火墙限制,主动模式FTP的数据连接无法建立。在
ftp_login成功后添加被动模式启用代码:
再执行ftp_pasv($ftp_conn, true);ftp_get尝试下载。 - 检查Web服务器出站端口限制:Godaddy迁移后可能修改了防火墙规则,限制了FTP被动模式所需的1024+端口范围的出站连接,需确认Web服务器进程是否允许发起这类数据连接。
- 对比FTP连接模式差异:命令行和Filezilla默认可能用被动模式,而网页端PHP默认是主动模式,这是核心差异点,优先验证被动模式的效果。
- 排查PHP配置差异:命令行PHP与网页端PHP可能使用不同的
php.ini配置,检查网页端的ftp扩展是否正常启用、open_basedir是否限制了本地写入目录、allow_url_fopen是否开启。 - 二次确认本地目录权限:再次检查
webcam_images目录是否允许Web服务器进程(如apache、www-data用户)写入,隐性权限问题也可能触发超时类警告。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

