ftp_systeme () 함수를 호출 할 때 예상 반환은 다음과 같습니다.
$system = ftp_systype($ftp_conn);
echo $system; // 정상적인 상황에서는 출력이 있어야합니다:UNIX 또는 Windows NT
그러나 실제 출력은 다음과 같습니다.
UNKNOWN
ftp_systeme () 은 시스템 유형을 얻기 위해 FTP에 의존하는 기본 시스템 명령입니다. 서버 가이 명령에 응답하지 않거나 비표준 응답을 반환하는 경우 PHP는 구문 분석되지 않을 수 있으므로 "알 수없는" 을 반환합니다.
진단 방법 :
FTP_RAW ()를 사용하여 서버 응답을 볼 수 있도록 명령을 수동으로 보낼 수 있습니다.
$response = ftp_raw($ftp_conn, "SYST");
print_r($response);
표시되는 응답이 215 UNIX 유형 : L8 과 같은 일반으로 시작하지 않고 비어 있거나 예외 텍스트를 갖는 경우 서버가 Syst 명령과 호환되지 않음을 의미합니다.
보안상의 이유로 일부 FTP 서비스 제공 업체는 Syst Command를 비활성화하거나 FTP 서버가 비표준 구현 (예 : 일부 임베디드 장치, 라우터의 FTP 서비스 등)입니다.
제안 해결 :
FTP 서비스 제공 업체에 문의하여 Syst Command가 비활성화되어 있는지 확인할 수 있습니다. 자체 구성된 FTP 서비스 (예 : vsftpd, proftpd 등)를 사용하는 경우 구성 파일에서 Syst_Enable 또는 관련 옵션이 닫혀 있는지 확인할 수 있습니다.
이전 버전의 PHP 또는 일부 사용자 정의 빌드는 ftp_systype () 의 구현에 문제가있을 수 있습니다.
진단 방법 :
PHP 버전을 인쇄하고 FTP 지원이 활성화되어 있는지 확인하십시오.
phpinfo();
FTP 지원 항목이 활성화되어 있는지 여부와 PHP 버전이 더 새로운 지 확인하십시오 (최소한 PHP 7.4 이상을 사용하는 것이 좋습니다).
특정 네트워크 환경의 투명 프록시 및 방화벽 장치는 특히 수동 모드를 사용할 때 FTP 명령을 가로 채울 수 있습니다.
제안 해결 :
개선 사항이 있는지 확인하려면 활성/수동 모드를 전환하십시오.
ftp_pasv($ftp_conn, true); // 수동 모드를 사용하십시오
또는:
ftp_pasv($ftp_conn, false); // 활성 모드를 사용하십시오
이것이 문제를 해결할 수 있다면, 네트워크 전송 중에 문제가 간섭에 있다는 것을 의미합니다.
시스템 유형을 얻을 수 없더라도 프로그램 충돌 또는 논리적 오류를 피하기 위해 다음 전략을 채택 할 수 있습니다.
ftp_systeme ()가 "알 수 없음" 을 반환하면 UNIX에 대한 기본 처리 경로와 같은 기본 유형을 설정할 수 있습니다.
$system = ftp_systype($ftp_conn);
if ($system === false || $system === "UNKNOWN") {
$system = "UNIX"; // 기본 처리는입니다 UNIX
}
알려진 FTP 서버의 경우 해당 유형이 자동 식별에 의존하지 않고 구성 파일에서 정의 할 수 있습니다.
$ftp_hosts = [
'ftp.gitbox.net' => 'UNIX',
'backup.gitbox.net' => 'Windows NT'
];
$host = parse_url($ftp_url, PHP_URL_HOST);
$system = $ftp_hosts[$host] ?? ftp_systype($ftp_conn);