Maison >développement back-end >Problème PHP >Comment PHP gère le multithreading

Comment PHP gère le multithreading

王林
王林original
2019-09-24 17:54:054219parcourir
Manuel recommandé : Manuel d'auto-apprentissage complet php

Comment PHP gère le multithreading

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(
&#39;http://www.webkaka.com&#39;,
&#39;http://www.webkaka.com&#39;,
&#39;http://www.webkaka.com&#39;,
&#39;http://www.webkaka.com&#39;,
&#39;http://www.webkaka.com&#39;);
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&#39;t print
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_USERAGENT, &#39;Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)&#39;);
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 :
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.
Tutoriel vidéo Dugu Jiujian (4)_PHP


Tutoriel recommandé :

Tutoriel vidéo 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!

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