Heim  >  Artikel  >  Backend-Entwicklung  >  PHP implementiert Multithread-Code

PHP implementiert Multithread-Code

不言
不言Original
2018-04-14 16:52:261572Durchsuche

Der Inhalt, der in diesem Artikel mit Ihnen geteilt wird, befasst sich mit der Implementierung von Multithread-Code in PHP. Er hat einen gewissen Referenzwert.

PHP selbst unterstützt kein Multithreading. Für Threads können wir Multithreading virtuell über die PHP-eigenen Funktionen verarbeiten. Im Folgenden werden drei Funktionen zur Implementierung der Mehrfachverarbeitung vorgestellt.


1. fsockopen, öffnen Sie eine Netzwerkverbindung oder eine Unix-Socket-Verbindung. Darunter stream_set_blocking() – legt die Blockierung oder den Blockierungsmodus für den Ressourcenfluss fest


* @title:   PHP多线程类(Thread)
 * @version:  1.0
 * 
 * PHP多线程应用示例:
 * require_once 'thread.class.php';
 * $thread = new thread();
 * $thread->addthread('action_log','a');
 * $thread->addthread('action_log','b');
 * $thread->addthread('action_log','c');
 * $thread->runthread();
 * 
 * function action_log($info) {
 *   $log = 'log/' . microtime() . '.log';
 *   $txt = $info . "rnrn" . 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn";
 *   $fp = fopen($log, 'w');
 *   fwrite($fp, $txt);
 *   fclose($fp);
 * }
 */
class thread {
  
  var $hooks = array();
  var $args = array();
  
  function thread() {
  }
  
  function addthread($func)
  {
    $args = array_slice(func_get_args(), 1);
    $this->hooks[] = $func;
    $this->args[] = $args;
    return true;
  }
  
  function runthread()
  {
    if(isset($_GET['flag']))
    {
      $flag = intval($_GET['flag']);
    }
    if($flag || $flag === 0)
    {
      call_user_func_array($this->hooks[$flag], $this->args[$flag]);
    }
    else
    {
      for($i = 0, $size = count($this->hooks); $i < $size; $i++)
      {
        $fp=fsockopen($_SERVER[&#39;HTTP_HOST&#39;],$_SERVER[&#39;SERVER_PORT&#39;]);
        stream_set_blocking($fp,0);
        if($fp)
        {
          $out = "GET {$_SERVER[&#39;PHP_SELF&#39;]}?flag=$i HTTP/1.1rn";
          $out .= "Host: {$_SERVER[&#39;HTTP_HOST&#39;]}rn";
          $out .= "Connection: Closernrn";
          fputs($fp,$out);
          fclose($fp);
        }
      }
    }
  }
}


2. stream_socket_client, neu kann verwendet werden in PHP5 Die Funktion stream_socket_client() ersetzt direkt fsocketopen(). Darunter stream_set_blocking() – legt die Blockierung oder den Blockierungsmodus für den Ressourcenfluss fest


<?php
$fp = stream_socket_client("tcp://www.example.com:80", $errno, $errstr, 30);
stream_set_blocking($fp,0);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    fwrite($fp, "GET / HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n");
    while (!feof($fp)) {
        echo fgets($fp, 1024);
    }
    fclose($fp);
}
?>


3. curl_multi, wenn Multithreading erforderlich ist, Sie können mit „curl_multi“ mehrere Vorgänge gleichzeitig anfordern, um sie abzuschließen. „Curl“ verwendet jedoch Netzwerkkommunikation, sodass Effizienz und Zuverlässigkeit relativ schlecht sind.


function sendMulitRequest($send_data){ 
    $params = array(); 
    $curl = $text = array(); 
    $handle = curl_multi_init(); 
  
    foreach ($data as $k => $v) { 
  
      if (empty($v[&#39;url&#39;])) { 
  
        $v[&#39;url&#39;] = "http://www.xxx.com"; //if url is empty,set defalut url 
  
      } 
  
      $reqBody = json_encode($v[&#39;body&#39;]); 
  
      $reqStream = array( 
  
        &#39;body&#39; => $reqBody, 
      );  
      $encRequest = base64_encode(json_encode($reqStream));  
      $params[&#39;data&#39;] = $encRequest; 
      $curl[$k] = curl_init(); 
      curl_setopt($curl[$k], CURLOPT_URL, $v[&#39;url&#39;]); 
      curl_setopt($curl[$k], CURLOPT_POST, TRUE); 
      curl_setopt($curl[$k], CURLOPT_HEADER, 0); 
      curl_setopt($curl[$k], CURLOPT_POSTFIELDS, http_build_query($params)); 
      curl_setopt($curl[$k], CURLOPT_RETURNTRANSFER, 1); 
      curl_multi_add_handle($handle, $curl[$k]); 
    } 
    $active = null; 
  
    do { 
  
      $mrc = curl_multi_exec($handle, $active); 
  
    } while ($mrc == CURLM_CALL_MULTI_PERFORM); 
    while ($active && $mrc == CURLM_OK) { 
  
      if (curl_multi_select($handle) != -1) { 
  
        do { 
  
          $mrc = curl_multi_exec($handle, $active); 
  
        } while ($mrc == CURLM_CALL_MULTI_PERFORM); 
  
      } 
  
    } 
    foreach ($curl as $k => $v) {  
      if (curl_error($curl[$k]) == "") { 
        $text[$k] = (string) curl_multi_getcontent($curl[$k]); 
       }  
      curl_multi_remove_handle($handle, $curl[$k]);  
      curl_close($curl[$k]); 
    } 
    curl_multi_close($handle);  
    return $text;  
  }

Verwandte Empfehlungen:

PHP-Multithread-PHP-fsockopen-Lösung

Das obige ist der detaillierte Inhalt vonPHP implementiert Multithread-Code. 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