Heim  >  Artikel  >  Backend-Entwicklung  >  Bezüglich PHP-Multithreading-Verarbeitungsproblemen

Bezüglich PHP-Multithreading-Verarbeitungsproblemen

PHPz
PHPzOriginal
2017-11-10 10:36:562845Durchsuche

Im Folgenden geht es um PHP-Multithreading-Probleme, die PHP-Erweiterung pthreads und die Funktion „curl_multi_init“. Wenn Sie auf solche Probleme stoßen und diese nicht lösen können, schauen Sie sich an, wie andere sie gelöst haben.

Tutorial zur Installation von PHP Real Multi-Thread-Erweiterungs-PThreads unter Windows

Erweiterungsadresse: http://docs.php.net/manual/zh/ book .pthreads.php
Notes
php5.3 oder höher, und es ist eine Thread-sichere Version. Die von Apache und PHP verwendeten Compiler müssen konsistent sein.
Wenn Thread Safety über phpinfo() aktiviert ist, bedeutet dies die Thread-sichere Version.
Sie können den verwendeten Compiler ermitteln, indem Sie das Compiler-Element über phpinfo() anzeigen. Meins ist: MSVC9 (Visual C++ 2008).
Verwendete Umgebung
32-Bit-Windows XP SP3, Wampserver2.2d (php5.3.10-vc9 + Apache2.2.21-vc9).
1. pthreads-Erweiterung herunterladen
Download-Adresse: http://windows.php.net/downloads/pecl/releases/pthreads
Je nach meiner Umgebung habe ich pthreads-2.0.8-5.3-ts heruntergeladen -vc9-x86.
2.0.8 stellt die Version von pthreads dar.
5.3 stellt die Version von PHP 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
Kopieren Sie php_pthreads.dll in das Verzeichnis binphpext. (Mein Pfad ist D:wampbinphpphp5.3.10ext)
Kopieren Sie pthreadVC2.dll in das Verzeichnis binphp. (Mein Pfad ist D:wampbinphpphp5.3.10)
Kopieren Sie pthreadVC2.dll in das Verzeichnis C:windowssystem32.
Öffnen Sie die PHP-Konfigurationsdatei php.ini. Fügen Sie am Ende die Eingabeaufforderung extension=php_pthreads.dll
hinzu! Windows-Systeme müssen 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 (meiner ist C:WINDOWSsystem32pthreadVC2.dll).
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!

Anbei ein einfaches Beispiel für Thinkphp3.2.2

<?php
namespace Home\Controller;
class test extends \Thread {
    public $url;
    public $result;
    
    public function __construct($url) {
        $this->url = $url;
    }
    
    public function run() {
        if ($this->url) {
            $this->result = model_http_curl_get($this->url);
        }
    }
}
function model_http_curl_get($url) {
    $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, &#39;Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)&#39;);  
    $result = curl_exec($curl);  
    curl_close($curl);  
    return $result;  
}
for ($i = 0; $i < 10; $i++) {
    $urls[] = &#39;http://www.baidu.com/s?wd=&#39;. rand(10000, 20000);
}
/* 多线程速度测试 */
$t = microtime(true);
foreach ($urls as $key=>$url) {
    $workers[$key] = new test($url);
    $workers[$key]->start();
}
foreach ($workers as $key=>$worker) {
    while($workers[$key]->isRunning()) {
        usleep(100);  
    }
    if ($workers[$key]->join()) {
        dump($workers[$key]->result);
    }
}
$e = microtime(true);
echo "多线程耗时:".($e-$t)."秒<br>";  
/* 单线程速度测试 */
$t = microtime(true);
foreach ($urls as $key=>$url) {
    dump(model_http_curl_get($url));
}
$e = microtime(true);
echo "For循环耗时:".($e-$t)."秒<br>";

Die Testergebnisse lauten wie folgt:

Multi-Threading-Zeit: 2,8371710777282714844 Sekunden
Für Schleifenzeit : 10,941586017608642578 Sekunden

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.a.com&#39;, &#39;http://www.b.com&#39;, &#39;http://www.c.com&#39;, &#39;http://www.d.com&#39;,&#39;http://www.e.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 printcurl_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 redirectcurl_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 sollten Sie an die Verwendung von curl_multi_init denken () Wenn der Zweck darin besteht, mehrere URLs gleichzeitig anzufordern, anstatt sie einzeln anzufordern, ist andernfalls curl_init() erforderlich.

Bei der Verwendung von curl_multi können jedoch Phänomene wie übermäßiger CPU-Verbrauch und angehaltene Animationen von Webseiten auftreten. Sehen Sie sich an, wie Sie das durch curl_multi verursachte Problem lösen können 🎜> Zusammenfassung der Schritte zur Verwendung von curl_multi Wie folgt:

Schritt 1: Curl_multi_init aufrufen

Schritt 2: Curl_multi_add_handle in einer Schleife aufrufen

Was in diesem Schritt beachtet werden sollte, ist, dass der zweite Parameter von curl_multi_add_handle ist das Subhandle von curl_init.
Schritt 3: Rufen Sie weiterhin „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“ und „curl_close“ für jedes Worthandle auf curl_multi_close

Erklärung der Funktionen jeder Funktion:

curl_multi_init()

Initialisieren Sie eine Curl-Batch-Handle-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. Der erste Parameter stellt eine Batch-Handle-Ressource dar und der zweite Parameter gibt die Anzahl an Es verbleiben noch einzelne Curl-Handle-Ressourcen, 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()“ verfügt über zwei Parameter. Der erste Parameter stellt eine Curl-Batch-Handle-Ressource dar. Der Parameter stellt a dar separate Curl-Handle-Ressource.

curl_multi_close()

Schließen Sie eine Batch-Handle-Ressource.

curl_multi_getcontent()

Gibt den Textstrom der erhaltenen Ausgabe zurück, wenn CURLOPT_RETURNTRANSFER gesetzt ist.

curl_multi_info_read()

Rufen Sie die relevanten Übertragungsinformationen des aktuell analysierten Curls ab.

Ich teile diesen Artikel über PHP-Multithreading-Probleme und hoffe, dass er für alle hilfreich ist. Wenn Sie Fragen haben, können Sie Ihre Kommentare oder Vorschläge hinterlassen. In Zukunft wird der Herausgeber viele Artikel über diese Art von Artikeln veröffentlichen, also schenken Sie ihnen bitte mehr Aufmerksamkeit.


Das obige ist der detaillierte Inhalt vonBezüglich PHP-Multithreading-Verarbeitungsproblemen. 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