Maison > Article > développement back-end > Comment PHP gère le multithreading
Manuel recommandé : Manuel d'auto-apprentissage complet php
Traitement PHP multi-threading
Notes
1. PHP5.3 ou supérieur, et il s'agit d'une version thread-safe. Les compilateurs utilisés par Apache et PHP doivent être cohérents.
2. Si Thread Safety est activé via phpinfo(), il s'agit d'une version thread-safe.
3. Vous pouvez connaître le compilateur utilisé en affichant l'élément Compilateur via phpinfo(). Le mien est : MSVC9 (Visual C++ 2008).
Mon environnement d'utilisation
Windows XP sp3 32 bits, wampserver2.2d (php5.3.10-vc9 + apache2.2.21-vc9).
1. Téléchargez l'extension pthreads
Selon mon environnement, j'ai téléchargé pthreads-2.0.8-5.3-ts-vc9-x86.
2.0.8 représente la version de pthreads.
5.3 représente la version php.
ts signifie que php nécessite une version thread-safe.
vc9 signifie que php doit être compilé avec le compilateur Visual C++ 2008.
x86 signifie 32 bits
2. Installez l'extension pthreads
1 Copiez php_pthreads.dll dans le répertoire binphpext. (Mon chemin est D : wampbinphpphp5.3.10ext)
2. Copiez pthreadVC2.dll dans le répertoire binphp. (Mon chemin est D:wampbinphpphp5.3.10)
3. Copiez pthreadVC2.dll dans le répertoire C:windowssystem32.
4. Ouvrez le fichier de configuration php.ini. Ajoutez l'invite extension=php_pthreads.dll
à la fin !
Le système Windows doit ajouter le chemin de pthreadVC2.dll à la variable d'environnement PATH. Poste de travail--->bouton droit de la souris--->Propriétés--->Avancé--->Variables d'environnement--->Variables système--->Rechercher le chemin nommé Chemin---> ;Modifier--->Ajouter le chemin complet de pthreadVC2.dll à la fin de la valeur de la variable.
3. Testez l'extension pthreads
class AsyncOperation extends \Thread { public function __construct($arg){ $this->arg = $arg; } public function run(){ if($this->arg){ printf("Hello %s\n", $this->arg); } } } $thread = new AsyncOperation("World"); if($thread->start()) $thread->join(); ?>
Hello World apparaît lorsque vous exécutez le code ci-dessus, indiquant que l'extension pthreads est installée avec succès !
2. curl_multi_init()
<?php echo date("Y-m-d H:m:s",time()); echo " "; echo floor(microtime()*1000); echo "<br>"; $mtime = explode(" ", microtime()); $mtime = $mtime[1].($mtime[0] * 1000); $mtime2 = explode(".", $mtime); $mtime = $mtime2[0]; echo $mtime; echo "<br>"; $urls = array( 'http://www.webkaka.com', 'http://www.webkaka.com', 'http://www.webkaka.com', 'http://www.webkaka.com', 'http://www.webkaka.com'); print_r(async_get_url($urls)); // [0] => example1, [1] => example2 echo "<br>"; echo date("Y-m-d H:m:s",time()); echo " "; echo floor(microtime()*1000); echo "<br>"; $mtime_ = explode(" ", microtime()); $mtime_ = $mtime_[1].($mtime_[0] * 1000); $mtime2_ = explode(".", $mtime_); $mtime_ = $mtime2_[0]; echo $mtime_; echo "<br>"; echo $mtime_ - $mtime; function async_get_url($url_array, $wait_usec = 0) { if (!is_array($url_array)) return false; $wait_usec = intval($wait_usec); $data = array(); $handle = array(); $running = 0; $mh = curl_multi_init(); // multi curl handler $i = 0; foreach($url_array as $url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return don't print curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect curl_setopt($ch, CURLOPT_MAXREDIRS, 7); curl_multi_add_handle($mh, $ch); // 把 curl resource 放进 multi curl handler 里 $handle[$i++] = $ch; } /* 执行 */ do { curl_multi_exec($mh, $running); if ($wait_usec > 0) /* 每个 connect 要间隔多久 */ usleep($wait_usec); // 250000 = 0.25 sec } while ($running > 0); /* 读取资料 */ foreach($handle as $i => $ch) { $content = curl_multi_getcontent($ch); $data[$i] = (curl_errno($ch) == 0) ? $content : false; } /* 移除 handle*/ foreach($handle as $ch) { curl_multi_remove_handle($mh, $ch); } curl_multi_close($mh); return $data; } ?>
À propos de curl_multi_init()
De manière générale, lorsque vous pensez à utiliser curl_multi_init( ) Lorsque le but est de demander plusieurs URL en même temps, plutôt que de les demander une par une, sinon curl_init() sera requis. Cependant, lorsque vous utilisez curl_multi, vous pouvez rencontrer des phénomènes tels qu'une consommation excessive du processeur et des pages Web suspendues. Vous pouvez voir comment résoudre le problème des pages Web suspendues causées par curl_multi.
Les étapes pour utiliser curl_multi sont résumées comme suit :
Étape 1 : Appeler curl_multi_init
Étape 2 : Appeler curl_multi_add_handle en boucle
Ce dont vous avez besoin auquel il faut prêter attention dans cette étape, le deuxième paramètre de curl_multi_add_handle est le sous-handle de curl_init.
Étape 3 : Continuez à appeler curl_multi_exec
Étape 4 : Appelez curl_multi_getcontent en boucle pour obtenir les résultats nécessaires
Étape 5 : Appelez curl_multi_remove_handle et appelez-le pour chaque mot handle curl_close
Étape 6 : Appeler curl_multi_close
Explication de chaque fonction :
curl_multi_init()
Initialiser un processus curl batch Gérer la ressource.
curl_multi_add_handle()
Ajoute une ressource curl handle distincte à la session curl batch. La fonction curl_multi_add_handle() a deux paramètres. Le premier paramètre représente une ressource de handle de lot curl et le deuxième paramètre représente une ressource de handle curl distincte.
curl_multi_exec()
Analyser un handle de lot curl. La fonction curl_multi_exec() a deux paramètres. Le premier paramètre représente une ressource de handle de lot et le deuxième paramètre est un paramètre de valeur de référence. indiquant le nombre de ressources de handle curl individuelles restantes qui doivent être traitées.
curl_multi_remove_handle()
Supprimer une ressource de handle dans la ressource de handle de lot curl. La fonction curl_multi_remove_handle() a deux paramètres. Le premier paramètre représente une ressource de handle de lot curl. ressource de gestion de boucle séparée.
curl_multi_close()
Fermez une ressource de gestion de lots.
curl_multi_getcontent()
Renvoie le flux de texte de la sortie récupérée si CURLOPT_RETURNTRANSFER est défini.
curl_multi_info_read()
Obtenez les informations de transmission pertinentes de la boucle actuellement analysée.
Articles connexes recommandés :Tutoriel vidéo Dugu Jiujian (4)_PHPTutoriel vidéo PHP
1.Comment implémenter le multi-threading en PHP
2.Trois façons d'implémenter le multi-threading en PHP
2.Trois façons d'implémenter le multi-threading en PHP
Recommandations vidéo associées :
1.
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!