So implementieren Sie echtes PHP-Multithreading mithilfe von pthreads

不言
Freigeben: 2023-04-02 09:12:01
Original
4106 Leute haben es durchsucht

Dieser Artikel stellt hauptsächlich die Methode zur Verwendung von Pthreads vor, um echtes PHP-Multithreading zu erreichen. Er hat einen gewissen Referenzwert. Jetzt kann ich ihn mit Ihnen teilen

PHP 5.3 oder höher Mit der PHP-Erweiterung pthreads kann PHP Multithreading wirklich unterstützen. Multithreading kann die Programmausführungszeit bei der Verarbeitung sich wiederholender zyklischer Aufgaben erheblich verkürzen.

Ich habe in meinem vorherigen Artikel gesagt, dass der Leistungsengpass der meisten Websites nicht auf dem PHP-Server liegt, da er den Server einfach horizontal vergrößern kann Anzahl der CPU-Kerne, um damit problemlos zurechtzukommen (für verschiedene Cloud-Hosts ist es bequemer, den VPS oder die Anzahl der CPU-Kerne zu erhöhen. Sie können VPS direkt mit dem Backup-Image hinzufügen, ohne das Betriebssystem und die Umgebung installieren und konfigurieren zu müssen ). Stattdessen liegt es in der MySQL-Datenbank.

Wenn Sie eine MySQL-Datenbank und eine gemeinsame SQL-Abfrage verwenden, können Sie möglicherweise mit der Geschäftslogik umgehen. Wenn Sie jedoch auf eine große Anzahl gleichzeitiger Anforderungen stoßen, wird die Arbeit aufhören.

Wenn Sie eine NoSQL-Datenbank verwenden, sind möglicherweise zehn Abfragen erforderlich, um dieselbe Geschäftslogik zu verarbeiten, aber jede Abfrage ist schneller als Zehntausende von NoSQL-Abfragen Anfragen/Sekunde sind überhaupt kein Problem.

Wenn Sie PHP-Multithreading hinzufügen, NoSQL über zehn Threads gleichzeitig abfragen und die Ergebniszusammenfassungsausgabe zurückgeben, ist die Geschwindigkeit höher. In unserem eigentlichen APP-Produkt rufen wir eine PHP-Schnittstelle auf, die Produkte in Echtzeit basierend auf Benutzerpräferenzen empfiehlt. PHP muss 500 bis 1.000 Abfragen an die BigSea NoSQL-Datenbank initiieren, um die personalisierten Präferenzproduktdaten des Benutzers in Echtzeit zu berechnen PHP-Multithreading ist sehr offensichtlich.

Download der PHP-Erweiterung: https://github.com/krakjoe/pthreads

PHP-Handbuchdokument: http://php.net/manual/zh/book .pthreads.php

1. Erweiterte Kompilierung und Installation (Linux), der Kompilierungsparameter --enable-maintainer-zts ist eine erforderliche Option:

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
Nach dem Login kopieren

In php.ini hinzufügen:

vi /Data/apps/php/etc/php.ini
extension = "pthreads.so"
Nach dem Login kopieren

Gibt eine PHP-Multithreading- und For-Schleife zum Erfassen des PHP-Codebeispiels der Baidu-Suchseite:

<?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)."
";
?>
Nach dem Login kopieren

Das Obige ist hoffentlich der gesamte Inhalt dieses Artikels Es wird für das Lernen aller nützlich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

So lösen Sie das Problem verstümmelter Zeichen beim Importieren von CSV-Dateien in PHP

Über thinkphp to Implementieren Sie das Senden von E-Mail-Passwörtern. Einführung in die Abruffunktion

Das obige ist der detaillierte Inhalt vonSo implementieren Sie echtes PHP-Multithreading mithilfe von pthreads. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage