Grundkenntnisse von Socket in PHP

墨辰丷
Freigeben: 2023-03-30 13:48:02
Original
1440 Leute haben es durchsucht

Dieser Artikel stellt hauptsächlich die Grundkenntnisse von Socket in PHP vor. Ich hoffe, dass er für alle hilfreich ist.

Was sind TCP/IP und UDP?

TCP/IP (Transmission Control Protocol/Internet Protocol) ist ein industrieller Standardprotokollsatz, der für Weitverkehrsnetze (WANs) entwickelt wurde.
UDP (User Data Protocol, User Datagram Protocol) ist ein Protokoll, das TCP entspricht. Es ist Mitglied der TCP/IP-Protokollsuite.
Hier ist ein Diagramm, das die Beziehung zwischen diesen Protokollen zeigt.

2015811151417312.jpg (596×448)

Die TCP/IP-Protokollsuite umfasst die Transportschicht, die Netzwerkschicht und die Verbindungsschicht. Jetzt kennen Sie die Beziehung zwischen TCP/IP und UDP.
Wo ist die Steckdose? In Abbildung 1 sehen wir den Schatten von Socket nicht. Wo ist er also? Lassen Sie uns Bilder verwenden, um klar zu sprechen.

2015811151446490.jpg (542×476)

Es stellt sich heraus, dass der Sockel hier ist.
Was ist Socket? Socket ist eine zwischengeschaltete Software-Abstraktionsschicht für die Kommunikation zwischen der Anwendungsschicht und der TCP/IP-Protokollsuite. Es handelt sich um eine Reihe von Schnittstellen. Im Entwurfsmodus ist Socket eigentlich ein Fassadenmodus, der die komplexe TCP/IP-Protokollfamilie hinter der Socket-Schnittstelle verbirgt. Für Benutzer ist alles eine Reihe einfacher Schnittstellen, die es Socket ermöglichen, Daten so zu organisieren, dass sie dem angegebenen Protokoll entsprechen.
Können Sie sie verwenden? Frühere Generationen haben viel für uns getan und die Kommunikation zwischen Netzwerken ist viel einfacher geworden, aber es gibt immer noch viel zu tun. Als ich zuvor von Socket-Programmierung hörte, dachte ich, es handele sich um relativ fortgeschrittene Programmierkenntnisse, aber solange wir das Funktionsprinzip der Socket-Programmierung verstehen, wird das Rätsel gelöst sein.
Eine Szene aus dem Leben. Wenn Sie einen Freund anrufen möchten, wählen Sie zuerst die Nummer. Nachdem der Freund den Klingelton hört, nimmt er den Hörer ab. Zu diesem Zeitpunkt sind Sie und Ihr Freund verbunden und Sie können sprechen. Wenn die Kommunikation beendet ist, legen Sie den Hörer auf, um das Gespräch zu beenden. Szenen aus dem Leben erklären, wie das funktioniert. Vielleicht wurde die TCP/IP-Protokollfamilie im Leben geboren, aber das ist nicht unbedingt der Fall.

2015811151507191.jpg (478×491)

Überblick über die Socket-Programmierung in PHP php5.3 verfügt über ein Socket-Modul, das PHP über Socket-Kommunikationsfunktionen verfügt, bitte für bestimmte APIs Weitere Informationen finden Sie im offiziellen Handbuch: http://php.net/manual/zh/function.socket-create.php. Die spezifische Implementierung ist c sehr ähnlich, außer dass die zugrunde liegenden Operationen der Speicherzuweisung und des Netzwerks fehlen Konvertierung der Bytereihenfolge

Gleichzeitig können das pcntl-Modul von PHP und das Posix-Modul grundlegende Prozessmanagement-, Signalverarbeitungs- und andere Funktionen auf Betriebssystemebene realisieren. Hier gibt es zwei sehr wichtige Funktionen, pcntl_fork() und posix_setsid(). Das Forken () eines Prozesses bedeutet, dass eine Kopie des laufenden Prozesses erstellt wird. Die Kopie wird als untergeordneter Prozess betrachtet, und der ursprüngliche Prozess wird als übergeordneter Prozess betrachtet. Nachdem fork() ausgeführt wurde, kann es vom Prozess und der Terminalsteuerung, die es gestartet hat, getrennt werden, was auch bedeutet, dass der übergeordnete Prozess frei beendet werden kann. Der Rückgabewert von pcntl_fork() bedeutet, dass -1 einen Ausführungsfehler anzeigt, 0 einen Ausführungsfehler im untergeordneten Prozess anzeigt und größer als 0 einen Ausführungsfehler im übergeordneten Prozess anzeigt. setztit(), was den neuen Prozess zunächst zum „Leiter“ einer neuen Sitzung macht und schließlich dafür sorgt, dass der Prozess das Terminal nicht mehr kontrolliert. Dies ist auch der kritischste Schritt auf dem Weg zu einem Daemon-Prozess, was bedeutet, dass der Prozess nicht zum Beenden gezwungen wird, wenn das Terminal geschlossen wird. Dies ist ein kritischer Schritt für einen residenten Prozess, der nicht unterbrochen werden kann. Führen Sie den letzten fork() aus. Dieser Schritt ist nicht notwendig, wird aber normalerweise durchgeführt. Seine größte Bedeutung besteht darin, zu verhindern, dass das Steuerterminal abgerufen wird.

Was ist ein Daemon-Prozess? Ein Daemon wird normalerweise als Hintergrundaufgabe betrachtet, die das Terminal nicht steuert. Es weist drei offensichtliche Merkmale auf:

  1. Läuft im Hintergrund

  2. Getrennt von dem Prozess, der es gestartet hat

  3. Keine Terminalsteuerung erforderlich

Die häufigste Implementierungsmethode: fork() -> setsid() -> implementiert den Daemon-Prozess.

Serverseitiger Socket-Überwachungscode

  <?php 
   
  // 接受客户端请求,回复固定的响应内容 
  function server_listen_socket ($address, $port) 
  { 
    $buffer = "Msg from wangzhengyi server, so kubi..."; 
    $len = strlen($buffer); 
     
    // create, bind and listen to socket 
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
    if (! $socket) { 
      echo "failed to create socket:" . socket_strerror($socket) . "\n"; 
      exit(); 
    } 
     
    $bind_flag = socket_bind($socket, $address, $port); 
    if (! $bind_flag) { 
      echo "failed to bind socket:" . socket_strerror($bind_flag) . "\n"; 
      exit(); 
    } 
     
    $backlog = 20; 
    $listen_flag = socket_listen($socket, $backlog); 
    if (! $listen_flag) { 
      echo "failed to listen to socket:" . socket_strerror($listen_flag) . "\n"; 
      exit(); 
    } 
     
    echo "waiting for clients to connect\n"; 
     
    while (1) { 
      if (($accept_socket = socket_accept($socket)) == FALSE) { 
        continue; 
      } else { 
        socket_write($accept_socket, $buffer, $len); 
        socket_close($accept_socket); 
      } 
    } 
  } 
   
  function run_server () 
  { 
    $pid1 = pcntl_fork(); 
    if ($pid1 == 0) { 
      // first child process 
       
      // 守护进程的一般流程:fork()->setsid()->fork() 
      posix_setsid(); 
       
      if (($pid2 = pcntl_fork()) == 0) { 
        $address = "192.168.1.71"; 
        $port = "8767"; 
        server_listen_socket($address, $port); 
      } else { 
        // 防止获得控制终端 
        exit(); 
      } 
    } else { 
      // wait for first child process exit 
      pcntl_wait($status); 
    } 
  } 
   
  // server守护进程 
  run_server();
Nach dem Login kopieren

VorgangseffektStarten Sie den serverseitigen Socket-Prozess, um zu sehen, ob er im Hintergrund ausgeführt wird. Der Effekt ist wie folgt:

2015811151526030.png (985×174)

Der Clientzugriff kann über einen Browser oder Curl erfolgen. Hier wird Curl für den direkten Zugriff verwendet

2015811151634550.png (930×64)

Zusammenfassung:Das Obige ist der gesamte Inhalt dieses Artikels, ich hoffe, dass er für das Studium aller hilfreich sein wird.

Verwandte Empfehlungen:

So verwenden Sie magische PHP-Funktionen und magische Konstanten

So verwenden Sie die magischen PHP-Methoden __call und __callStatic

PHP How um große CSV-Dateien zu lesen und in die Datenbank zu importieren

Das obige ist der detaillierte Inhalt vonGrundkenntnisse von Socket in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage