socket_wsaprotocol_info_import는 높은 통화 비용을 가진 시스템 레벨 작업입니다. 서비스가 초기화 될 때와 같이 필요한 경우 또는 소켓이 실제로 프로세스간에 공유되는시기와 같은 경우에만 호출하는 것이 좋습니다. 수입 된 소켓은 동일한 설명자의 반복적 인 수입을 피하기 위해 메모리에 캐싱 될 수 있습니다.
$cache = [];
$hash = md5($info_string);
if (!isset($cache[$hash])) {
$cache[$hash] = socket_wsaprotocol_info_import($info_string);
}
$socket = $cache[$hash];
애플리케이션 아키텍처의 여러 프로세스가 소켓 정보를 공유 해야하는 경우 WSAPROTOCOL_INFO 문자열을 전송하기 위해 파일 또는 데이터베이스를 자주 사용하지 마십시오. PHP의 공유 메모리 확장 ( SHMOP 또는 Swoole \ Table 사용)을 통해 프로세스 간 효율적인 전송을 달성 할 수 있습니다.
$table = new Swoole\Table(1024);
$table->column('info', Swoole\Table::TYPE_STRING, 512);
$table->create();
$table->set('socket_key', ['info' => $info_string]);
이런 식으로 다른 프로세스는 디스크에 액세스하지 않고 공유 메모리에서 빠르게 읽을 수 있습니다.
높은 동시성 시나리오에서 소켓 가져 오기의 경우 비동기 메커니즘을 사용하여 주 스레드 차단을 방지하기 위해 Swoole 또는 ReactPHP 와 함께 코 루틴 스케줄링 소켓 가져 오기 프로세스를 사용하는 것과 같은 압력을 할당하는 것을 고려할 수 있습니다.
go(function () use ($info_string) {
$socket = socket_wsaprotocol_info_import($info_string);
// 후속 처리
});
소켓을 가져 오는 궁극적 인 목표는 재사용하는 것이므로보다 철저한 최적화 방법은 건축 수준에서 소켓 수명주기를 제어하는 것입니다. 예를 들어, 상위 프로세스에서 소켓을 생성 한 다음 Windows의 WSAduplicatesocket 메커니즘을 통해 하위 프로세스에 전달하고 한 번만 초기화하십시오.
어린이 프로세스가 가져 오기 직후 소켓을 닫지 않지만 여러 사용을 위해 연결 풀에 가입하십시오.
$socket_pool[] = socket_wsaprotocol_info_import($info_string);
// 당신은 후속 조치를 취할 수 있습니다 $socket_pool 재사용하십시오
성능 병목 현상은 기능 자체가 아니라 운영 체제의 리소스 제한 (예 : 핸들 수)에서 나올 수 있습니다. Windows 시스템에서는 레지스트리 매개 변수를 조정하여 소켓 핸들 한계를 높일 수 있습니다. 동시에 소켓 누출을 피하고 사용 후 각각의 수입 된 소켓이 합리적으로 닫혀 있는지 확인하십시오.
if (is_resource($socket)) {
socket_close($socket);
}
socket_wsaprotocol_info_import가 성능 병목 현상으로 의심되는 경우 시간이 많이 걸리는 상황을 기록합니다.
$start = microtime(true);
$socket = socket_wsaprotocol_info_import($info_string);
$duration = microtime(true) - $start;
error_log("Import duration: {$duration}s");
Windows 'Performance Monitor (Perfmon)와 함께 네트워크 IO를보고 문제의 근본 원인을 종합적으로 평가하기 위해 네트워크 IO, 사용, 메모리 및 기타 리소스를 처리합니다.
대규모 PHP 서비스에서는 소켓 디스크립터와 수입 및 내보내기 로직을 유지하는 가벼운 로컬 데몬 (예 : C ++ 또는 GO)을 설계하는 것을 고려하십시오. PHP는 간결한 인터페이스를 통해서만 통신하여 크로스 프로세스 전달의 복잡성을 크게 줄입니다. 예를 들어:
$info_string = file_get_contents("http://gitbox.net/socket-info?id=123");
$socket = socket_wsaprotocol_info_import($info_string);
로컬 HTTP 서비스 또는 UNIX 도메인 소켓 인터페이스를 통해 PHP 가져 오기 로직을 단순화합니다.