PHP でのデーモンプロセスの作成
今日の午後、segmentfault.com で質問のタイトルを「サービス指向 PHP を実装する方法」というもので、PHP は Web 経由でのみ呼び出すことができるかどうかを尋ねていました。実際、多くの人が PHP の使用シナリオについて誤解しています。PHP は Web スクリプトを作成するためにのみ使用できると考えています。実際、PHP 4 以降、PHP の使用シナリオは Web リクエストの処理に限定されなくなりました。 PHP のアーキテクチャ システムの観点から見ると、PHP は、sapi、php コア、zend エンジンの 3 つのレベルに分かれています。 PHP コア自体は Web と連携していません。たとえば、mod_php は、Apache 用に作成された sapi 実装であり、これらの sapi と組み合わせて使用されます。 Web サーバーは Web リクエストを処理します。ただし、Web と関係のない Sapi も多数あります。たとえば、cli sapi はコマンドライン環境で php を直接実行でき、embed sapi は他の言語 (Lua など) に php を埋め込むことができます。ここでは、PHP のアーキテクチャ システムと SAPI について詳しく説明するつもりはありません。アーキテクチャ システムの観点から、PHP はすでにさまざまな環境をサポートするように設計されており、Web に固有のものではないことを説明したいと思います。 アーキテクチャ システムのサポートに加えて、PHP の豊富な拡張モジュールは、さまざまな環境で PHP が機能するためのサポートも提供します。たとえば、この記事で説明した pcntl モジュールと POSIX モジュールは、基本的なプロセス管理、信号処理、その他のオペレーティング システムを実現できます。 -level 関数とソケット モジュールにより、PHP はソケット通信機能を使用できるようになります。したがって、PHP を使用して、シェルや Perl で一般的に使用されるものと同様のツール スクリプト、さらにはサーバーの性質を持つデーモン プロセスを作成することができます。 PHP でデーモン サーバーを作成する方法を示すために、PHP で単純な http サーバーを作成しました。このサーバーはデーモン プロセスとして実行されます。もちろん、PHP を使用してデーモンを作成する方法に重点を置くため、この http サーバーには特定のビジネス ロジックは実装しませんでしたが、指定されたポートをリッスンし、http リクエストを受け入れ、クライアントに固定テキストを返すことができます。プロセス全体はソケットを通じて実装されます。
コード例
以下は、このプログラムの完全なコードです:
<?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 環境プログラミングに精通していると思いますので、あまり詳しく説明しません。それはアウトです。簡単に言うと、このプログラムは主に 2 つの部分で構成されています。handle_http_request 関数は、C で記述された tcp サーバーと同様に、ソケットを作成し、バインドし、リッスンし、各接続を処理します。クライアントは、接続が受け入れられたら...
上記は、PHP でのデーモン プロセスの記述例の詳細な説明です。詳細については、PHP 中国語 Web サイト (www.php.ん)!