PHP 작성 데몬 프로세스
오늘 오후에 Segmentfault.com에서 "PHP를 서비스로 구현하는 방법"이라는 질문을 봤습니다. 웹을 통해서만 호출할 수 있습니다. 실제로 많은 사람들이 PHP의 사용 시나리오에 대해 오해를 갖고 있습니다. 그들은 PHP를 웹 스크립트 작성에만 사용할 수 있다고 생각합니다. 실제로 PHP4부터 PHP의 사용 시나리오는 더 이상 웹 요청 처리에만 국한되지 않습니다. PHP 아키텍처 시스템의 관점에서 보면 PHP는 sapi, php core, zend 엔진의 세 가지 레벨로 구분됩니다. PHP 코어 자체는 웹과 결합되지 않습니다. 예를 들어, mod_php는 apache용으로 작성된 sapi 구현입니다. 이러한 sapi는 fastcgi 프로토콜과 함께 사용됩니다. 웹 서버는 웹 요청을 처리합니다. 하지만 웹과 관련이 없는 sapi도 많습니다. 예를 들어 cli sapi는 명령줄 환경에서 php를 직접 실행할 수 있고, embed sapi는 php를 다른 언어(예: Lua)에 포함시킬 수 있습니다. 여기서는 PHP의 아키텍처 시스템과 SAPI에 대한 주제를 자세히 논의할 생각은 없습니다. 단지 아키텍처 시스템의 관점에서 PHP는 이미 다양한 환경을 지원하도록 설계되었으며 웹에만 국한된 것이 아니라는 점만 설명하고 싶습니다. 아키텍처 시스템 지원 외에도 PHP의 풍부한 확장 모듈은 PHP가 다양한 환경에서 작동하도록 지원합니다. 예를 들어 이 기사에서 언급된 pcntl 모듈과 POSIX 모듈은 기본 프로세스 관리, 신호 처리 및 기타 운영 체제를 실현할 수 있습니다. -level 함수와 소켓 모듈을 사용하면 PHP가 소켓 통신 기능을 가질 수 있습니다. 따라서 PHP는 쉘이나 펄, 심지어 서버 특성을 지닌 데몬 프로세스에서 일반적으로 사용되는 것과 유사한 도구 스크립트를 작성하는 데 사용될 수 있습니다. PHP에서 데몬 서버를 작성하는 방법을 보여주기 위해 PHP에서 간단한 http 서버를 작성했습니다. 이 서버는 데몬 프로세스로 실행됩니다. 물론 PHP를 사용하여 데몬을 작성하는 방법에 집중하기 위해 이 http 서버에 대한 특정 비즈니스 로직을 구현하지는 않았지만 지정된 포트를 수신하고 http 요청을 수락하고 고정된 텍스트를 클라이언트에 반환할 수 있습니다. 전체 프로세스는 소켓을 통해 구현됩니다. 모두 PHP로 작성되었습니다.
코드 예
다음은 이 프로그램의 전체 코드입니다.
<?php //Accpet the http client request and generate response content. //As a demo, this function just send "PHP HTTP Server" to client. function handle_http_request($address, $port) { $max_backlog = 16; $res_content = "HTTP/1.1 200 OK Content-Length: 15 Content-Type: text/plain; charset=UTF-8 PHP HTTP Server"; $res_len = strlen($res_content); //Create, bind and listen to socket if(($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === FALSE) { echo "Create socket failed!\n"; exit; } if((socket_bind($socket, $address, $port)) === FALSE) { echo "Bind socket failed!\n"; exit; } if((socket_listen($socket, $max_backlog)) === FALSE) { echo "Listen to socket failed!\n"; exit; } //Loop while(TRUE) { if(($accept_socket = socket_accept($socket)) === FALSE) { continue; } else { socket_write($accept_socket, $res_content, $res_len); socket_close($accept_socket); } } } //Run as daemon process. function run() { if(($pid1 = pcntl_fork()) === 0) //First child process { posix_setsid(); //Set first child process as the session leader. if(($pid2 = pcntl_fork()) === 0) //Second child process, which run as daemon. { //Replaced with your own domain or address. handle_http_request('www.codinglabs.org', 9999); } else { //First child process exit; exit; } } else { //Wait for first child process exit; pcntl_wait($status); } } //Entry point. run(); ?>
여기 모두가 Unix 환경 프로그래밍에 익숙하다고 가정하므로 너무 자세히 설명하지는 않고 그냥 정리하겠습니다. 간단히 말해서 이 프로그램은 주로 http 요청 처리를 담당하는 두 부분으로 구성됩니다. 작성 방법은 C로 작성된 TCP 서버와 유사합니다. 소켓 생성, 바인딩, 수신 및 각 연결을 통해 처리합니다. loop.client, 연결이 승인되면...
위는 PHP에서 데몬 프로세스를 작성하는 예제에 대한 자세한 설명입니다. PHP 중국어 홈페이지 (www.php.cn) !