현재 위치: > 최신 기사 목록> socket_set_option 및 socket_select는 멀티플렉싱을 달성하기 위해 결합하여 사용됩니다.

socket_set_option 및 socket_select는 멀티플렉싱을 달성하기 위해 결합하여 사용됩니다.

gitbox 2025-05-26

PHP 네트워크 프로그래밍에서 다중화 처리는 효율적인 네트워크 서비스를 달성하기위한 핵심 기술입니다. socket_set_optionsocket_select 는 PHP 소켓 프로그래밍에서 두 가지 중요한 기능입니다. 많은 개발자들은 함께 사용할 수 있는지, 특히 멀티플렉싱을 구현할 때 올바르게 일치하는 방법을 궁금해 할 것입니다.

이 기사에서는 Socket_set_optionSocket_select 의 역할을 자세히 설명하고 함께 사용할 수 있는지 논의하고 멀티플렉싱을 달성하는 방법을 소개합니다.


1. Socket_set_option 및 socket_select의 기본 함수

socket_set_option

socket_set_option은 주소 재사용, 송신/수신 버퍼 크기 등과 같은 시간 초과 시간과 같은 소켓 옵션을 설정하는 데 사용됩니다.이 기능은 소켓의 행동 특성을 조정하는 것입니다.

 socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);

위의 코드는 소켓의 주소 재사용 옵션을 설정하며, 이는 서버가 다시 시작될 때 포트를 빠르게 바인딩하는 데 사용됩니다.

socket_select

Socket_Select는 멀티플렉싱을 구현하는 핵심 기능입니다. 여러 소켓을 듣는 데 사용되며, 하나 이상의 소켓을 읽고 쓸 준비가되면 기능이 반환됩니다. 이를 통해 단일 스레드 프로그램이 여러 연결을 동시에 처리 할 수 ​​있습니다.

 $read = [$socket1, $socket2];
$write = null;
$except = null;
$timeout = 5;

$num_changed = socket_select($read, $write, $except, $timeout);

socket_select 배열을 제외한 $ read , $ write 및 $를 수정하여 준비된 소켓을 반환합니다.


2. Socket_set_option 및 Socket_Select를 함께 사용할 수 있습니까?

대답은 그렇습니다 . 그러나 둘의 기능은 다릅니다. 함께 사용하면 용도를 명확하게 구별해야합니다.

  • socket_set_option은 소켓 동작 (예 : 시간 초과, 버퍼 등)을 구성하는 데 사용됩니다.

  • Socket_select는 여러 소켓이 읽을 수 있는지, 쓰기 가능 또는 예외가 있는지를 듣는 데 사용됩니다.

멀티플렉싱은 주로 socket_select 에 의존하지만 socket_set_option은 소켓의 특성 만 조정합니다. 일반적으로 소켓이 생성 된 후에 설정된 소켓의 속성과 socket_select가 사용되기 전에.


3. Socket_select를 사용하여 멀티플렉싱 예제를 구현하려면 socket_set_option을 사용하십시오

다음은 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는 모든 활성 클라이언트 소켓 및 서버 소켓을 듣기 위해 멀티플렉싱 메커니즘이 올바르게 작동하는지 확인합니다.


4. 결론

  • socket_set_optionsocket_select 함수는 다르지만 조합으로 사용할 수 있고 사용해야합니다.

  • Socket_set_option은 소켓 매개 변수를 구성하고 네트워크 성능 및 동작을 최적화하는 데 도움이됩니다.

  • Socket_select는 다중 소켓 이벤트를 멀티플렉싱하고 듣는 데 책임이 있습니다.

  • 이 두 기능을 합리적으로 사용하면 효율적이고 안정적인 네트워크 서버 프로그램을 작성할 수 있습니다.


PHP 소켓 멀티플렉싱을 심층적으로 배우려면 공식 문서 및 관련 네트워크 프로그래밍 책을 참조하여 자세한 내용과 고급 기술을 마스터 할 수 있습니다.


기사의 예제의 URL 도메인 이름은 다음과 같습니다.

 $url = "https://gitbox.net/api/socket_demo";