Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung von Beispielen zum Schreiben eines Daemon-Prozesses in PHP

Detaillierte Erläuterung von Beispielen zum Schreiben eines Daemon-Prozesses in PHP

黄舟
黄舟Original
2017-02-28 09:59:301067Durchsuche

PHP-Schreibdaemon-Prozess

Ich habe heute Nachmittag eine Frage auf segmentfault.com gesehen. Der Titel der Frage lautete „So implementieren Sie PHP als Dienst“, in der gefragt wurde, ob PHP kann nur als Dienst genutzt werden, der über das Web aufgerufen wird. Tatsächlich haben viele Menschen Missverständnisse über die Verwendungsszenarien von PHP. Sie denken, dass PHP nur zum Schreiben von Webskripten verwendet werden kann. Tatsächlich sind die Verwendungsszenarien von PHP seit PHP4 nicht mehr auf die Verarbeitung von Webanfragen beschränkt. Aus Sicht des PHP-Architektursystems ist PHP in drei Ebenen unterteilt: Sapi, PHP Core und Zend Engine. Der PHP-Kern selbst ist nicht mit dem Web verbunden. Mod_php ist beispielsweise eine für Apache geschriebene Sapi-Implementierung. Diese Sapis werden in Verbindung mit verwendet Der Webserver verarbeitet Webanfragen. Es gibt aber auch viele Sapis, die nichts mit dem Web zu tun haben. Beispielsweise kann Cli Sapi PHP direkt in der Befehlszeilenumgebung ausführen und Embed Sapi kann PHP in andere Sprachen (wie Lua) einbetten. Ich habe nicht die Absicht, das Thema des PHP-Architektursystems und der SAPI im Detail zu diskutieren. Ich möchte lediglich erklären, dass PHP aus Sicht des Architektursystems bereits für die Unterstützung verschiedener Umgebungen entwickelt wurde und nicht nur für das Web gilt. Zusätzlich zur Unterstützung des Architektursystems bieten die umfangreichen Erweiterungsmodule von PHP auch Unterstützung für die Funktion von PHP in verschiedenen Umgebungen. Beispielsweise können das in diesem Artikel erwähnte pcntl-Modul und das POSIX-Modul grundlegende Prozessverwaltung, Signalverarbeitung und andere Betriebssysteme realisieren -Level-Funktion und das Sockets-Modul ermöglichen PHP die Socket-Kommunikation. Daher kann PHP zum Schreiben von Tool-Skripten verwendet werden, die denen ähneln, die üblicherweise von Shell oder Perl verwendet werden, oder sogar für einen Daemon-Prozess mit Servercharakter. Um zu zeigen, wie man einen Daemon-Server in PHP schreibt, habe ich einen einfachen http-Server in PHP geschrieben. Dieser Server läuft als Daemon-Prozess. Um mich darauf zu konzentrieren, wie man PHP zum Schreiben von Daemons verwendet, habe ich für diesen http-Server keine spezifische Geschäftslogik implementiert, aber er kann den angegebenen Port abhören, http-Anfragen akzeptieren und einen festen Text an den Client zurückgeben Der gesamte Prozess wird über Sockets implementiert. Alles in PHP geschrieben.

Codebeispiel

Hier ist der vollständige Code für dieses Programm:

<?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();
 
?>



Hier gehe ich davon aus, dass jeder mit der Unix-Umgebungsprogrammierung vertraut ist, daher werde ich es nicht zu sehr im Detail erklären, sondern es einfach klären. Vereinfacht ausgedrückt besteht dieses Programm hauptsächlich aus zwei Teilen. Die Funktion handle_http_request ist für die Verarbeitung von HTTP-Anfragen verantwortlich. Ihre Schreibmethode ähnelt der in C geschriebenen TCP-Server-Funktion: Socket erstellen, binden, abhören und dann jede Verbindung über a verarbeiten Schleife. Client, sobald eine Verbindung akzeptiert wird...

Das obige ist die detaillierte Erklärung des Beispiels zum Schreiben eines Daemon-Prozesses in PHP. Weitere verwandte Inhalte finden Sie unter PHP Chinesische Website (www.php.cn) !

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn