Existe-t-il un moyen réaliste d'implémenter un modèle multi-thread en PHP, que ce soit vraiment ou simplement en le simulant. Il y a quelque temps, il a été suggéré de forcer le système d'exploitation à charger une autre instance de l'exécutable PHP et à gérer d'autres processus simultanés.
Le problème avec cela est que lorsque le code PHP a fini d'exécuter l'instance PHP reste en mémoire car il n'y a aucun moyen de le tuer depuis PHP. Donc, si vous simulez plusieurs threads, vous pouvez imaginer ce qui va se passer. Je suis donc toujours à la recherche d'un moyen de faire du multi-threading ou de le simuler efficacement depuis PHP. Des idées?
php
multithreading
Steve Obbayi
la source
la source
Réponses:
Le multi-threading est possible en php
Oui, vous pouvez faire du multi-threading en PHP avec pthreads
De la documentation PHP :
Test simple
Première exécution
Deuxième manche
Exemple du monde réel
la source
pourquoi n'utilisez-vous pas popen ?
la source
Le filetage n'est pas disponible en stock PHP, mais une programmation simultanée est possible en utilisant des requêtes HTTP comme appels asynchrones.
Avec le paramètre de délai d'attente de la boucle défini sur 1 et en utilisant le même identifiant de session pour les processus que vous souhaitez associer les uns aux autres, vous pouvez communiquer avec des variables de session comme dans mon exemple ci-dessous. Avec cette méthode, vous pouvez même fermer votre navigateur et le processus simultané existe toujours sur le serveur.
N'oubliez pas de vérifier l'ID de session correct comme ceci:
startprocess.php
process1.php
verifysession.php
closeprocess.php
la source
set_time_limit(0);
beurk! Ne fais jamais ça.Bien que vous ne puissiez pas enfiler, vous avez un certain degré de contrôle de processus en php. Les deux jeux de fonctions utiles ici sont:
Fonctions de contrôle de processus http://www.php.net/manual/en/ref.pcntl.php
Fonctions POSIX http://www.php.net/manual/en/ref.posix.php
Vous pouvez bifurquer votre processus avec pcntl_fork - renvoyant le PID de l'enfant. Ensuite, vous pouvez utiliser posix_kill pour supprimer ce PID.
Cela dit, si vous tuez un processus parent, un signal doit être envoyé au processus enfant lui disant de mourir. Si php lui-même ne le reconnaît pas, vous pouvez enregistrer une fonction pour le gérer et faire une sortie propre en utilisant pcntl_signal.
la source
l'utilisation de threads est rendue possible par l'extension pthreads PECL
http://www.php.net/manual/en/book.pthreads.php
la source
Je sais que c'est une vieille question mais pour les personnes qui recherchent, il y a une extension PECL écrite en C qui donne maintenant la capacité de multi-threading PHP, elle est située ici https://github.com/krakjoe/pthreads
la source
Vous pouvez utiliser exec () pour exécuter un script de ligne de commande (tel que la ligne de commande php), et si vous dirigez la sortie vers un fichier, votre script n'attendra pas la fin de la commande.
Je ne me souviens pas vraiment de la syntaxe php CLI, mais vous voudriez quelque chose comme:
Je pense que bon nombre de serveurs d'hébergement partagé ont désactivé exec () par défaut pour des raisons de sécurité, mais cela pourrait valoir la peine d'essayer.
la source
Vous pouvez simuler le filetage. PHP peut exécuter des processus d'arrière-plan via popen (ou proc_open). Ces processus peuvent être communiqués via stdin et stdout. Bien sûr, ces processus peuvent eux-mêmes être un programme php. C'est probablement aussi proche que possible.
la source
Selon ce que vous essayez de faire, vous pouvez également utiliser curl_multi pour y parvenir.
la source
Je sais que c'est bien vieux, mais vous pouvez regarder http://phpthreadlib.sourceforge.net/
Il prend en charge la communication bidirectionnelle entre les threads et dispose également de protections intégrées pour éliminer les threads enfants (empêcher les orphelins).
la source
Vous pouvez avoir l'option de:
la source
La classe Thread est disponible depuis les pthreads PECL ≥ 2.0.0.
la source
Que diriez-vous de pcntl_fork?
consultez notre page de manuel pour des exemples: PHP pcntl_fork
la source
pcntl_fork
ne fonctionnera pas dans un environnement de serveur Web si le mode sans échec est activé. Dans ce cas, cela ne fonctionnera que dans la version CLI de PHP.la source
Si vous utilisez un serveur Linux, vous pouvez utiliser
Si vous avez besoin de passer quelques arguments
Dans script.php
Ou utilisez Symfony https://symfony.com/doc/current/components/process.html
la source
Au moment de la rédaction de mon commentaire actuel, je ne connaissais pas les threads PHP. Je suis venu chercher la réponse ici moi-même, mais une solution de contournement est que le programme PHP qui reçoit la demande du serveur Web délègue toute la formulation de la réponse à une application console qui stocke sa sortie, la réponse à la demande, à un fichier binaire et le programme PHP qui a lancé l'application console renvoie ce fichier binaire octet par octet comme réponse à la demande reçue. L'application console peut être écrite dans n'importe quel langage de programmation qui s'exécute sur le serveur, y compris ceux qui ont une prise en charge de thread appropriée, y compris les programmes C ++ qui utilisent OpenMP.
Une astuce peu fiable et sale consiste à utiliser PHP pour exécuter une application console, "uname",
et imprimez la sortie de cette commande de console dans la sortie HTML pour connaître la version exacte du logiciel serveur. Ensuite, installez la même version exacte du logiciel sur une instance de VirtualBox, compilez / assemblez les binaires entièrement autonomes, de préférence statiques, que vous souhaitez, puis téléchargez-les sur le serveur. À partir de ce moment, l'application PHP peut utiliser ces fichiers binaires dans le rôle de l'application console qui a le multi-threading approprié. C'est une solution de contournement sale et peu fiable à une situation où l'administrateur du serveur n'a pas installé toutes les implémentations de langage de programmation nécessaires sur le serveur. La chose à surveiller est qu'à chaque demande que l'application PHP reçoive la ou les applications de console se termine / exit / get_killed.
Quant à ce que les administrateurs de services d'hébergement pensent de ces modèles d'utilisation du serveur, je suppose que cela se résume à la culture. En Europe du Nord, le fournisseur de services DOIT LIVRER CE QUI A ÉTÉ ANNONCÉ et si l'exécution des commandes de la console a été autorisée et le téléchargement de fichiers non malveillants a été autorisé et le fournisseur de services a le droit de tuer tout processus de serveur après quelques minutes ou même après 30 secondes , alors les administrateurs du service d'hébergement n'ont aucun argument pour former une plainte appropriée. Aux États-Unis et en Europe occidentale, la situation / culture est très différente et je pense qu'il y a de grandes chances qu'aux États-Unis et / ou en Europe occidentale, le fournisseur de services d'hébergement refuse de servir les clients de services d'hébergement qui utilisent l'astuce décrite ci-dessus. C'est juste ma supposition, étant donné mon expérience personnelle avec les États-Unis services d'hébergement et compte tenu de ce que j'ai entendu d'autres sur les services d'hébergement en Europe occidentale. Au moment de la rédaction de mon commentaire actuel (2018_09_01), je ne connaissais rien aux normes culturelles des hébergeurs sud-européens, administrateurs de réseaux sud-européens.
la source
Peut-être que j'ai raté quelque chose, mais l'exec n'a pas fonctionné comme asynchrone pour moi dans l'environnement Windows que j'ai utilisé dans Windows et cela a fonctionné comme un charme;)
la source
Le multithreading signifie effectuer plusieurs tâches ou processus simultanément, nous pouvons y parvenir en php en utilisant le code suivant, bien qu'il n'y ait pas de moyen direct de réaliser le multithreading en php mais nous pouvons obtenir presque les mêmes résultats en suivant le chemin.
}
Test_1.php
Cela exécutera test_1.php deux fois simultanément et les deux processus s'exécuteront en arrière-plan simultanément, de cette façon, vous pouvez réaliser le multithreading en php.
Ce gars a fait du très bon travail Multithreading en php
la source