Rumah  >  Soal Jawab  >  teks badan

Penyelesaian kepada masalah sambungan PHP FTP dalam persekitaran kontena

<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>
P粉302484366P粉302484366440 hari yang lalu555

membalas semua(1)saya akan balas

  • P粉775723722

    P粉7757237222023-08-29 20:07:59

    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):

    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);
    }

    balas
    0
  • Batalbalas