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); }