ホームページ  >  記事  >  バックエンド開発  >  PHPでのデーモン処理の記述例を詳しく解説

PHPでのデーモン処理の記述例を詳しく解説

黄舟
黄舟オリジナル
2017-02-28 09:59:301123ブラウズ

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(&#39;www.codinglabs.org&#39;, 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.ん)!

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。