Maison > développement back-end > tutoriel php > Comment implémenter un véritable multi-threading PHP à l'aide de pthreads

Comment implémenter un véritable multi-threading PHP à l'aide de pthreads

不言
Libérer: 2023-04-02 09:12:01
original
4155 Les gens l'ont consulté

Cet article présente principalement la méthode d'utilisation de pthreads pour obtenir un véritable multi-threading PHP. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

PHP 5.3 ou supérieur. . Grâce à l'extension PHP pthreads, PHP peut véritablement prendre en charge le multi-threading. Le multithreading peut réduire considérablement le temps d'exécution du programme lors du traitement de tâches répétitives en boucle

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 il peut simplement augmenter le serveur horizontalement. nombre de cœurs de processeur pour y faire face facilement (pour différents hôtes cloud, il est plus pratique d'augmenter le VPS ou le nombre de cœurs de processeur. Vous pouvez ajouter un VPS directement avec l'image de sauvegarde, sans même installer et configurer le système d'exploitation et l'environnement ). Au lieu de cela, il réside dans la base de données MySQL.

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 rencontrez un grand nombre de requêtes simultanées, vous cesserez de travailler.

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 la sortie récapitulative 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 préférences personnalisées de l'utilisateur en temps réel. Le multithreading PHP est très évident.

Téléchargement de l'extension PHP : https://github.com/krakjoe/pthreads

Document du manuel PHP : http://php.net/manual/zh/book .pthreads.php

1. Compilation et installation étendues (Linux), le paramètre de compilation --enable-maintainer-zts est une option obligatoire :

cd /Data/tgz/php-5.5.1
./configure --prefix=/Data/apps/php --with-config-file-path=/Data/apps/php/etc --with-mysql=/Data/apps/mysql --with-mysqli=/Data/apps/mysql/bin/mysql_config --with-iconv-dir --with-freetype-dir=/Data/apps/libs --with-jpeg-dir=/Data/apps/libs --with-png-dir=/Data/apps/libs --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt=/Data/apps/libs --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-opcache --with-pdo-mysql --enable-maintainer-zts
make clean
make
make install        
unzip pthreads-master.zip
cd pthreads-master
/Data/apps/php/bin/phpize
./configure --with-php-config=/Data/apps/php/bin/php-config
make
make install
Copier après la connexion

Ajouter dans php.ini :

vi /Data/apps/php/etc/php.ini
extension = "pthreads.so"
Copier après la connexion

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)."
";
  $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)."
";
?>
Copier après la connexion

Ce qui précède est l'intégralité du contenu de cet article, j'espère qu'il sera utile à l'apprentissage de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Comment résoudre le problème des caractères tronqués lors de l'importation de fichiers csv en php

À propos de thinkphp pour mettre en œuvre l'envoi de mots de passe par e-mail Introduction à la fonction de récupération

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal