>  기사  >  백엔드 개발  >  PHPSocket 프로그래밍의 다중 프로세스 에코 서버에 대한 자세한 소개(그림 및 텍스트)

PHPSocket 프로그래밍의 다중 프로세스 에코 서버에 대한 자세한 소개(그림 및 텍스트)

不言
不言원래의
2018-09-13 17:11:021456검색

이 기사는 PHPSocket 프로그래밍의 다중 프로세스 에코 서버에 대한 자세한 소개(그림 및 텍스트)를 제공합니다. 이는 특정 참고 가치가 있으므로 도움이 될 수 있습니다.

마지막 에코 서비스 프로그램은 동시에 하나의 클라이언트에만 연결할 수 있다는 큰 단점이 있는데, 이는 명백히 불합리합니다.

그래서 이번에는 여러 클라이언트에게 동시에 서비스를 제공하기 위해 다중 프로세스 접근 방식을 사용합니다.

다음은 최종 효과입니다.

PHPSocket 프로그래밍의 다중 프로세스 에코 서버에 대한 자세한 소개(그림 및 텍스트)

(우리가 만든 작업자 프로세스는 ps 명령을 통해 볼 수 있습니다.)

PHPSocket 프로그래밍의 다중 프로세스 에코 서버에 대한 자세한 소개(그림 및 텍스트)

(xshell을 통해 여러 터미널을 열고 여러 터미널을 서비스 프로그램 클라이언트)

코딩을 시작하기 전에 먼저 프로세스가 무엇인지 소개하겠습니다.

프로세스, 즉 메모리를 점유하는 실행 중인 프로그램은 독립적인 메모리 공간입니다. 예를 들어 Windows에서 메모장 소프트웨어를 열 때 이 작업은 프로세스를 여는 것과 같습니다.

멀티 프로세스는 여러 프로세스를 만들어 하나의 일을 함께 완성하는 것입니다.

이번에는 서버측 프로그램만 구현하면 되며 클라이언트는 이전 프로그램을 계속 사용할 수 있습니다. 이전 기사를 읽지 않았다면 역사적인 기사를 확인해 보세요.

PHP에서는 pcntl_fork 함수를 사용하여 프로세스를 만들 수 있습니다.

다음은 함수의 프로토타입입니다.

int pcntl_fork ( void )

공식 설명:

성공하면 생성된 자식 프로세스의 PID가 부모 프로세스 실행 스레드에 반환되고, 자식 프로세스 실행 스레드에는 0이 반환됩니다. 실패하면 상위 프로세스 컨텍스트에 -1이 반환되고 하위 프로세스가 생성되지 않으며 PHP 오류가 발생합니다.

부모 프로세스에 의해 실행되는 스레드라고 하는 이유는 프로세스에 하나 이상의 스레드가 포함되어 있고 이 스레드가 프로세스의 기본 스레드이기 때문입니다.

상위 프로세스가 pcntl_fork를 호출하면 이 하위 프로세스도 상위 프로세스와 동일한 컨텍스트를 갖습니다. 즉, 두 프로세스는 동일한 코드를 공유합니다.

코딩 프로세스 입력:

PHPSocket 프로그래밍의 다중 프로세스 에코 서버에 대한 자세한 소개(그림 및 텍스트)

pcntl_fork 함수를 실행하면 하위 프로세스가 동시에 복사됩니다. 이때 컨텍스트가 상위 프로세스의 실행 환경인 경우 반환 값은 다음과 같습니다. 자식 프로세스의 프로세스 번호입니다. 자식 프로세스의 실행 환경이라면 0을 반환한다. 따라서 다음 if 프로그램 구조에서는 두 분기가 모두 실행됩니다.

하위 프로세스는 여전히 이전과 동일한 논리로, 클라이언트로부터 메시지를 수신하고 동시에 클라이언트에 보내는 데 사용됩니다.

두 번째 줄은 pcntl_waitpid 함수를 호출합니다. 이 함수를 설명하기 전에 먼저 좀비 프로세스가 무엇인지 이해해 보겠습니다.

일반적으로 하위 프로세스는 상위 프로세스를 통해 생성됩니다. 프로세스는 독립적인 메모리 구조이므로 상위 프로세스는 하위 프로세스의 실행 상태를 알 수 없습니다. 자식 프로세스가 작업을 완료한 후에는 스스로 종료할 수 없습니다. 이때 부모 프로세스는 자식 프로세스를 재활용하기 위해 운영 체제를 통해 자식 프로세스의 상태를 얻어야 합니다. 그렇지 않으면 우리의 자식 프로세스는 가비지 리소스, 즉 좀비 프로세스가 됩니다.

다음은 이 함수의 함수 프로토타입입니다.

int pcntl_waitpid ( int $pid , int &$status [, int $options = 0 ] )

공식 설명:

fork의 하위 프로세스 상태를 기다리거나 반환합니다.

실제로 위 코드에 문제가 있습니다. foreach에서 처음으로 pcntl_waitpid를 호출한 후, 이때 실제로 메인 프로세스가 차단되어 첫 번째 자식 프로세스가 종료되기를 기다리며, 다른 자식 프로세스가 비정상일 경우 이때 종료하게 되면 메인 프로세스에서 재활용되지 않고 좀비 프로세스가 생성됩니다. 실제 개발에서 기본 프로세스는 여전히 다른 작업을 수행해야 합니다.

여기에서는 non-blocking 방법을 권장합니다. 세 번째 매개변수인 WNOHANG을 추가하면 됩니다. 즉, pcntl_waitpid ($pid, $status, WNOHANG)

이렇게 하면 하위 프로세스가 종료되지 않고 즉시 반환되어 후속 코드를 계속 실행할 수 있습니다.

관련 추천:

서버측 PHP 다중 프로세스 프로그래밍 실습

서버측 PHP 다중 프로세스 프로그래밍 실습_PHP 튜토리얼

위 내용은 PHPSocket 프로그래밍의 다중 프로세스 에코 서버에 대한 자세한 소개(그림 및 텍스트)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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