Heim > Artikel > Backend-Entwicklung > So implementieren Sie echtes PHP-Multithreading mithilfe von pthreads
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
In php.ini hinzufügen:
vi /Data/apps/php/etc/php.ini extension = "pthreads.so"
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 : '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++) { $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)." "; ?>
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
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!