注意 PHP 的 ftp_pasv
函數(shù)的文檔(重點(diǎn)在我這里):
還要注意您沒有檢查 ftp_pasv
調(diào)用的狀態(tài)返回值,所以您不會注意到該調(diào)用是否實(shí)際成功(這很可能不會成功)。因此,您的腳本將嘗試建立主動的 FTP 連接。這在容器中不起作用(除非使用 --network=host
啟動),因?yàn)槿萜髟谥鳈C(jī)機(jī)器上通過 NAT 運(yùn)行在私有網(wǎng)絡(luò)中。
解決方案:首先登錄,然后啟用被動模式(還要始終檢查錯誤返回值;許多來自 PHP 標(biāo)準(zhǔn)庫的舊函數(shù)不會引發(fā)異常,而是依賴于錯誤返回值):
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); }