Table des matières
Multiplexage d'E/S de socket natif PHP et implémentation d'un serveur Web
Syntaxe
语法
参数
优化
this is php worker
Maison développement back-end tutoriel php Multiplexage IO de la série PHP+Socket et implémentation du serveur Web

Multiplexage IO de la série PHP+Socket et implémentation du serveur Web

Feb 02, 2023 pm 01:43 PM
php socket

Cet article vous apporte des connaissances pertinentes sur php+socket, qui présente principalement le multiplexage IO et comment php+socket implémente le serveur Web ? Les amis intéressés peuvent jeter un œil ci-dessous. J'espère que cela sera utile à tout le monde.

Multiplexage d'E/S de socket natif PHP et implémentation d'un serveur Web

multiplexage

Article précédent Une communication serveur-client simple est obtenue via des sockets natifs, mais lorsqu'il y a plusieurs clients Lorsque le client est connecté, le serveur ne peut traiter que la demande du premier client, mais ne peut pas servir les clients suivants. La raison de cette situation est que le modèle IO est bloquant et qu'un seul client peut être utilisé en même temps. Pour y accéder, il existe deux solutions principales. résoudre ce problème :

Multiplexage IO de la série PHP+Socket et implémentation du serveur Web

Multi-processus, c'est-à-dire démarrer plusieurs processus sur le serveur pour surveiller

  • Mécanisme de multiplexage IO, qui implémente simplement l'utilisation de N clients Accès simultané via un seul câble réseau

  • Simultané le multiplexage est divisé en deux modèles différents, à savoir select et epoll. Dans les logiciels courants, Apache utilise le modèle select. , et nginx utilise le modèle epoll. Il existe un modèle select intégré à PHP, et la fonction correspondante est socket_select. Le multiplexage est la base de l'implémentation d'un serveur http

    Syntaxe

    en premier. Dans cet article, nous avons présenté que le socket natif de PHP possède la fonction socket_select intégrée pour implémenter le modèle select. Sa syntaxe est la suivante :
socket_select(
    array &$read,
    array &$write,
    array &$except,
    int $seconds [,
    int $microseconds = 0]): int|false
Copier après la connexion

Paramètresh4>

    readselectepoll,常见的软件中,Apache 使用了 select 模型,nginx 则使用 epoll 模型。在 php 中内置了 select 模型,对应的函数为 socket_select,多路复用是实现 http 服务器的基础

    语法

    在前文中我们介绍了 php 原生 socket 内置了 socket_select 函数实现了 select 模型,其语法如下:

    <?php
    
    // 创建套接字
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    
    // 设置 ip 被释放后立即可使用
    socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, true);
    
    // 绑定ip与端口
    socket_bind($socket, 0, 8888);
    
    // 开始监听
    socket_listen($socket);
    
    $sockets[] = $socket;
    
    while (true) {
        $tmp_sockets = $sockets;
        socket_select($tmp_sockets, $write, $except, null);
    
        foreach ($tmp_sockets as $sock) {
            // 如果当前套接字等于 socket_create 创建的套接字,说明是有新的连接或有新的断开连接
            if ($sock == $socket) {
                $conn_sock = socket_accept($socket);
                $sockets[] = $conn_sock;
                socket_getpeername($conn_sock, $ip, $port);
                echo &#39;请求ip: &#39; . $ip . &#39;端口: &#39; . $port . PHP_EOL;
            } else { // 否则说明是之前连接的客户端发来消息
                $msg = socket_read($sock, 10240);
                socket_write($sock, strtoupper($msg));
                echo $msg;
            }
        }
    }
    Copier après la connexion

    参数

    • read

      服务端监听的套接字资源,当他有变化(即收到新的消息或有客户端连接、断开)时,socket_select 函数才会返回(否则继续阻塞),同时修改该变量为当前发生事件(收到消息或有客户端连接、断开)的套接字资源列表,并继续向下执行。

    • write

      监听是否有客户端写数据,传入 null 则代表不关心是否有写变化

    • except

      套接字内要排除的元素,传入 null 是 「监听」 全部

    • seconds

      秒和微秒一起构成超时参数。如果传入 null 则会阻塞,为 0 非阻塞,如果是 >0 则为最大阻塞时间

    • microseconds

    优化

    我们在 上篇文章 简单实现了 socket 服务端监听与客户端的连接,接下来我们在服务端监听代码的基础上通过多路复用优化代码:

    <?php
    
    // 创建套接字
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    
    // 设置 ip 被释放后立即可使用
    socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, true);
    
    // 绑定ip与端口
    socket_bind($socket, 0, 8888);
    
    // 开始监听
    socket_listen($socket);
    
    $sockets[] = $socket;
    
    while (true) {
        $tmp_sockets = $sockets;
        socket_select($tmp_sockets, $write, $except, null);
    
        foreach ($tmp_sockets as $sock) {
            if ($sock == $socket) {
                $conn_sock = socket_accept($socket);
                $sockets[] = $conn_sock;
            } else {
                $msg = socket_read($sock, 10240);
                var_dump($msg);
                if ($msg == &#39;&#39;) return;
    
                $output = &#39;<h1 id="this-nbsp-is-nbsp-php-nbsp-worker">this is php worker</h1>&#39;;
                $len = strlen($output);
    
                $response = "HTTP/1.1 200 OK\r\n";
                $response .= "content-type: text/html\r\n";
                $response .= "server: php socket\r\n";
                $response .= "Content-Length: {$len}\r\n\r\n";
    
                $response .= $output;
    
                socket_write($sock, $response);
            }
        }
    }
    Copier après la connexion

    在本示例中 socket_select 函数会阻塞当前进程,当 $tmp_sockets 数组内的 socket 资源有新的客户端连接或断开或收到新消息时,会将 $tmp_sockets 数组修改为当前活跃的 socket 资源,随后通过遍历该数组处理业务逻辑

    Multiplexage IO de la série PHP+Socket et implémentation du serveur Web

    使用socket实现简易http服务器

    http 协议是在 socket 的基础上规定了指定的数据格式,所以我们只需在 socket_write 时按照格式发送数据,浏览器就可正常响应请求

    GET / HTTP/1.1
    Host: 124.222.**.**:8888
    Connection: keep-alive
    Cache-Control: max-age=0
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.9
    Cookie: jenkins-timestamper-offset=-28800000; _ga=GA1.1.1403944751.1652010033; _ga_2GM6102E19=GS1.1.1652802985.7.1.1652803014.0
    Copier après la connexion

    在服务端运行此示例,随后在浏览器访问 ip:8888 ,可以看到如下:

    Multiplexage IO de la série PHP+Socket et implémentation du serveur Web

    同时服务端会输出如下内容:

    rrreee

    该内容即为用户端请求原始数据,可解析此数据并根据请求做出响应,比如使用 file_get_content

    La ressource socket surveillée par le serveur Lorsqu'elle change (c'est-à-dire qu'un nouveau message est reçu ou qu'un client se connecte ou se déconnecte), le socket_select. La fonction peut revenir (sinon elle continuera à bloquer), et en même temps modifier la variable dans la liste des ressources de socket de l'événement en cours (message reçu ou connexion ou déconnexion client), et continuer à s'exécuter vers le bas .

    write

    Surveillez si le client écrit des données. En passant null signifie que vous ne vous souciez pas de savoir s'il y a des modifications en écriture

    . sauf code>🎜🎜Les éléments à exclure dans le socket, passer <code>null c'est "écouter" Toutes les 🎜🎜🎜🎜secondes🎜🎜secondes et microsecondes ensemble constituent le paramètre timeout . Si null est transmis, il bloquera, et s'il vaut 0, il sera non bloquant. S'il vaut >0, ce sera le temps de blocage maximum🎜🎜🎜🎜microsecondes</code.>🎜🎜🎜

    Optimisation🎜Nous avons simplement implémenté le socket dans Article précédent🎜 Le serveur surveille la connexion avec le client. Ensuite, nous optimisons le code via un multiplexage basé sur le code du moniteur du serveur : 🎜rrreee🎜Dans cet exemple, le socket_select La fonction bloquera le processus en cours. Lorsque $tmp_sockets a une nouvelle connexion ou déconnexion client ou reçoit un nouveau message, le tableau $tmp_sockets être modifié en ressource de socket actuellement active, puis traiter la logique métier en parcourant le tableau🎜🎜Capture d'écran du résultat de l'optimisation🎜 🎜🎜Utilisez socket pour implémenter un simple serveur http🎜🎜🎜Le protocole http spécifie le format de données spécifié en fonction du socket, nous n'avons donc besoin d'envoyer des données qu'en fonction du format lorsque socket_write, et le navigateur fonctionnera normalement. En réponse à la requête 🎜rrreee🎜Exécutez cet exemple sur le serveur, puis accédez à ip:8888 dans le navigateur, vous pouvez voir ce qui suit : 🎜🎜Multiplexage IO de la série PHP+Socket et implémentation du serveur Web🎜 🎜 En même temps, le serveur affichera le contenu suivant : 🎜rrreee 🎜Ce contenu est la demande du client Données brutes, vous pouvez analyser ces données et répondre en fonction de la demande, par exemple en utilisant file_get_content pour lire le contenu du fichier spécifié et renvoyez-le au navigateur.

    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 de ce site Web
    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

    Outils d'IA chauds

    Undresser.AI Undress

    Undresser.AI Undress

    Application basée sur l'IA pour créer des photos de nu réalistes

    AI Clothes Remover

    AI Clothes Remover

    Outil d'IA en ligne pour supprimer les vêtements des photos.

    Undress AI Tool

    Undress AI Tool

    Images de déshabillage gratuites

    Clothoff.io

    Clothoff.io

    Dissolvant de vêtements AI

    AI Hentai Generator

    AI Hentai Generator

    Générez AI Hentai gratuitement.

    Article chaud

    R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
    4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Meilleurs paramètres graphiques
    4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Comment réparer l'audio si vous n'entendez personne
    4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25: Comment déverrouiller tout dans Myrise
    1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

    Outils chauds

    Bloc-notes++7.3.1

    Bloc-notes++7.3.1

    Éditeur de code facile à utiliser et gratuit

    SublimeText3 version chinoise

    SublimeText3 version chinoise

    Version chinoise, très simple à utiliser

    Envoyer Studio 13.0.1

    Envoyer Studio 13.0.1

    Puissant environnement de développement intégré PHP

    Dreamweaver CS6

    Dreamweaver CS6

    Outils de développement Web visuel

    SublimeText3 version Mac

    SublimeText3 version Mac

    Logiciel d'édition de code au niveau de Dieu (SublimeText3)

    Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Dec 24, 2024 pm 04:42 PM

    PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

    Comment configurer Visual Studio Code (VS Code) pour le développement PHP Comment configurer Visual Studio Code (VS Code) pour le développement PHP Dec 20, 2024 am 11:31 AM

    Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

    Comment analysez-vous et traitez-vous HTML / XML dans PHP? Comment analysez-vous et traitez-vous HTML / XML dans PHP? Feb 07, 2025 am 11:57 AM

    Ce tutoriel montre comment traiter efficacement les documents XML à l'aide de PHP. XML (Language de balisage extensible) est un langage de balisage basé sur le texte polyvalent conçu à la fois pour la lisibilité humaine et l'analyse de la machine. Il est couramment utilisé pour le stockage de données et

    7 fonctions PHP que je regrette de ne pas connaître auparavant 7 fonctions PHP que je regrette de ne pas connaître auparavant Nov 13, 2024 am 09:42 AM

    Si vous êtes un développeur PHP expérimenté, vous aurez peut-être le sentiment d'y être déjà allé et de l'avoir déjà fait. Vous avez développé un nombre important d'applications, débogué des millions de lignes de code et peaufiné de nombreux scripts pour réaliser des opérations.

    Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Apr 05, 2025 am 12:04 AM

    JWT est une norme ouverte basée sur JSON, utilisée pour transmettre en toute sécurité des informations entre les parties, principalement pour l'authentification de l'identité et l'échange d'informations. 1. JWT se compose de trois parties: en-tête, charge utile et signature. 2. Le principe de travail de JWT comprend trois étapes: la génération de JWT, la vérification de la charge utile JWT et l'analyse. 3. Lorsque vous utilisez JWT pour l'authentification en PHP, JWT peut être généré et vérifié, et les informations sur le rôle et l'autorisation des utilisateurs peuvent être incluses dans l'utilisation avancée. 4. Les erreurs courantes incluent une défaillance de vérification de signature, l'expiration des jetons et la charge utile surdimensionnée. Les compétences de débogage incluent l'utilisation des outils de débogage et de l'exploitation forestière. 5. L'optimisation des performances et les meilleures pratiques incluent l'utilisation des algorithmes de signature appropriés, la définition des périodes de validité raisonnablement,

    Programme PHP pour compter les voyelles dans une chaîne Programme PHP pour compter les voyelles dans une chaîne Feb 07, 2025 pm 12:12 PM

    Une chaîne est une séquence de caractères, y compris des lettres, des nombres et des symboles. Ce tutoriel apprendra à calculer le nombre de voyelles dans une chaîne donnée en PHP en utilisant différentes méthodes. Les voyelles en anglais sont a, e, i, o, u, et elles peuvent être en majuscules ou en minuscules. Qu'est-ce qu'une voyelle? Les voyelles sont des caractères alphabétiques qui représentent une prononciation spécifique. Il y a cinq voyelles en anglais, y compris les majuscules et les minuscules: a, e, i, o, u Exemple 1 Entrée: String = "TutorialSpoint" Sortie: 6 expliquer Les voyelles dans la chaîne "TutorialSpoint" sont u, o, i, a, o, i. Il y a 6 yuans au total

    Expliquez la liaison statique tardive en PHP (statique: :). Expliquez la liaison statique tardive en PHP (statique: :). Apr 03, 2025 am 12:04 AM

    Liaison statique (statique: :) ​​implémente la liaison statique tardive (LSB) dans PHP, permettant à des classes d'appel d'être référencées dans des contextes statiques plutôt que de définir des classes. 1) Le processus d'analyse est effectué au moment de l'exécution, 2) Recherchez la classe d'appel dans la relation de succession, 3) il peut apporter des frais généraux de performance.

    Quelles sont les méthodes PHP Magic (__construct, __ destruct, __ call, __get, __set, etc.) et fournir des cas d'utilisation? Quelles sont les méthodes PHP Magic (__construct, __ destruct, __ call, __get, __set, etc.) et fournir des cas d'utilisation? Apr 03, 2025 am 12:03 AM

    Quelles sont les méthodes magiques de PHP? Les méthodes magiques de PHP incluent: 1. \ _ \ _ Construct, utilisé pour initialiser les objets; 2. \ _ \ _ Destruct, utilisé pour nettoyer les ressources; 3. \ _ \ _ Appel, gérer les appels de méthode inexistants; 4. \ _ \ _ GET, Implémentez l'accès à l'attribut dynamique; 5. \ _ \ _ SET, Implémentez les paramètres d'attribut dynamique. Ces méthodes sont automatiquement appelées dans certaines situations, améliorant la flexibilité et l'efficacité du code.

    See all articles