Penyelesaian kepada masalah sambungan PHP FTP dalam persekitaran kontena
P粉302484366
2023-08-28 23:03:17
<p>Saya cuba menyimpan skrip PHP saya. </p><p>Tetapi atas sebab tertentu ia tidak boleh menyambung ke pelayan FTP saya apabila berjalan dalam bekas. </p><p>Jalankan skrip pada mesin tempatan saya tanpa sebarang masalah. </p><p><strong>Dockerfile:</strong></p><pre class="brush:php;toolbar:false;">FROM php:8.1-cli
DEDAHKAN 8080
SALIN ./var/www/html/
WORKDIR /var/www/html
ENTRYPOINT php -f serve.php</pre><p><strong>Skrip PHP:</strong></p><pre class="brush:php;toolbar:false;">$ sambungan = 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>Selepas 90 saat, ia akan memberikan amaran berikut: </p><p><em>ftp_fput(): Sambungan tamat masa dalam /var/ www/html/ftp.php pada baris 16</em></p><p>Saya cuba masuk ke dalam bekas dan memasang klien FTP. </p><p>Ia memberi saya ralat tamat masa yang sama - saya boleh menyambung ke hos, tetapi menjalankan sebarang arahan menyebabkan jeda. </p><p>Saya juga cuba menjalankan bekas pada VPS untuk menghapuskan sebarang isu firewall/rangkaian setempat. </p><p>Tetapi masalahnya masih wujud. </p><p>Jika anda memerlukan maklumat lanjut untuk menyelesaikan isu tersebut, sila beritahu saya. </p>
Beri perhatian kepada dokumentasi fungsi
ftp_pasv
PHP (penekanan saya):Juga ambil perhatian bahawa anda tidak menyemak nilai pulangan status panggilan
ftp_pasv
调用的状态返回值,所以您不会注意到该调用是否实际成功(这很可能不会成功)。因此,您的脚本将尝试建立主动的 FTP 连接。这在容器中不起作用(除非使用--network=host
, jadi anda tidak akan perasan sama ada panggilan itu benar-benar berjaya (yang kemungkinan besar tidak akan berjaya). Oleh itu, skrip anda akan cuba mewujudkan sambungan FTP yang aktif. Ini tidak berfungsi dalam bekas (melainkan dimulakan dengan--network=host
), kerana bekas berjalan dalam rangkaian peribadi melalui NAT pada mesin hos.Penyelesaian: Log masuk dahulu, kemudian dayakan mod pasif (juga sentiasa semak nilai pulangan ralat; banyak fungsi lama daripada perpustakaan standard PHP tidak membuang pengecualian, tetapi bergantung pada nilai pulangan ralat):