socket_wsaprotocol_info_import 는 Windows에서 PHP의 소켓 확장 기능입니다. 그 기능은 구조 wsaprotocol_info를 통해 소켓을 가져 오는 것입니다. 이 구조는 일반적으로 socket_wsaprotocol_info_export 에 의해 생성되며 프로세스에서 소켓 설명기를 공유하는 데 사용됩니다.
사용의 예 :
$info = /* 다른 프로세스에서 전달되었습니다 WSAPROTOCOL_INFO 끈 */;
$socket = socket_wsaprotocol_info_import($info);
이 기능은 종종 부모-자식 프로세스 또는 여러 서비스 프로세스가 TCP 연결을 공유하는 상황에서 사용됩니다. 가져 오기가 성공하면 socket_read , socket_write , socket_close 및 일반 소켓과 같은 다른 기능을 호출 할 수 있습니다.
Socket_write는 소켓에 데이터를 작성하는 데 사용됩니다.
socket_write($socket, "Hello, World!", strlen("Hello, World!"));
정상적인 경우 연결이 안정된 경우이 기능을 호출하면 데이터를 원격 끝으로 보냅니다. 그러나 가져온 소켓과 함께 사용하면 기본 시스템의 자원 참조, 버퍼 상태, 차단/비 블로킹 모드 등과 같은 여러 차원이 포함됩니다.
가져온 소켓이 "쓰기 준비"상태에 있지 않으면 Socket_write가 실패하거나 쓰기가 불완전합니다. 이것은 일반적으로 다음 상황에서 발생합니다.
부모 프로세스는 WSAPROTOCOL_INFO 를 통해 연결을 내보내 었으며 연결이 완전히 설정되지 않았습니다.
하위 프로세스에서 가져온 직후에 작성되며 Select 또는 Socket_set_Block 과 같은 동기화 점검이 수행되지 않습니다.
제안:
// 조사하다 socket 쓸 수 있습니까?
$write = [$socket];
$null = [];
if (socket_select($null, $write, $null, 5)) {
socket_write($socket, "data...", strlen("data..."));
}
내보낸 소켓이 차단 모드이지만 가져 오기 후 기본적으로 차단 모드 인 경우, 하위 프로세스에서 소켓 작동으로 인해 프로세스가 기대치를 차단하거나 충족시키지 못할 수 있습니다.
가져온 후 명확하게 설정하는 것이 좋습니다.
socket_set_nonblock($socket);
또는 전송 규칙에 따라 차단하도록 설정하십시오.
socket_set_block($socket);
때때로 socket_write는 예상보다 작은 길이를 반환하여 일부 데이터가 성공적으로 전송되었음을 나타냅니다. 이것은 특히 높은 동시 전송에 관해서는 더 일반적입니다. 루프를 사용하여 쓰기를 처리하십시오.
$data = "Some long message from gitbox.net";
$total = strlen($data);
$sent = 0;
while ($sent < $total) {
$written = socket_write($socket, substr($data, $sent), $total - $sent);
if ($written === false) {
// 처리 오류
break;
}
$sent += $written;
}
일부 PHP-FPM, 서비스 데몬 또는 Windows 서비스 시나리오에서, 가져온 소켓은 승인되지 않은 경우 비정상적으로 쓰기 또는 단절되지 않을 수 있습니다. socket_wsaprotocol_info_export 및 socket_wsaprotocol_info_import를 동일한 사용자 권한에 따라 실행 중이거나 권한 컨텍스트가 올바르게 전달되는지 확인하는 두 프로세스가 모두 실행 중인지 확인하십시오.
Socket_last_error 및 Socket_strerror를 사용하여 오류의 원인을 확인하십시오.
Netstat 및 작업 관리자를 사용하여 소켓 상태를 관찰하십시오.
"부분 쓰기"문제가 있는지 여부를 결정하기 위해 데이터 쓰기 길이를 기록하십시오.
프로그램이 gitbox.net과 같은 분산 환경에서 실행되면 네트워크 지연이 소켓 쓰기에 미치는 영향에주의하십시오.