Maison  >  Article  >  développement back-end  >  Connaissance de base de Socket en PHP

Connaissance de base de Socket en PHP

墨辰丷
墨辰丷original
2018-06-07 15:27:031432parcourir

Cet article présente principalement les connaissances de base de Socket en PHP. Les amis intéressés peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Que sont TCP/IP et UDP ?

TCP/IP (Transmission Control Protocol/Internet Protocol) est un ensemble de protocoles standards industriels conçus pour les réseaux étendus (WAN).
UDP (User Data Protocol, User Datagram Protocol) est un protocole correspondant à TCP. Il fait partie de la suite de protocoles TCP/IP.
Voici un schéma montrant la relation entre ces protocoles.

2015811151417312.jpg (596×448)

La suite de protocoles TCP/IP comprend la couche transport, la couche réseau et la couche liaison. Vous connaissez maintenant la relation entre TCP/IP et UDP.
Où est la prise ? Sur la figure 1, nous ne voyons pas l’ombre de Socket, alors où est-elle ? Utilisons des images pour parler clairement.

2015811151446490.jpg (542×476)

Il s'avère que le Socket est ici.
Qu'est-ce que Socket ? Socket est une couche d'abstraction logicielle intermédiaire pour la communication entre la couche application et la suite de protocoles TCP/IP. Il s'agit d'un ensemble d'interfaces. En mode conception, Socket est en fait un mode façade, qui cache la famille complexe de protocoles TCP/IP derrière l'interface Socket. Pour les utilisateurs, un ensemble d'interfaces simples permet à Socket d'organiser les données pour se conformer au protocole spécifié.
Pouvez-vous les utiliser ? Les générations précédentes ont fait beaucoup pour nous et la communication entre les réseaux est devenue beaucoup plus simple, mais après tout, il reste encore beaucoup de travail à faire. Quand j'ai entendu parler de la programmation Socket auparavant, je pensais qu'il s'agissait de connaissances en programmation relativement avancées, mais tant que nous comprendrons le principe de fonctionnement de la programmation Socket, le mystère sera levé.
Une scène de la vie. Si vous souhaitez appeler un ami, composez d'abord le numéro. Lorsque l'ami entend la sonnerie, il décroche le téléphone. Vous et votre ami êtes alors connectés et vous pouvez parler. Une fois la communication terminée, raccrochez pour mettre fin à la conversation. Des scènes de la vie expliquent comment cela fonctionne. Peut-être que la famille des protocoles TCP/IP est née dans la vie, mais ce n'est pas nécessairement le cas.

2015811151507191.jpg (478×491)

Présentation de la programmation Socket en PHP php5.3 est livré avec un module socket, qui permet à PHP d'avoir des capacités de communication socket. Pour des API spécifiques, veuillez. reportez-vous au manuel officiel : http ://php.net/manual/zh/function.socket-create.php, l'implémentation spécifique est très similaire à c, sauf qu'il lui manque les opérations sous-jacentes d'allocation de mémoire et de réseau conversion de l'ordre des octets

En même temps, le module pcntl de PHP et le module posix peuvent réaliser la gestion de base des processus, le traitement du signal et d'autres fonctions au niveau du système d'exploitation. Il y a ici deux fonctions très clés, pcntl_fork() et posix_setsid(). Forker () un processus signifie créer une copie du processus en cours d'exécution. La copie est considérée comme un processus enfant et le processus d'origine est considéré comme le processus parent. Une fois fork() exécuté, il peut être séparé du processus et du contrôle de terminal qui l'ont démarré, ce qui signifie également que le processus parent peut se terminer librement. Valeur de retour pcntl_fork(), -1 indique un échec d'exécution, 0 indique dans le processus enfant et supérieur à 0 indique dans le processus parent. setsit(), qui fait d'abord du nouveau processus le "leader" d'une nouvelle session, et finalement fait que le processus ne contrôle plus le terminal. C'est également l'étape la plus critique pour devenir un processus démon, ce qui signifie que le processus ne sera pas forcé de se terminer à la fermeture du terminal. Il s’agit d’une étape critique pour un processus résident qui ne peut être interrompu. Effectuez le dernier fork(). Cette étape n'est pas nécessaire, mais elle est généralement effectuée. Sa plus grande importance est d'empêcher l'obtention du terminal de contrôle

Qu'est-ce qu'un processus démon ? Un démon est généralement considéré comme une tâche en arrière-plan qui ne contrôle pas le terminal. Il présente trois caractéristiques évidentes :

  1. Fonctionne en arrière-plan

  2. Détaché du processus qui l'a déclenché

  3. Pas besoin de contrôle de terminal

La méthode d'implémentation la plus courante : fork() -> setsid() -> implémente le processus démon .

Code de surveillance des sockets côté serveur

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

Effet de l'opérationDémarrez le processus de socket côté serveur pour voir s'il s'exécute dans le arrière-plan. L'effet est le suivant :

2015811151526030.png (985×174)

L'accès client est accessible via un navigateur ou curl Ici, curl est utilisé pour accéder directement à

2015811151634550.png (930×64)

Résumé : Ce qui précède représente l'intégralité du contenu de cet article, j'espère qu'il sera utile à l'étude de chacun.

Recommandations associées :

Comment utiliser les fonctions magiques et les constantes magiques PHP

Comment utiliser les méthodes magiques PHP __call et __callStatic

PHP Comment pour lire des fichiers CSV volumineux et les importer dans la base de données

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn