Implémenter le multi-threading en PHP ? Quand vous voyez ce titre, vous devez penser que je suis fou... Mais en fait, je le fais vraiment.
Voici quelques-unes de mes méthodes, qui ont été testées. C'est effectivement possible
. que PHP lui-même ne prend pas en charge le multi-threading, mais notre serveur WEB prend en charge le multi-threading.
En d'autres termes, plusieurs personnes peuvent y accéder en même temps. C'est également la base pour moi d'implémenter le multi-threading en PHP. .
Supposons que nous exécutons le fichier a.php maintenant . Mais je demande également au serveur WEB d'exécuter un autre b.php dans le programme
,
donc les deux fichiers seront exécutés en même temps.
est envoyé, 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 une partie du code de ce fichier. Que devons-nous faire
? peut utiliser des paramètres pour contrôler le programme exécuté par a.php.
Voici un exemple :
//a .php.
Code PHP :------------------------------------------------------------- - ----------------------------------
<?php
fonction runThread()
{
$fp = fsockopen('localhost', 80, $errno, $errmsg);
fputs($fp, "GET /a.php?act=brnrn"); //Le deuxième paramètre ici est l'en-tête de requête spécifié dans le protocole HTTP.
//Si vous ne comprenez pas, veuillez consulter la définition dans RFC
fclose($fp);
}
fonction a()
{
$fp = fopen('result_a.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
fonction b()
{
$fp = fopen('result_b.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
if(!isset($_GET['act'])) $_GET['act'] = 'a';
si($_GET['act'] == 'a')
{
runThread();
un();
}
sinon 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, et vous pouvez l’améliorer sous d’autres formes.
Maintenant que le multi-threading est disponible en PHP, un problème se pose, celui de la synchronisation. Nous savons que PHP lui-même ne prend pas en charge le multi-threading. Il n'existe donc pas de méthode comme
synchroniser en Java. Alors que faire ?
.1.
Essayez de ne pas accéder à la même ressource pour éviter les conflits. Mais vous pouvez utiliser la base de données en même temps. Étant donné que la base de données prend en charge les opérations simultanées,n'écrivez pas de données dans le même fichier
en PHP multithread
. voulez écrire, utilisez d'autres méthodes pour la synchronisation. Par exemple, appelez flock pour verrouiller le fichier, etc. Ou créez un fichier temporaireet attendez la disparition du fichier dans un autre thread while(file_exits('xxx')); équivalent à Lorsque ce fichier temporaire existe, cela signifie que le thread fonctionne réellement
.S'il n'y a pas de fichier de ce type, cela signifie que d'autres threads l'ont publié
2. Essayez de ne pas lire les données de ce socket après que runThread ait exécuté fputs. Pour réaliser le multithreading, il est nécessaire d'utiliser le mode non bloquant. C'est-à-dire qu'il revient immédiatement lorsqu'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. n'est pas multithread. Il doit attendre le retour ci-dessus avant d'exécuter.Donc, si vous avez besoin d'échanger des données, vous pouvez enfin utiliser des fichiers ou des données externes pour le compléter. $fp) pour y parvenir.
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. En adoptant cette méthode, vous pouvez
lire différentes pages avec plusieurs fils de discussion en même temps.
J'ai créé un programme capable de rechercher des informations sur les sites Web de centres commerciaux tels que 8848 et soaso. Il existe également un programme qui lit les informations commerciales et les annuaires d'entreprises du site Web d'Alibaba et utilise également
cette technologie. Parce que les deux programmes doivent se connecter en permanence à leurs serveurs pour lire les informations et les enregistrer dans la base de données. L’utilisation de cette technologie élimine le goulot d’étranglement lié à l’attente d’une réponse.