P粉7757237222023-08-29 20:07:59
注意 PHP 的 ftp_pasv
函数的文档(重点在我这里):
还要注意您没有检查 ftp_pasv
调用的状态返回值,所以您不会注意到该调用是否实际成功(这很可能不会成功)。因此,您的脚本将尝试建立主动的 FTP 连接。这在容器中不起作用(除非使用 --network=host
启动),因为容器在主机机器上通过 NAT 运行在私有网络中。
解决方案:首先登录,然后启用被动模式(还要始终检查错误返回值;许多来自 PHP 标准库的旧函数不会引发异常,而是依赖于错误返回值):
if (ftp_login($connection, FTP_USERNAME, FTP_PASSWORD)) { if (ftp_pasv($connection, true) === false) { throw new \Exception("无法启用被动模式") } $stream = fopen('data://text/plain,','r'); ftp_fput($connection, $filename, $stream); }