Heim  >  Artikel  >  Backend-Entwicklung  >  Wie PHP mit Multithreading umgeht

Wie PHP mit Multithreading umgeht

王林
王林Original
2019-09-24 17:54:054181Durchsuche
Empfohlenes Handbuch: PHP vollständiges Handbuch zum Selbststudium

Wie PHP mit Multithreading umgeht

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(
&#39;http://www.webkaka.com&#39;,
&#39;http://www.webkaka.com&#39;,
&#39;http://www.webkaka.com&#39;,
&#39;http://www.webkaka.com&#39;,
&#39;http://www.webkaka.com&#39;);
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&#39;t print
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_USERAGENT, &#39;Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)&#39;);
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!

Stellungnahme:
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