Maison  >  Article  >  développement back-end  >  Exemple d'implémentation multithread PHP

Exemple d'implémentation multithread PHP

黄舟
黄舟original
2017-11-11 13:32:033595parcourir

Le multi-threading PHP est un peu flou pour de nombreux amis qui découvrent PHP et à quoi il sert. Nous allons donc aujourd'hui vous expliquer le cas d'implémentation du multi-threading PHP !

Supposons que nous exécutions le fichier a.php maintenant. Mais dans le programme, je demande au serveur WEB d'exécuter un autre b.php

Ensuite, les deux fichiers seront exécutés en même temps. .

(PS : Après l'envoi d'une demande de lien, le serveur WEB l'exécutera, que le client soit sorti ou non)

Parfois, ce que nous voulons exécuter n'est pas un autre fichier, mais Que dois-je faire avec une partie du code de ce fichier ?

En fait, il utilise des paramètres pour contrôler quel programme a.php s'exécute

Regardons un exemple :

//a.php

PHP代码:--------------------------------------------------------------------------------
<?php
    function runThread()
    {
        $fp = fsockopen(&#39;localhost&#39;, 80, $errno, $errmsg);
        
        fputs($fp, "GET /a.php?act=b\r\n\r\n");        //这里的第二个参数是HTTP协议中规定的请求头
                                //不明白的请看RFC中的定义
        
        fclose($fp);
    }
    function a()
    {
        $fp = fopen(&#39;result_a.log&#39;, &#39;w&#39;);
        fputs($fp, &#39;Set in &#39; . Date(&#39;h:i:s&#39;, time()) . (double)microtime() . "\r\n");
        
        fclose($fp);        
    }
    function b()
    {
        $fp = fopen(&#39;result_b.log&#39;, &#39;w&#39;);
        fputs($fp, &#39;Set in &#39; . Date(&#39;h:i:s&#39;, time()) . (double)microtime() . "\r\n");
        
        fclose($fp);        
    }
    if(!isset($_GET[&#39;act&#39;])) $_GET[&#39;act&#39;] = &#39;a&#39;;
    
    if($_GET[&#39;act&#39;] == &#39;a&#39;)
    {
        runThread();
        a();
    }
    else if($_GET[&#39;act&#39;] == &#39;b&#39;) b();
?>
--------------------------------------------------------------------------------

Ouvrez result_a.log et result_b.log et comparez les temps d'accès des deux fichiers. Vous constaterez que ces deux-là s'exécutent effectivement dans des threads différents
Certaines fois sont exactement les mêmes.

Ce qui précède n'est qu'un exemple simple, vous pouvez l'améliorer dans d'autres formes

Puisque PHP peut également avoir du multithread, le problème est également survenu, et c'est là que réside le problème. problème de synchronisation. Nous savons que PHP lui-même ne prend pas en charge le multi-threading. Il n'y a donc rien de tel que la méthode de synchronisation en

Java Alors que devons-nous faire

1. pour accéder aux mêmes ressources. Pour éviter les conflits. Mais vous pouvez effectuer des opérations de base de données en même temps, car la base de données prend en charge les opérations simultanées, donc en PHP multithread,

n'écrivez pas. données dans le même fichier. Si vous devez écrire, utilisez d'autres méthodes de synchronisation. Par exemple, appelez le troupeau de l'hôpital de gynécologie de Pékin pour verrouiller le fichier, etc. Ou créez un fichier temporaire

et attendez que le fichier soit enregistré. disparaître dans un autre thread while (file_exits('xxx')); Cela signifie que lorsque ce fichier temporaire existe, cela signifie que le thread fonctionne réellement

Si le fichier n'existe pas, cela signifie que d'autres threads ont publié ceci.

2 . Essayez de ne pas lire les données du socket que runThread prend après l'exécution de fputs Parce que pour réaliser le multithread, il est nécessaire d'utiliser le mode non bloquant. une fonction comme fgets

est utilisée. Il y aura donc des problèmes lors de la lecture et de l'écriture des données. Si le mode de blocage est utilisé, le programme n'est pas multithread avant d'exécuter ce qui suit. programme. Donc, si vous avez besoin d'échanger des données, utilisez un fichier externe ou Completed dans les données. Si vous le souhaitez vraiment, utilisez socket_set_nonblock ($ fp) pour y parvenir

Résumé : Cela dit, cela a-t-il une signification pratique ? Quand est-il nécessaire d'utiliser cette méthode ?

La réponse est oui, comme nous le savons tous, dans. une application qui lit en permanence les ressources du réseau, la vitesse du réseau est un goulot d'étranglement. Si vous adoptez cette méthode, vous pouvez utiliser plusieurs threads pour lire

différentes pages en même temps. >

Recommandations associées :

Une méthode d'implémentation du multi-threading PHP - shell

Petit cas PHP multi-threading

À propos des problèmes de multi-threading PHP

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