찾다

 >  Q&A  >  본문

컨테이너화된 환경의 PHP FTP 연결 문제에 대한 솔루션

<p>PHP 스크립트를 컨테이너화하려고 합니다. </p><p>하지만 어떤 이유로 컨테이너에서 실행할 때 FTP 서버에 연결할 수 없습니다. </p><p>내 로컬 컴퓨터에서 문제 없이 스크립트를 실행하세요.

Docker 파일:

FROM php:8.1-cli

노출 8080

복사 ./var/www/html/

작업 디렉터리 /var/www/html

ENTRYPOINT php -f Serve.php</pre><p><strong>PHP 스크립트:</strong></p><pre class="brush:php;toolbar:false;">$ 연결 = ftp_connect(FTP_HOST, 21, 90);
ftp_pasv($연결, 참);

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粉302484366P粉302484366458일 전571

모든 응답(1)나는 대답할 것이다

  • P粉775723722

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

    PHP의 ftp_pasv 함수 문서에 주의하세요(강조):

    또한 ftp_pasv 调用的状态返回值,所以您不会注意到该调用是否实际成功(这很可能不会成功)。因此,您的脚本将尝试建立主动的 FTP 连接。这在容器中不起作用(除非使用 --network=host 호출의 상태 반환 값을 확인하지 않으므로 호출이 실제로 성공했는지 여부를 알 수 없습니다(대부분 그렇지 않을 가능성이 높음). 따라서 스크립트는 활성 FTP 연결을 설정하려고 시도합니다. 컨테이너는 호스트 시스템의 NAT를 통해 개인 네트워크에서 실행되기 때문에 컨테이너에서는 작동하지 않습니다(--network=host로 시작하지 않는 한).

    해결책: 먼저 로그인한 다음 패시브 모드를 활성화하세요(항상 오류 반환 값도 확인하세요. PHP 표준 라이브러리의 많은 이전 함수는 예외를 발생시키지 않고 오류 반환 값에 의존합니다):

    으아악

    회신하다
    0
  • 취소회신하다