PHP FTP連線問題在容器化環境下的解決方法
P粉302484366
2023-08-28 23:03:17
<p>我正在嘗試將我的PHP腳本容器化。 </p><p>但由於某種原因,當它在容器中運行時,無法連接到我的FTP伺服器。 </p><p>在我的本機上運行該腳本沒有任何問題。 </p><p><strong>Dockerfile:</strong></p><pre class="brush:php;toolbar:false;">FROM php:8.1-cli
EXPOSE 8080
COPY . /var/www/html/
WORKDIR /var/www/html
ENTRYPOINT php -f serve.php</pre><p><strong>PHP腳本:</strong></p><pre class="brush:php;toolbar:false;">$$ connection = ftp_connect(FTP_HOST, 21, 90);
ftp_pasv($connection, true);
if(ftp_login($connection, FTP_USERNAME, FTP_PASSWORD))
{
$stream = fopen('data://text/plain,','r');
ftp_fput($connection, $filename, $stream);
}
ftp_close($connection);</pre><p>90秒後,它會給予以下警告:</p><p><em>ftp_fput(): Connection timed out in /var/ www/html/ftp.php on line 16</em></p><p>我嘗試進入容器並安裝FTP客戶端。 </p><p>它給我一個類似的超時錯誤 - 我可以連接到主機,但運行任何命令都會導致停頓。 </p><p>我還嘗試在VPS上運行容器,以消除任何本地防火牆/網路問題。 </p><p>但問題仍然存在。 </p><p>如果需要進一步的資訊來解決問題,請告訴我。 </p>
注意 PHP 的
ftp_pasv
函數的文件(重點在我這裡):也要注意您沒有檢查
ftp_pasv
呼叫的狀態回傳值,所以您不會注意到該呼叫是否實際成功(這很可能不會成功)。因此,您的腳本將嘗試建立主動的 FTP 連線。這在容器中不起作用(除非使用--network=host
啟動),因為容器在主機機器上透過 NAT 運行在私有網路中。解決方案:先登錄,然後啟用被動模式(也要始終檢查錯誤回傳值;許多來自 PHP 標準函式庫的舊函數不會引發異常,而是依賴錯誤回傳值):