コンテナ化環境における 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;">php:8.1-cli から
エクスポーズ8080
コピー ./var/www/html/
WORKDIR /var/www/html
ENTRYPOINT php -fserve.php</pre><p><strong>PHP スクリプト:</strong></p><pre class="brush:php;toolbar:false;">$接続 = 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 の 16 行目</em></p><p>コンテナに入って FTP クライアントをインストールしてみました。 </p><p>同様のタイムアウト エラーが発生します。ホストには接続できますが、コマンドを実行すると一時停止が発生します。 </p><p>また、ローカルのファイアウォール/ネットワークの問題を排除するために、VPS 上でコンテナーを実行してみました。 </p><p>しかし、問題はまだ存在します。 </p><p>問題を解決するためにさらに詳しい情報が必要な場合は、お知らせください。 </p>
PHP の
ftp_pasv
関数のドキュメントに注意してください (強調は私のものです):また、
ftp_pasv
呼び出しのステータス戻り値をチェックしていないことにも注意してください。そのため、呼び出しが実際に成功したかどうかはわかりません (おそらく成功しないでしょう)。したがって、スクリプトはアクティブな FTP 接続を確立しようとします。コンテナはホスト マシン上の NAT を介してプライベート ネットワークで実行されるため、これはコンテナでは機能しません (--network=host
で開始しない限り)。解決策: まずログインしてから、パッシブ モードを有効にします (また、常にエラー戻り値をチェックします。PHP 標準ライブラリの多くの古い関数は例外をスローせず、エラー戻り値に依存します):
リーリー