亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

巧妙解決PHP無法實現多線程的問題

2024-05-04 23:24:16
字體:
來源:轉載
供稿:網友
有沒有辦法在PHP中實現多線程呢?假設你正在寫一個基于多臺服務器的PHP應用,理想的情況時同時向多臺服務器發送請求,而不是一臺接一臺??梢詫崿F嗎?當有人想要實現并發功能時,他們通常會想到用fork或者spawn threads,但是當他們發現PHP不支持多線程的時候,大概會轉換思路去用一些不夠好的語言,比如Perl。



其實的是大多數情況下,你大可不必使用fork或者線程,并且你會得到比用fork或thread更好的性能。假設你要建立一個服務來檢查正在運行的n臺服務器,以確定他們還在正常運轉。你可能會寫下面這樣的代碼:

  $hosts = array("host1.sample.com", "host2.sample.com", "host3.sample.com"); 
$timeout = 15; 
$status = array(); 
foreach ($hosts as $host) {  
        $errno = 0;  
        $errstr = "";  
        $s = fsockopen($host, 80, $errno, $errstr, $timeout);  
        if ($s) {   
             $status[$host] = "Connectedn";   
             fwrite($s, "HEAD / HTTP/1.0rnHost: $hostrnrn");   
            do {    
                $data = fread($s, 8192);    
                if (strlen($data) == 0) {    
                break;    
                }    
             $status[$host] .= $data;   
         }  
         while (true);   
            fclose($s);  
          }  
         else {   
              $status[$host] = "Connection failed: $errno $errstrn";  
         } 

print_r($status); 
?>
它運行的很好,但是在fsockopen()分析完hostname并且建立一個成功的連接(或者延時$timeout秒)之前,擴充這段代碼來管理大量服務器將耗費很長時間。

因此我們必須放棄這段代碼;我們可以建立異步連接-不需要等待fsockopen返回連接狀態。PHP仍然需要解析hostname(所以直接使用ip更加明智),不過將在打開一個連接之后立刻返回,繼而我們就可以連接下一臺服務器。

有兩種方法可以實現;PHP5中可以使用新增的stream_socket_client()函數直接替換掉fsocketopen()。PHP5之前的版本,你需要自己動手,用sockets擴展解決問題。下面是PHP5中的解決方法:

  $hosts = array("host1.sample.com", "host2.sample.com", "host3.sample.com"); 
$timeout = 15; 
$status = array(); 
$sockets = array(); 
/* Initiate connections to all the hosts simultaneously */ 
foreach ($hosts as $id => $host) {  
        $s = stream_socket_client("$host:80", $errno, $errstr, $timeout,   
             STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT);  
        if ($s) {   
            $sockets[$id] = $s;   
            $status[$id] = "in progress";  
        }  
        else {  $status[$id] = "failed, $errno $errstr";  
        } 

/* Now, wait for the results to come back in */ 

while (count($sockets)) {  
      $read = $write = $sockets;  
/* This is the magic function - explained below */  
      $n = stream_select($read, $write, $e = null, $timeout);  
      if ($n > 0) {   
      /* readable sockets either have data for us, or are failed   * connection attempts */   
          foreach ($read as $r) {       
                   $id = array_search($r, $sockets);       
                   $data = fread($r, 8192);       
          if (strlen($data) == 0) {    
                   if ($status[$id] == "in progress") {     
                       $status[$id] = "failed to connect";    
                   }    
          fclose($r);    
          unset($sockets[$id]);       
           }  
           else {    
                 $status[$id] .= $data;       
           }   
        }   
/* writeable sockets can accept an HTTP request */   
foreach ($write as $w) {    
         $id = array_search($w, $sockets);    
         fwrite($w, "HEAD / HTTP/1.0rnHost: "     
         . $hosts[$id] .  "rnrn");    
         $status[$id] = "waiting for response";   
         }  
}  
else {   
/* timed out waiting; assume that all hosts associated   * with $sockets are faulty */   
foreach ($sockets as $id => $s) {    
         $status[$id] = "timed out "  
         . $status[$id];   
         }   
break;  
  } 

foreach ($hosts as $id => $host) {  
      echo "Host: $hostn"; echo "Status: "  
      . $status[$id] . "nn"; 
}  
?>
我們用stream_select()等待sockets打開的連接事件。stream_select()調用系統的select(2)函數來工 作:前面三個參數是你要使用的streams的數組;你可以對其讀取,寫入和獲取異常(分別針對三個參數)。stream_select()可以通過設 置$timeout(秒)參數來等待事件發生-事件發生時,相應的sockets數據將寫入你傳入的參數。

下面是PHP4.1.0之后版本的實現,如果你已經在編譯PHP時包含了sockets(ext/sockets)支持,你可以使用根上面類似的代 碼,只是需要將上面的streams/filesystem函數的功能用ext/sockets函數實現。主要的不同在于我們用下面的函數代替 stream_socket_client()來建立連接:

  // This value is correct for Linux, other systems have other values 
define('EINPROGRESS', 115); 
function non_blocking_connect($host, $port, &$errno, &$errstr, $timeout) {  
        $ip = gethostbyname($host);  
        $s = socket_create(AF_INET, SOCK_STREAM, 0);  
        if (socket_set_nonblock($s)) {   
           $r = @socket_connect($s, $ip, $port);   
           if ($r || socket_last_error() == EINPROGRESS) {    
                  $errno = EINPROGRESS;    
                  return $s;   
               }  
         }  
        $errno = socket_last_error($s);  
        $errstr = socket_strerror($errno);  
        socket_close($s);  
        return false; 

?>
現在用socket_select()替換掉stream_select(),用socket_read()替換掉fread(),用socket_write()替換掉fwrite(),用socket_close()替換掉fclose()就可以執行腳本了! PHP5的先進之處在于,你可以用stream_select()處理幾乎所有的stream。例如你可以通過include STDIN用它接收鍵盤輸入并保存進數組,你還可以接收通過proc_open()打開的管道中的數據。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品美乳一区二区免费| 精品色蜜蜜精品视频在线观看| 欧美精品电影免费在线观看| 亚洲激情第一页| 亚洲电影免费观看高清完整版在线观看| 久久天堂电影网| 日韩精品有码在线观看| 欧美电影免费观看电视剧大全| 久热精品视频在线免费观看| 日韩在线视频导航| 国产一区欧美二区三区| 日韩精品免费在线播放| 欧美日韩一二三四五区| 国内精品国产三级国产在线专| 欧美国产日韩一区二区| 亚洲精品国产精品自产a区红杏吧| 欧美重口另类videos人妖| 亚洲女同性videos| 亚洲福利在线看| 午夜精品理论片| 亚洲图片欧美午夜| 国产91色在线|免| 色多多国产成人永久免费网站| 亚洲欧洲午夜一线一品| 日本一欧美一欧美一亚洲视频| 国产精品成av人在线视午夜片| 91在线国产电影| 亚洲毛片一区二区| 久久精品视频一| 欧美成年人视频网站欧美| 91精品免费久久久久久久久| 亚洲最大成人在线| 中文字幕精品一区二区精品| 国产亚洲精品久久久久久| 亚洲国产欧美在线成人app| 国产精品免费视频xxxx| 亚洲精品国偷自产在线99热| 国产精品久久久久免费a∨大胸| 欧美福利视频网站| 日韩电影免费观看在线| 国产精品444| 欧美激情性做爰免费视频| 91亚洲国产成人久久精品网站| 日韩精品电影网| 最近2019年日本中文免费字幕| 久久久久亚洲精品| 国产精品久在线观看| 国产成人短视频| 一区二区三区久久精品| 91国自产精品中文字幕亚洲| 欧美成人一区在线| 国产精品久久国产精品99gif| 国产精品久久久久久久av大片| 成人www视频在线观看| 国产成人欧美在线观看| 亚洲a级在线播放观看| 精品国内自产拍在线观看| 欧美日韩免费区域视频在线观看| 中日韩午夜理伦电影免费| 91美女片黄在线观看游戏| 亚洲的天堂在线中文字幕| 成人有码视频在线播放| 国产精品人成电影在线观看| 日韩欧美国产免费播放| 成人h视频在线观看播放| 57pao国产精品一区| 国产成人综合精品在线| 欧美高清在线观看| 欧美日韩国产精品一区二区不卡中文| 日本精品久久中文字幕佐佐木| 奇米一区二区三区四区久久| 久久免费福利视频| 全亚洲最色的网站在线观看| 欧美小视频在线观看| 国产z一区二区三区| 久久国产精品久久久| 国产视频综合在线| 亚洲第一免费网站| 精品国产欧美一区二区五十路| 夜夜狂射影院欧美极品| 久久久视频精品| 亚洲专区中文字幕| 久久91精品国产91久久跳| 欧美大尺度激情区在线播放| 成人国产亚洲精品a区天堂华泰| 国产有码在线一区二区视频| 色婷婷久久一区二区| 日韩av在线网站| 97香蕉超级碰碰久久免费软件| 91黑丝高跟在线| 在线观看免费高清视频97| 久久亚洲欧美日韩精品专区| 欧美精品第一页在线播放| 国产精品视频中文字幕91| 国产日韩在线精品av| 欧美高清视频在线播放| www.日韩av.com| 日本一区二区在线播放| 国产精品丝袜久久久久久高清| 国产精品一区二区久久精品| 日本高清视频精品| 国产精品一区专区欧美日韩| 久久久久一本一区二区青青蜜月| 九色精品免费永久在线| 亚洲一区二区日本| 国产日韩在线看片| 久久av红桃一区二区小说| 欧美xxxx14xxxxx性爽| 欧美激情一区二区久久久| 不卡av电影院| 亚洲va欧美va在线观看| 久久6免费高清热精品| 综合136福利视频在线| 一区二区三区四区精品| 国产精品一区专区欧美日韩| 国产精品极品美女粉嫩高清在线| 国产精品扒开腿做爽爽爽的视频| 久久成人在线视频| 永久555www成人免费| 日韩电影中文字幕在线观看| 欧美成人精品激情在线观看| 国内精品400部情侣激情| 国产精品中文字幕久久久| 亚洲午夜精品久久久久久性色| 国产色综合天天综合网| 亚洲一区二区三区香蕉| 精品久久香蕉国产线看观看亚洲| 55夜色66夜色国产精品视频| 91国自产精品中文字幕亚洲| 欧美国产日韩一区二区三区| 亚洲精品国产精品久久清纯直播| 91社区国产高清| 亚洲精品一二区| 一个人看的www欧美| 国产精品久久久久av免费| 国产国产精品人在线视| 国产精品一区二区三区毛片淫片| 日韩成人中文字幕在线观看| 国产精品国产三级国产aⅴ9色| 国产成人精品日本亚洲| 少妇精69xxtheporn| 国产精品aaa| 久久伊人精品视频| 欲色天天网综合久久| 欧美xxxx18性欧美| 成人午夜两性视频| 久久综合久久美利坚合众国| 国模精品系列视频| 亚洲精品国产欧美| 欧美激情极品视频| 色偷偷偷综合中文字幕;dd| 亚洲精品97久久| 97色在线视频观看| 国产丝袜一区二区三区免费视频| 91精品国产免费久久久久久| 欧美乱大交做爰xxxⅹ性3| 欧美一区二区三区免费观看| 国产成一区二区| 欧美大尺度电影在线观看| 日韩av免费在线观看| 亚洲国产精品va在看黑人| 欧美重口另类videos人妖| 国产视频精品久久久| 亚洲毛茸茸少妇高潮呻吟|