Heim > Artikel > Backend-Entwicklung > Wie PHP mit Multithreading umgeht
Empfohlenes Handbuch: PHP vollständiges Handbuch zum Selbststudium
PHP-Verarbeitung von Multithreading
Hinweise
1. PHP5.3 oder höher, und es ist eine Thread-sichere Version. Die von Apache und PHP verwendeten Compiler müssen konsistent sein.
2. Wenn Thread Safety über phpinfo() aktiviert ist, handelt es sich um eine Thread-sichere Version.
3. Sie können den verwendeten Compiler ermitteln, indem Sie das Compiler-Element über phpinfo() anzeigen. Meins ist: MSVC9 (Visual C++ 2008).
Meine Nutzungsumgebung
32-Bit Windows XP SP3, Wampserver2.2d (php5.3.10-vc9 + Apache2.2.21-vc9).
1. Laden Sie die pthreads-Erweiterung herunter
Je nach meiner Umgebung habe ich pthreads-2.0.8-5.3-ts-vc9-x86 heruntergeladen.
2.0.8 stellt die Version von pthreads dar.
5.3 stellt die PHP-Version dar.
ts bedeutet, dass PHP eine Thread-sichere Version erfordert.
vc9 bedeutet, dass PHP mit dem Visual C++ 2008-Compiler kompiliert werden muss.
x86 bedeutet 32-Bit
2. Installieren Sie die pthreads-Erweiterung
1. Kopieren Sie php_pthreads.dll in das Verzeichnis binphpext. (Mein Pfad ist D: wampbinphpphp5.3.10ext)
2. Kopieren Sie pthreadVC2.dll in das Verzeichnis binphp. (Mein Pfad ist D:wampbinphpphp5.3.10)
3. Kopieren Sie pthreadVC2.dll in das Verzeichnis C:windowssystem32.
4. Öffnen Sie die PHP-Konfigurationsdatei php.ini. Fügen Sie am Ende die Eingabeaufforderung extension=php_pthreads.dll
hinzu!
Das Windows-System muss den Pfad von pthreadVC2.dll zur Umgebungsvariablen PATH hinzufügen. Mein Computer--->rechte Maustaste--->Eigenschaften--->Erweitert--->Umgebungsvariablen--->Systemvariablen--->Suchen Sie den Pfad mit dem Namen Path---> ;Bearbeiten--->Fügen Sie den vollständigen Pfad von pthreadVC2.dll am Ende des Variablenwerts hinzu.
3. Testen Sie die pthreads-Erweiterung
class AsyncOperation extends \Thread { public function __construct($arg){ $this->arg = $arg; } public function run(){ if($this->arg){ printf("Hello %s\n", $this->arg); } } } $thread = new AsyncOperation("World"); if($thread->start()) $thread->join(); ?>
Hello World erscheint, wenn Sie den obigen Code ausführen, was anzeigt, dass die pthreads-Erweiterung erfolgreich installiert wurde!
2. curl_multi_init()
<?php echo date("Y-m-d H:m:s",time()); echo " "; echo floor(microtime()*1000); echo "<br>"; $mtime = explode(" ", microtime()); $mtime = $mtime[1].($mtime[0] * 1000); $mtime2 = explode(".", $mtime); $mtime = $mtime2[0]; echo $mtime; echo "<br>"; $urls = array( 'http://www.webkaka.com', 'http://www.webkaka.com', 'http://www.webkaka.com', 'http://www.webkaka.com', 'http://www.webkaka.com'); print_r(async_get_url($urls)); // [0] => example1, [1] => example2 echo "<br>"; echo date("Y-m-d H:m:s",time()); echo " "; echo floor(microtime()*1000); echo "<br>"; $mtime_ = explode(" ", microtime()); $mtime_ = $mtime_[1].($mtime_[0] * 1000); $mtime2_ = explode(".", $mtime_); $mtime_ = $mtime2_[0]; echo $mtime_; echo "<br>"; echo $mtime_ - $mtime; function async_get_url($url_array, $wait_usec = 0) { if (!is_array($url_array)) return false; $wait_usec = intval($wait_usec); $data = array(); $handle = array(); $running = 0; $mh = curl_multi_init(); // multi curl handler $i = 0; foreach($url_array as $url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return don't print curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect curl_setopt($ch, CURLOPT_MAXREDIRS, 7); curl_multi_add_handle($mh, $ch); // 把 curl resource 放进 multi curl handler 里 $handle[$i++] = $ch; } /* 执行 */ do { curl_multi_exec($mh, $running); if ($wait_usec > 0) /* 每个 connect 要间隔多久 */ usleep($wait_usec); // 250000 = 0.25 sec } while ($running > 0); /* 读取资料 */ foreach($handle as $i => $ch) { $content = curl_multi_getcontent($ch); $data[$i] = (curl_errno($ch) == 0) ? $content : false; } /* 移除 handle*/ foreach($handle as $ch) { curl_multi_remove_handle($mh, $ch); } curl_multi_close($mh); return $data; } ?>
Über curl_multi_init()
Im Allgemeinen gilt, wenn Sie an die Verwendung von curl_multi_init( ) Wenn der Zweck darin besteht, mehrere URLs gleichzeitig anzufordern, anstatt sie einzeln anzufordern, andernfalls ist curl_init() erforderlich. Bei der Verwendung von curl_multi kann es jedoch zu Phänomenen wie übermäßigem CPU-Verbrauch und angehaltenen Webseiten kommen. Hier erfahren Sie, wie Sie das durch curl_multi verursachte Problem der angehaltenen Webseiten lösen können.
Die Schritte zur Verwendung von curl_multi sind wie folgt zusammengefasst:
Schritt 1: Curl_multi_init aufrufen
Schritt 2: Curl_multi_add_handle in einer Schleife aufrufen
Was Sie brauchen In diesem Schritt ist zu beachten, dass der zweite Parameter von curl_multi_add_handle das Unterhandle von curl_init ist.
Schritt 3: Rufen Sie weiter „curl_multi_exec“ auf
Schritt 4: Rufen Sie „curl_multi_getcontent“ in einer Schleife auf, um die Ergebnisse nach Bedarf zu erhalten
Schritt 5: Rufen Sie „curl_multi_remove_handle“ auf und rufen Sie es für jedes Wort auf handle curl_close
Schritt 6: Curl_multi_close aufrufen
Erklärung jeder Funktion:
curl_multi_init()
Initialisieren Sie einen Curl-Batch-Prozess Behandeln Sie die Ressource.
curl_multi_add_handle()
Fügt der Curl-Batch-Sitzung eine separate Curl-Handle-Ressource hinzu. Die Funktion „curl_multi_add_handle()“ verfügt über zwei Parameter. Der erste Parameter stellt eine Curl-Batch-Handle-Ressource dar und der zweite Parameter stellt eine separate Curl-Handle-Ressource dar.
curl_multi_exec()
Analysieren Sie ein Curl-Batch-Handle. Die Funktion „curl_multi_exec()“ verfügt über zwei Parameter. Der erste Parameter stellt eine Batch-Handle-Ressource dar und der zweite Parameter ist ein Referenzwert gibt die Anzahl der verbleibenden einzelnen Curl-Handle-Ressourcen an, die verarbeitet werden müssen.
curl_multi_remove_handle()
Entfernen Sie eine Handle-Ressource in der Curl-Batch-Handle-Ressource. Die Funktion „curl_multi_remove_handle()“ stellt eine Curl-Batch-Handle-Ressource dar separate Curl-Handle-Ressource.
curl_multi_close()
Schließen Sie eine Batch-Handle-Ressource.
curl_multi_getcontent()
Gibt den Textstrom der abgerufenen Ausgabe zurück, wenn CURLOPT_RETURNTRANSFER gesetzt ist.
curl_multi_info_read()
Rufen Sie die relevanten Übertragungsinformationen der aktuell analysierten Locke ab.
Empfohlene verwandte Artikel:
1.So implementieren Sie Multithreading in PHP
2.Drei Möglichkeiten, Multithreading in PHP zu implementieren
Ähnliche Videoempfehlungen:
1.Dugu Jiujian (4)_PHP-Video-Tutorial
Empfohlenes Tutorial: PHP-Video-Tutorial
Das obige ist der detaillierte Inhalt vonWie PHP mit Multithreading umgeht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!