php에서 socket_export_stream () 은 매우 실용적인 기능입니다. 기본 소켓 확장 리소스를 더 높은 수준의 스트림 스트림으로 변환하여 fwrite () , stream_socket_sendto () , Stream_Select () 등과 같은보다 풍부한 스트리밍 기능을 사용하여 데이터 전송 및 수신을 처리 할 수 있습니다. 이 변환은 이벤트 중심 모델 또는 스트림 컨텍스트 제어와 같은 Stream_* 시리즈 기능이 통합되는 환경에서 특히 유용합니다.
그러나 socket_export_stream ()을 사용한 후 많은 개발자들은 stream_socket_sendto () 와 같은 함수와 함께 데이터를 올바르게 보내는 방법에 대한 질문이 있습니다. 이 기사는이 과정을 자세히 분석합니다.
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($socket, '0.0.0.0', 12345);
// 할 것이다 socket 리소스로 변환 stream 의지
$stream = socket_export_stream($socket);
이 $ 스트림은 파일처럼 작동 할 수있는 PHP 스트림 리소스입니다. 현재 데이터 처리에 소켓 함수 대신 스트림 기능을 사용할 수 있습니다.
stream_socket_sendto ()는 일반적으로 연결 프로토콜 (예 : UDP)없이 데이터를 보내는 데 사용됩니다. 변환 된 스트리밍 리소스를 사용할 때는 다음에주의를 기울여야합니다.
스트림은 부패하지 않거나 수동으로 새로 고쳐야합니다 ( fflush ).
주소 형식은 표준 URI 형식이어야합니다.
UDP의 경우 대상 주소가 제공되어야합니다.
$remote = 'udp://m66.net:12345';
$message = "Hello via stream!";
// 알아채다:stream 쓰기 가능해야합니다,대상 주소가 정확해야합니다
$bytesSent = stream_socket_sendto($stream, $message, 0, $remote);
if ($bytesSent === false) {
echo "실패를 보냅니다。\n";
} else {
echo "성공적으로 보냈습니다 $bytesSent 바이트。\n";
}
Stream_Select ()를 사용하면 다중 socket_export_stream 변환 리소스와 같은 여러 스트림 (예 : 다중 socket_export_stream)이 동시에 읽을 수 있고 쓰기 가능한지 모니터링 할 수 있으며, 이는 비 블로킹 I/O 프로그래밍에 매우 적합합니다.
$read = [$stream];
$write = null;
$except = null;
$changed = stream_select($read, $write, $except, 5);
if ($changed > 0) {
$data = fread($stream, 1024);
echo "수신 된 데이터:$data\n";
}
물론 대상 주소를 명시 적으로 지정하지 않고 fwrite ()를 직접 사용할 수도 있습니다.
fwrite($stream, "Simple write to stream\n");
이 방법은 연결 지향 프로토콜 또는 바인딩 후 원격 UDP 소켓에 적합하다는 점에 유의해야합니다.
Socket_export_stream () 을 통해 원래 소켓을 PHP 스트림으로 변환 한 후 Stream_Socket_Sendto () , fwrite () , Stream_Select () 등과 같은 고급 기능을 쉽게 사용하여 데이터를 전송하고 수신하여 코드의 유지 관리 및 유연성을 향상시킬 수 있습니다. 사용하는 동안 대상 주소 형식, 리소스의 읽기 및 쓰기 상태 및 프로토콜의 특성 (예 : UDP가 연결되어 있는지 등)에주의를 기울여야합니다. 적절한 구성 후이 접근 방식은 현대적인 고성능 네트워크 통신 구성 요소를 구축하는 데 매우 적합합니다.