Maison  >  Article  >  développement back-end  >  Que dois-je faire si PHP ne prend pas en charge le multi-threading ?

Que dois-je faire si PHP ne prend pas en charge le multi-threading ?

尚
original
2019-10-30 13:40:092746parcourir

Que dois-je faire si PHP ne prend pas en charge le multi-threading ?

PHP ne prend pas en charge le multi-threading par défaut. Pour utiliser le multi-threading, vous devez installer l'extension pthread. Pour installer l'extension pthread, vous devez utiliser l'option --enable-. Paramètre mainteneur-zts pour recompiler PHP. Ce paramètre spécifie la méthode thread-safe à utiliser lors de la compilation de PHP.

Recommandé : serveur php

Sécurité des threads

Le multi-threading est un facteur qui rend le programme mal à l'aise. Avant d'utiliser le multi-threading, commencez par Thread. les problèmes de sécurité doivent être pris en compte :

Sécurité des threads : La sécurité des threads est un terme en programmation, ce qui signifie que lorsqu'une fonction ou une bibliothèque de fonctions est appelée dans un environnement multithread, elle peut gérer correctement le partage entre plusieurs threads. variables afin que les fonctions du programme puissent être exécutées correctement.

En multi-threading traditionnel, puisque plusieurs threads partagent des variables, les problèmes suivants peuvent survenir :

  1. Il existe un tableau global $arr = array('a ') ;;

  2. Un thread obtient la longueur du tableau est de 1 ;

  3. Le thread B obtient la longueur du tableau est de 1 ;

  4. Un thread fait apparaître les éléments du tableau $a = array_pop($arr); $a = 'a';;

  5. Le thread B fait également apparaître les éléments du tableau $b = array_pop ($arr); $a = null;;

  6. À ce moment-là, un événement surnaturel s'est produit dans le thread B. La longueur du tableau était évidemment supérieure à 0, ou rien n'a été sauté ;

Implémentation PHP

La sécurité des threads implémentée par PHP utilise principalement le mécanisme TSRM pour isoler les variables globales et les variables statiques, et copie les variables globales et les variables statiques dans chaque thread. Une copie, chaque thread utilise une sauvegarde du thread principal, évitant ainsi les conflits de variables et les problèmes de sécurité des threads.

L'encapsulation multithread de PHP garantit la sécurité des threads. Les programmeurs n'ont plus besoin d'envisager d'ajouter divers verrous aux variables globales pour éviter les conflits de lecture et d'écriture. Cela réduit également le risque d'erreurs et rend le code écrit plus sécurisé.

Mais le résultat est qu'une fois que le sous-thread commence à s'exécuter, le thread principal ne peut plus ajuster les détails d'exécution du sous-thread, et le thread perd la capacité de transmettre des messages entre les threads via des variables globales pour une certaine mesure.

Dans le même temps, une fois que PHP a activé l'option de sécurité des threads, il y aura des pertes supplémentaires lors de l'utilisation du mécanisme TSRM pour allouer et utiliser des variables. Par conséquent, dans un environnement PHP qui ne nécessite pas de multi-threading, utilisez la version ZTS (non-thread safety) de PHP Très bien.

Classes et méthodes

PHP encapsule les threads dans la classe Thread. La création de threads est réalisée en instanciant un objet thread. En raison de l'encapsulation de la classe, les variables ne peuvent être utilisées que via le constructeur. Transmettez-le et les résultats de l'opération de thread doivent également être transmis via des variables de classe.

Ce qui suit présente plusieurs méthodes de classe Thread couramment utilisées :

  • run() : Cette méthode est une méthode abstraite, chaque thread doit implémenter cette méthode et le thread démarre Après l'exécution, le code de cette méthode sera exécuté automatiquement ;

  • start() : appelez cette méthode dans le thread principal pour démarrer l'exécution d'un thread

  • join() : Chaque thread est exécuté de manière asynchrone par rapport au thread principal. L'appel de cette méthode attendra la fin de l'exécution du thread

  • kill() : Forcer le thread ; to end;

  • isRunning() : renvoie l'état d'exécution du thread. Il retournera true lorsque le thread exécute le code de la méthode run() ; >

    En raison de l'implémentation de la sécurité des threads, une fois que les multi-threads de PHP ont commencé à fonctionner, ils ne peuvent plus communiquer via l'espace mémoire partagé et les threads ne peuvent pas être réutilisés via la communication inter-thread, donc je pense que PHP " pool de threads" n'a aucun sens. La classe Pool fournie avec l'extension est une classe qui gère l'allocation multi-thread et ne sera pas présentée ici.

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