Maison >développement back-end >Problème PHP >Le multithreading php est-il utile ?

Le multithreading php est-il utile ?

(*-*)浩
(*-*)浩original
2019-10-16 13:29:332908parcourir

PHP 5.3 et supérieur, en utilisant l'extension PHP pthreads, peut permettre à PHP de véritablement prendre en charge le multi-threading. Plusieurs threads gèrent des tâches cycliques répétitives, ce qui peut réduire considérablement le temps d'exécution du programme.

Le multithreading php est-il utile ?

J'ai dit dans mon article précédent que le goulot d'étranglement des performances de la plupart des sites Web ne réside pas sur le serveur PHP car cela peut être fait simplement en ajoutant des serveurs latéralement. ou Il peut être facilement géré par le nombre de cœurs de processeur (pour différents hôtes cloud, il est plus pratique d'augmenter le nombre de VPS ou de cœurs de processeur. Vous pouvez ajouter un VPS directement avec une image de sauvegarde, sans même installer et configurer le système d'exploitation. et environnement), mais il réside dans la base de données MySQL. (Apprentissage recommandé : Tutoriel vidéo PHP)

Si vous utilisez une base de données MySQL et une requête SQL conjointe, vous pourrez peut-être gérer la logique métier. Cependant, si vous en rencontrez un grand nombre. de demandes concurrentes, vous devrez arrêter.

Si vous utilisez une base de données NoSQL, dix requêtes peuvent être nécessaires pour traiter la même logique métier, mais chaque requête est plus rapide que MySQL. Dix boucles de requêtes NoSQL peuvent être plus rapides qu'une requête conjointe MySQL. de requêtes/seconde ne posent aucun problème. Si vous ajoutez le multi-threading PHP, interrogez NoSQL via dix threads en même temps et renvoyez le résumé des résultats, la vitesse sera plus rapide.

Dans notre produit APP actuel, nous appelons une interface PHP qui recommande des produits en temps réel en fonction des préférences de l'utilisateur. PHP doit lancer 500 à 1 000 requêtes dans la base de données BigSea NoSQL pour calculer les données de produits des préférences personnelles de l'utilisateur. en temps réel. PHP a de nombreux Le rôle des threads est très évident.

Donne un multi-threading PHP et une boucle For pour capturer l'exemple de code PHP de la page de recherche Baidu :

<?php
   class test_thread_run extends Thread 
   {
       public $url;
       public $data;
 
       public function __construct($url)
       {
           $this->url = $url;
       }
 
       public function run()
       {
           if(($url = $this->url))
           {
               $this->data = model_http_curl_get($url);
           }
       }
   }
 
   function model_thread_result_get($urls_array) 
   {
       foreach ($urls_array as $key => $value) 
       {
           $thread_array[$key] = new test_thread_run($value["url"]);
           $thread_array[$key]->start();
       }
 
       foreach ($thread_array as $thread_array_key => $thread_array_value) 
       {
           while($thread_array[$thread_array_key]->isRunning())
           {
               usleep(10);
           }
           if($thread_array[$thread_array_key]->join())
           {
               $variable_data[$thread_array_key] = $thread_array[$thread_array_key]->data;
           }
       }
       return $variable_data;
   }
 
   function model_http_curl_get($url,$userAgent="") 
   {
       $userAgent = $userAgent ? $userAgent : &#39;Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)&#39;; 
       $curl = curl_init();
       curl_setopt($curl, CURLOPT_URL, $url);
       curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
       curl_setopt($curl, CURLOPT_TIMEOUT, 5);
       curl_setopt($curl, CURLOPT_USERAGENT, $userAgent);
       $result = curl_exec($curl);
       curl_close($curl);
       return $result;
   }
 
   for ($i=0; $i < 100; $i++) 
   { 
       $urls_array[] = array("name" => "baidu", "url" => "http://www.baidu.com/s?wd=          ".mt_rand(10000,20000));
   }
 
   $t = microtime(true);
   $result = model_thread_result_get($urls_array);
   $e = microtime(true);
   echo "多线程:".($e-$t)."\n";
 
   $t = microtime(true);
   foreach ($urls_array as $key => $value) 
   {
       $result_new[$key] = model_http_curl_get($value["url"]);
   }
   $e = microtime(true);
   echo "For循环:".($e-$t)."\n";
 ?>

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