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粉7757237222023-08-29 20:07:59
PHP의 ftp_pasv
함수 문서에 주의하세요(강조):
또한 ftp_pasv
调用的状态返回值,所以您不会注意到该调用是否实际成功(这很可能不会成功)。因此,您的脚本将尝试建立主动的 FTP 连接。这在容器中不起作用(除非使用 --network=host
호출의 상태 반환 값을 확인하지 않으므로 호출이 실제로 성공했는지 여부를 알 수 없습니다(대부분 그렇지 않을 가능성이 높음). 따라서 스크립트는 활성 FTP 연결을 설정하려고 시도합니다. 컨테이너는 호스트 시스템의 NAT를 통해 개인 네트워크에서 실행되기 때문에 컨테이너에서는 작동하지 않습니다(--network=host
로 시작하지 않는 한).
해결책: 먼저 로그인한 다음 패시브 모드를 활성화하세요(항상 오류 반환 값도 확인하세요. PHP 표준 라이브러리의 많은 이전 함수는 예외를 발생시키지 않고 오류 반환 값에 의존합니다):
으아악