You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:27:12