기본적으로 PHP 스크립트 실행 시간은 제한됩니다. 스크립트 가이 한도를 통해 실행되면 PHP는 스크립트 실행을 자동으로 종료합니다. 장기 소켓 서비스의 경우 Max_Execution_Time 구성으로 인해 PHP가 연결을 기다리는 동안 실행 시간의 상한에 도달 할 수 있으므로 Socket_Accept () 함수가 응답하지 않을 수 있습니다.
해결책:
php 구성 파일 php.ini 에서 max_execution_time 의 값을 추가하거나 코드에서 set_time_limit () 함수를 사용하여 실행 시간을 수정할 수 있습니다. 예를 들어:
set_time_limit(0); // 실행 시간에는 제한이 없습니다
서버와 클라이언트 간의 네트워크 연결이 방화벽에 의해 제한되면 Socket_accept ()는 클라이언트의 연결 요청을받지 못할 수 있습니다. 방화벽은 특정 포트에 대한 액세스를 차단하여 소켓 연결을 설정할 수 없습니다.
해결책:
PHP 스크립트가 듣는 포트가 방화벽 구성에서 액세스 할 수 있는지 확인하십시오.
Telnet 또는 NC 와 같은 도구를 사용하여 서버 포트가 열려 있는지 테스트하십시오.
telnet yourserver.m66.net 12345
연결이 성공하지 못한 경우 방화벽 구성을 확인하고 포트가 올바르게 열려 있는지 확인해야합니다.
php의 socket_accept () 함수는 클라이언트가 연결을 설정할 때까지 블록합니다. 서버가 지정된 주소 또는 포트에 올바르게 바인딩되지 않으면 Socket_accept ()는 응답하지 않습니다.
해결책:
서버 측의 바인딩 주소와 포트가 올바른지 확인하십시오. Socket_bind ()를 사용할 때 들어오는 IP 주소와 포트가 유효한지 확인하십시오. 예를 들어:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 12345); // 모두의 말을 들어라 IP 주소 12345 포트
socket_listen($socket);
때로는 클라이언트가 연결 요청을 올바르게 시작하지 못할 수있어 Socket_Accept () 함수가 응답에 실패합니다. 이는 클라이언트가 사용하는 잘못된 주소 또는 포트로 인한 것일 수 있거나 클라이언트가 연결 요청을 보내지 않습니다.
해결책:
클라이언트가 Socket_connect () 함수를 올바르게 사용하여 서버에 연결하고 대상 서버의 IP 주소와 포트 번호가 정확한지 확인하십시오. 예를 들어:
$client_socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($client_socket, 'yourserver.m66.net', 12345);
기본적으로 Socket_accept () 는 차단 작업입니다. 즉, 클라이언트 연결이있을 때까지 대기합니다. 차단을 피하려면 소켓을 비 블로킹 모드로 설정할 수 있습니다.
해결책:
socket_set_nonblock ()을 사용하여 서버 측 소켓을 비 블로킹 모드로 설정하십시오.
socket_set_nonblock($socket);
이러한 방식으로 Socket_accept ()는 연결없이 오랫동안 차단하지 않지만 즉시 돌아 오며 루프를 통해 연결 요청이 있는지 계속 확인할 수 있습니다.
운영 체제는 일반적으로 프로세스가 열 수있는 파일 설명자 수를 제한합니다. 서버에 연결 처리에 동시 연결이 많이 있고 운영 체제가 파일 디스크립터 제한이 낮은 경우 Socket_accept ()가 영향을받을 수 있으며 새 연결을 수락 할 수 없습니다.
해결책:
운영 체제의 파일 설명 자 제한을 확인하고 필요에 따라 제한 사항을 추가하십시오. 다음 명령을 사용하여 현재 한도를 확인할 수 있습니다.
ulimit -n
한계를 추가 해야하는 경우 시스템 구성 파일 (예 : /etc/security/limits.conf )을 수정하여 최대 파일 설명자 수를 늘릴 수 있습니다.
PHP 코드에 교착 상태 또는 기타 차단 로직이있는 경우 Socket_accept ()가 실행되거나 응답하지 못할 수 있습니다. 리소스 경쟁 또는 부적절한 잠금 작업으로 인해 프로그램이 고정되지 않도록 코드의 동기화 메커니즘을 확인하십시오.
해결책:
장기 실행중인 잠금 작업이 없는지 확인하십시오.
로그 및 디버깅 도구를 사용하여 코드의 교착 상태 또는 기타 성능 병목 현상을 확인하십시오.
문제를 신속하게 찾을 수 있도록 오류 처리 및 디버깅 정보를 코드에 추가 할 수 있습니다. Socket_accept () 자체는 연결이 없을 때 False를 반환하므로 오류를 포착하고 더 많은 디버그 정보를 인쇄하여 문제가 어디에 있는지 알아낼 수 있습니다.
샘플 코드 :
$client = socket_accept($socket);
if ($client === false) {
echo "Error: " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
// 처리 연결
}
오류 메시지를 인쇄하면 Socket_accept () 가 응답하지 않는 이유를 더 명확하게 이해하고 적절한 솔루션을 수행 할 수 있습니다.