Maison >développement back-end >tutoriel php >Exemple d'implémentation multithread PHP
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('localhost', 80, $errno, $errmsg); fputs($fp, "GET /a.php?act=b\r\n\r\n"); //这里的第二个参数是HTTP协议中规定的请求头 //不明白的请看RFC中的定义 fclose($fp); } function a() { $fp = fopen('result_a.log', 'w'); fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "\r\n"); fclose($fp); } function b() { $fp = fopen('result_b.log', 'w'); fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "\r\n"); fclose($fp); } if(!isset($_GET['act'])) $_GET['act'] = 'a'; if($_GET['act'] == 'a') { runThread(); a(); } else if($_GET['act'] == 'b') 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
À 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!