>  기사  >  백엔드 개발  >  PHP의 소켓에 대한 기본 지식

PHP의 소켓에 대한 기본 지식

墨辰丷
墨辰丷원래의
2018-06-07 15:27:031404검색

이 글은 주로 PHP의 소켓에 대한 기본 지식을 소개합니다. 관심 있는 친구들이 참고하면 좋겠습니다.

TCP/IP와 UDP가 무엇인가요?

                                                        TCP/IP(전송 제어 프로토콜/인터넷 프로토콜)는 광역 네트워크(WAN)용으로 설계된 전송 제어 프로토콜/인터넷 프로토콜입니다.
           UDP(User Data Protocol, User Datagram Protocol)는 TCP에 해당하는 프로토콜입니다. 이는 TCP/IP 프로토콜 제품군의 구성원입니다.表 여기에 이러한 프로토콜 간의 관계를 보여주는 그림이 있습니다.

2015811151417312.jpg (596×448)

TCP/IP 프로토콜 제품군에는 전송 계층, 네트워크 계층 및 링크 계층이 포함됩니다. 이제 TCP/IP와 UDP의 관계를 알았습니다.


소켓은 어디에 있나요?  그림 1에서는 소켓의 그림자가 보이지 않는데 소켓은 어디에 있나요? 사진이 스스로 말하도록 합시다.

2015811151446490.jpg (542×476)

여기에 소켓이 있는 것으로 나타났습니다.


소켓이란 무엇인가요?   소켓은 애플리케이션 계층과 TCP/IP 프로토콜 제품군 간의 통신을 위한 중간 소프트웨어 추상화 계층입니다. 디자인 모드에서 소켓은 실제로 소켓 인터페이스 뒤에 복잡한 TCP/IP 프로토콜 제품군을 숨기는 파사드 모드입니다. 사용자에게는 소켓이 지정된 프로토콜을 준수하도록 데이터를 구성할 수 있는 간단한 인터페이스 세트가 전부입니다.
사용할 수 있나요?  전임자들이 우리를 위해 많은 일을 해주셨고, 네트워크 간의 통신도 훨씬 단순해졌지만, 결국 아직 해야 할 일이 많습니다. 이전에 소켓 프로그래밍에 대해 들었을 때 상대적으로 고급 프로그래밍 지식이라고 생각했습니다. 그러나 소켓 프로그래밍의 작동 원리를 이해하는 한 미스터리는 풀릴 것입니다.  인생의 한 장면. 친구에게 전화를 걸려면 먼저 해당 번호를 누르세요. 친구가 벨소리를 들으면 전화를 받습니다. 이때, 당신과 당신의 친구는 연결되어 통화할 수 있습니다. 통화가 끝나면 전화를 끊어 통화를 종료하세요. 삶의 장면은 이것이 어떻게 작동하는지 설명합니다. 아마도 TCP/IP 프로토콜 계열이 삶에서 탄생했을 수도 있지만 반드시 그런 것은 아닙니다.

2015811151507191.jpg (478×491)

PHP의 소켓 프로그래밍 개요php5.3에는 PHP가 소켓 통신 기능을 가질 수 있도록 하는 소켓 모듈이 함께 제공됩니다. 특정 API에 대해서는 공식 매뉴얼(http://php.net/)을 참조하세요. manual/zh/function.socket -create.php, 특정 구현은 메모리 할당 및 네트워크 바이트 순서 변환의 기본 작업이 부족하다는 점을 제외하면 C와 매우 유사합니다동시에 PHP의 pcntl 모듈과 posix 모듈은 기본 프로세스 관리, 신호 처리 및 기타 운영 체제 수준 기능을 실현할 수 있습니다. 여기에는 pcntl_fork()와 posix_setsid()라는 두 가지 핵심 함수가 있습니다. 프로세스를 분기()하는 것은 실행 중인 프로세스의 복사본을 만드는 것을 의미하며 복사본은 하위 프로세스로 간주되고 원본 프로세스는 상위 프로세스로 간주됩니다. fork()가 실행된 후에는 이를 시작한 프로세스 및 터미널 제어에서 분리될 수 있습니다. 이는 또한 상위 프로세스가 자유롭게 종료될 수 있음을 의미합니다. pcntl_fork() 반환 값, -1은 실행 실패를 나타내고, 0은 하위 프로세스를 나타내고, 0보다 큰 것은 상위 프로세스를 나타냅니다. 먼저 새 프로세스를 새 세션의 "리더"로 만들고 마지막으로 프로세스가 더 이상 터미널을 제어하지 않게 만듭니다. 이는 데몬 프로세스가 되기 위한 가장 중요한 단계이기도 합니다. 즉, 터미널이 닫힐 때 프로세스가 강제로 종료되지 않습니다. 이는 중단할 수 없는 상주 프로세스에 대한 중요한 단계입니다. 마지막 fork()를 수행합니다. 이 단계는 필수는 아니지만 일반적으로 수행됩니다. 가장 큰 의미는 제어 터미널을 얻는 것을 방지하는 것입니다. 데몬은 일반적으로 터미널을 제어하지 않는 백그라운드 작업으로 간주됩니다. 여기에는 세 가지 분명한 특징이 있습니다.

백그라운드에서 실행

  1. 시작한 프로세스에서 분리됨

  2. 터미널 제어가 필요하지 않음

  3. 가장 일반적인 구현 방법: fork() -> ( ) -> 코드의 run_server() 메소드는 데몬 프로세스를 구현합니다.

서버 측 소켓 모니터링 코드

  <?php 
   
  // 接受客户端请求,回复固定的响应内容 
  function server_listen_socket ($address, $port) 
  { 
    $buffer = "Msg from wangzhengyi server, so kubi..."; 
    $len = strlen($buffer); 
     
    // create, bind and listen to socket 
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
    if (! $socket) { 
      echo "failed to create socket:" . socket_strerror($socket) . "\n"; 
      exit(); 
    } 
     
    $bind_flag = socket_bind($socket, $address, $port); 
    if (! $bind_flag) { 
      echo "failed to bind socket:" . socket_strerror($bind_flag) . "\n"; 
      exit(); 
    } 
     
    $backlog = 20; 
    $listen_flag = socket_listen($socket, $backlog); 
    if (! $listen_flag) { 
      echo "failed to listen to socket:" . socket_strerror($listen_flag) . "\n"; 
      exit(); 
    } 
     
    echo "waiting for clients to connect\n"; 
     
    while (1) { 
      if (($accept_socket = socket_accept($socket)) == FALSE) { 
        continue; 
      } else { 
        socket_write($accept_socket, $buffer, $len); 
        socket_close($accept_socket); 
      } 
    } 
  } 
   
  function run_server () 
  { 
    $pid1 = pcntl_fork(); 
    if ($pid1 == 0) { 
      // first child process 
       
      // 守护进程的一般流程:fork()->setsid()->fork() 
      posix_setsid(); 
       
      if (($pid2 = pcntl_fork()) == 0) { 
        $address = "192.168.1.71"; 
        $port = "8767"; 
        server_listen_socket($address, $port); 
      } else { 
        // 防止获得控制终端 
        exit(); 
      } 
    } else { 
      // wait for first child process exit 
      pcntl_wait($status); 
    } 
  } 
   
  // server守护进程 
  run_server();

작동 효과서버 측 소켓 프로세스를 시작하여 백그라운드에서 실행 중인지 확인합니다. 효과는 아래와 같습니다.

클라이언트 액세스. 브라우저나 컬을 통해 접근할 수 있는데 여기서는 컬을 사용하여 직접 접근했습니다

2015811151526030.png (985×174)

요약:2015811151634550.png (930×64)위 내용은 이 글의 전체 내용입니다. 모든 분들의 공부에 도움이 되었으면 좋겠습니다.

관련 추천:

PHP 매직 함수 및 매직 상수 사용 방법

__call 및 __callStatic, PHP 매직 메서드 사용 방법

PHP를 사용하여 CSV 대용량 파일을 읽고 데이터베이스로 가져오는 방법

위 내용은 PHP의 소켓에 대한 기본 지식의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.