Heim > Backend-Entwicklung > PHP-Tutorial > Die Verwendung von echtem Multithreading in PHP

Die Verwendung von echtem Multithreading in PHP

WBOY
Freigeben: 2016-08-08 09:20:22
Original
1064 Leute haben es durchsucht
PHP 5.3 und höher kann mithilfe der PHP-Erweiterung pthreads dafür sorgen, dass PHP Multithreading wirklich unterstützt. 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 leicht behoben werden kann, indem man einfach die Anzahl der Server- oder CPU-Kerne horizontal erhöht (für verschiedene). Bei Cloud-Hosts ist es bequemer, die Anzahl der VPS- oder CPU-Kerne zu erhöhen (Sie müssen nicht einmal das Betriebssystem und die Umgebung installieren und konfigurieren), sondern die MySQL-Datenbank. Wenn Sie eine MySQL-Datenbank und eine gemeinsame SQL-Abfrage verwenden, können Sie möglicherweise die Geschäftslogik verarbeiten. Wenn Sie jedoch auf eine große Anzahl gleichzeitiger Anforderungen stoßen, funktioniert die Funktion nicht mehr. Bei Verwendung von NoSQL Eine Datenbank benötigt möglicherweise zehn Abfragen, um dieselbe Geschäftslogik zu verarbeiten, aber jede Abfrage ist schneller als MySQL-NoSQL-Abfragen, und es ist völlig nutzlos, Zehntausende Abfragen pro Sekunde zu verarbeiten . Wenn Sie PHP-Multithreading hinzufügen, NoSQL gleichzeitig über zehn Threads 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.
PHP-Erweiterungs-Download: https://github.com/krakjoe/pthreads
PHP-Handbuchdokument: http:// php.net/manual/zh/book.pthreads.php
1. Erweiterte Kompilierung und Installation (Linux), Bearbeitungsparameter --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-c/apps/php/bin/php-config
make
make install


vi /Data/apps/php/etc /php.ini


Hinzufügen:

extension = "pthreads.so"


2. Geben Sie einen PHP-Abschnitt Threads an und For-Schleifen, PHP-Codebeispiele zum Erfassen von Baidu-Suchseiten:

<?php
&#160;&#160;class test_thread_run extends Thread 
&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;public $url;
&#160;&#160;&#160;&#160;&#160;&#160;public $data;

&#160;&#160;&#160;&#160;&#160;&#160;public function __construct($url)
&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$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 : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)'; 
      $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++) 
&#160;&#160;{ 
&#160;&#160;&#160;&#160;&#160;&#160;$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";
?>
Nach dem Login kopieren

Das Obige hat die Verwendung von echtem Multithreading in PHP vorgestellt, einschließlich einiger Aspekte davon. Ich hoffe, dass es für Freunde hilfreich sein wird, die sich für PHP-Tutorials interessieren.

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