PHP의 비 차단 FTP 작동 기능 FTP_NB_Continue () 를 사용하면 많은 개발자가 어려운 문제를 겪게됩니다. FTP 세션이 예상치 못한 대기 상태에 있기 때문에 종종 그렇습니다. 이 기사는 FTP_NB_CONTINUE () 의 일반적인 원인을 자세히 소개하고 차단 및 시간 초과 문제를 피하는 데 도움이되는 몇 가지 효과적인 솔루션을 제공합니다.
ftp_nb_continue ()는 비 블로킹 전송 함수 (예 : ftp_nb_get () 및 ftp_nb_put () )와 함께 사용됩니다. 그 기능은 미완성 FTP 작업을 계속하는 것입니다. 비 블로킹 전송의 장점은 전송이 완료되기를 기다리는 동안 다른 논리를 계속 처리하여 프로그램 응답 효율을 향상시킬 수 있다는 것입니다.
일반적인 비 블로킹 다운로드 프로세스는 다음과 같습니다.
<code> $ ftp = ftp_connect ( 'gitbox.net'); ftp_login ($ ftp, 'username', 'password'); $ ret = ftp_nb_get ($ ftp, 'local_file.txt', 'remote_file.txt', ftp_binary); while ($ ret == ftp_moredata) {
// 다른 작업을 수행 할 수 있습니다
do_something_else ();
// 계속 전송하십시오
$ret = ftp_nb_continue($ftp);
}
</코드>
아주 간단 해 보이나요? 그러나 실제로 그것을 사용할 때 많은 사람들 이이주기에 "고정"됩니다.
일부 FTP 서버는 특정 상태에서 응답을 지연시킵니다. 특히 데이터가 너무 큰 데이터를 요청하거나 네트워크 조건이 좋지 않은 경우. 이로 인해 FTP_NB_CONTINUE ()가 FTP_Moredata 상태에 남아 있고 끝나지 않습니다.
해결책:
합리적인 시간 초과 설정 :
<code> ftp_set_option ($ ftp, ftp_timeout_sec, 30); </코드>stream_set_timeout ()을 사용하여 더 세분화 된 제어를 얻으십시오 (FTP의 기본 스트림을 얻어야 함).
많은 개발자들은 비 블로킹 루프를 작성할 때 while 루프에 지연을 추가하여 CPU 사용을 SOAR로 추가하는 것을 잊어 버리며 FTP 서버도 요청에 응답 할 시간이 없습니다.
해결책:
<code> while ($ ret == ftp_moredata) {do_something_else (); usleep (100000); // 지연 100ms $ ret = ftp_nb_continue ($ ftp); } </code>전송이 완료된 후 일부 FTP 서버는 상태 코드를 올바르게 반환하지 않으며 FTP_NB_CONTINUE ()는 전송이 완료되었다고 판단 할 수 없습니다.
해결책:
로컬 파일 크기가 기대치를 충족하는지 확인하십시오.
최대 재시도 시간을 설정하십시오.
<code> $ maxtries = 100; $ tries = 0; while ($ ret == ftp_moredata && $ <$ maxtries) {
usleep (100000);
$ ret = ftp_nb_continue ($ ftp);
$ tries ++;
}
if ($ tries == $ maxtries) {
새로운 예외를 던지십시오 ( 'ftp transmission timeout');
}
</코드>
다른 서버는 활성 (포트) 및 PASV (PASV) 모드를 지원하지 않으며 잘못된 설정으로 인해 연결 설정이 발생할 수 있지만 데이터를 올바르게 전송할 수 없습니다.
해결책:
<code> ftp_pasv ($ ftp, true); // 수동 모드 활성화 </code>활성/수동 모드를 전환하고 FTP 서비스와 더 호환되는 모드를 확인하십시오.
비 블로킹 모드를 사용할 때는 출구 메커니즘을 설계해야합니다.
주기에 합리적인 지연이 추가되도록하십시오.
시간 초과 및 최대 시도 수를 설정하십시오.
지연이 긴 경우 FTP 모드를 전환하십시오.
리소스 공개를 잊지 마십시오 :
<code> ftp_close ($ ftp); </코드>FTP_NB_CONTINUE ()는 실제로 FTP 작동의 유연성을 향상시킬 수 있지만 고착되기 쉽습니다. 위의 기술을 습득하면 실제 개발에서 차단, 재밍 및 과도한 CPU 사용을 피할 수있어 PHP FTP 프로그램을보다 안정적이고 효율적으로 만들 수 있습니다. 비슷한 상황에 직면하면 하나씩 확인하고 근본 원인을 찾아 올바른 약을 처방 할 수 있습니다.