コンテナ化環境における PHP FTP 接続の問題の解決策
P粉302484366
P粉302484366 2023-08-28 23:03:17
0
1
594
<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>
P粉302484366
P粉302484366

全員に返信(1)
P粉775723722

PHP の ftp_pasv 関数のドキュメントに注意してください (強調は私のものです):

また、ftp_pasv 呼び出しのステータス戻り値をチェックしていないことにも注意してください。そのため、呼び出しが実際に成功したかどうかはわかりません (おそらく成功しないでしょう)。したがって、スクリプトはアクティブな FTP 接続を確立しようとします。コンテナはホスト マシン上の NAT を介してプライベート ネットワークで実行されるため、これはコンテナでは機能しません (--network=host で開始しない限り)。

解決策: まずログインしてから、パッシブ モードを有効にします (また、常にエラー戻り値をチェックします。PHP 標準ライブラリの多くの古い関数は例外をスローせず、エラー戻り値に依存します):

リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート