PHP 네트워크 프로그래밍에서 다중화 처리는 효율적인 네트워크 서비스를 달성하기위한 핵심 기술입니다. socket_set_option 및 socket_select 는 PHP 소켓 프로그래밍에서 두 가지 중요한 기능입니다. 많은 개발자들은 함께 사용할 수 있는지, 특히 멀티플렉싱을 구현할 때 올바르게 일치하는 방법을 궁금해 할 것입니다.
이 기사에서는 Socket_set_option 및 Socket_select 의 역할을 자세히 설명하고 함께 사용할 수 있는지 논의하고 멀티플렉싱을 달성하는 방법을 소개합니다.
socket_set_option은 주소 재사용, 송신/수신 버퍼 크기 등과 같은 시간 초과 시간과 같은 소켓 옵션을 설정하는 데 사용됩니다.이 기능은 소켓의 행동 특성을 조정하는 것입니다.
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
위의 코드는 소켓의 주소 재사용 옵션을 설정하며, 이는 서버가 다시 시작될 때 포트를 빠르게 바인딩하는 데 사용됩니다.
Socket_Select는 멀티플렉싱을 구현하는 핵심 기능입니다. 여러 소켓을 듣는 데 사용되며, 하나 이상의 소켓을 읽고 쓸 준비가되면 기능이 반환됩니다. 이를 통해 단일 스레드 프로그램이 여러 연결을 동시에 처리 할 수 있습니다.
$read = [$socket1, $socket2];
$write = null;
$except = null;
$timeout = 5;
$num_changed = socket_select($read, $write, $except, $timeout);
socket_select 배열을 제외한 $ read , $ write 및 $를 수정하여 준비된 소켓을 반환합니다.
대답은 그렇습니다 . 그러나 둘의 기능은 다릅니다. 함께 사용하면 용도를 명확하게 구별해야합니다.
socket_set_option은 소켓 동작 (예 : 시간 초과, 버퍼 등)을 구성하는 데 사용됩니다.
Socket_select는 여러 소켓이 읽을 수 있는지, 쓰기 가능 또는 예외가 있는지를 듣는 데 사용됩니다.
멀티플렉싱은 주로 socket_select 에 의존하지만 socket_set_option은 소켓의 특성 만 조정합니다. 일반적으로 소켓이 생성 된 후에 설정된 소켓의 속성과 socket_select가 사용되기 전에.
다음은 Socket_select를 사용하여 여러 클라이언트 연결을 듣는 동안 Socket_select를 사용하는 동안 Socket_set_option 으로 소켓 옵션을 설정하는 방법을 보여주는 간단한 서버 예제입니다.
<?php
// 만들다 TCP socket
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);
// 바인드 포트
socket_bind($server, '0.0.0.0', 8080);
socket_listen($server);
$clients = [];
$read = [$server];
while (true) {
$readSockets = $read;
$write = null;
$except = null;
// 여러분을 듣습니다 socket 변화
$numChanged = socket_select($readSockets, $write, $except, 5);
if ($numChanged === false) {
echo "socket_select 오류가 발생했습니다\n";
break;
} elseif ($numChanged > 0) {
// 새로운 클라이언트 연결을 듣습니다
if (in_array($server, $readSockets)) {
$newClient = socket_accept($server);
if ($newClient !== false) {
socket_set_option($newClient, SOL_SOCKET, SO_RCVTIMEO, ["sec"=>5, "usec"=>0]);
$clients[] = $newClient;
$read[] = $newClient;
echo "새로운 클라이언트 연결\n";
}
unset($readSockets[array_search($server, $readSockets)]);
}
// 기존 클라이언트가 전송하는 프로세스 데이터
foreach ($readSockets as $socket) {
$data = socket_read($socket, 1024, PHP_NORMAL_READ);
if ($data === false || $data === '') {
// 연결이 닫힙니다
socket_close($socket);
unset($clients[array_search($socket, $clients)]);
unset($read[array_search($socket, $read)]);
echo "클라이언트 연결이 끊어졌습니다\n";
} else {
$data = trim($data);
echo "클라이언트 데이터를 받았습니다: $data\n";
// 응답을 보내십시오
socket_write($socket, "서버가 접수되었습니다: $data\n");
}
}
}
}
socket_close($server);
키 포인트 설명 :
서버 소켓 $ 서버는 빠른 포트 재사용을 보장하기 위해 socket_set_option 으로 so_reuseaddr을 설정합니다.
새 클라이언트 연결이 설정되면 수신 시간 초과 옵션도 Socket_set_option 으로 설정됩니다.
Socket_select는 모든 활성 클라이언트 소켓 및 서버 소켓을 듣기 위해 멀티플렉싱 메커니즘이 올바르게 작동하는지 확인합니다.
socket_set_option 및 socket_select 함수는 다르지만 조합으로 사용할 수 있고 사용해야합니다.
Socket_set_option은 소켓 매개 변수를 구성하고 네트워크 성능 및 동작을 최적화하는 데 도움이됩니다.
Socket_select는 다중 소켓 이벤트를 멀티플렉싱하고 듣는 데 책임이 있습니다.
이 두 기능을 합리적으로 사용하면 효율적이고 안정적인 네트워크 서버 프로그램을 작성할 수 있습니다.
PHP 소켓 멀티플렉싱을 심층적으로 배우려면 공식 문서 및 관련 네트워크 프로그래밍 책을 참조하여 자세한 내용과 고급 기술을 마스터 할 수 있습니다.
기사의 예제의 URL 도메인 이름은 다음과 같습니다.
$url = "https://gitbox.net/api/socket_demo";