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

首頁 > 開發 > PHP > 正文

php fsockopen解決辦法 php實現多線程

2024-05-04 23:20:54
字體:
來源:轉載
供稿:網友

回答:
當有人想要實現并發功能時,他們通常會想到用fork或者spawn
threads,但是當他們發現php不支持多線程的時候,大概會轉換思路去用一些不夠好的語言,比如perl。
其實的是大多數情況下,你大可不必使用fork或者線程,并且你會得到比用fork或thread更好的性能。
假設你要建立一個服務來檢查正在運行的n臺服務器,以確定他們還在正常運轉。你可能會寫下面這樣的代碼:

復制代碼 代碼如下:


<?php
$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中的解決方法:

復制代碼 代碼如下:


<?php
$hosts = array("host1.sample.com", "host2.sample.com", "host3.sample.com");
$timeout = 15;
$status = array();
$sockets = array();
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";
}
}
while (count($sockets)) {
$read = $write = $sockets;
$n = stream_select($read, $write, $e = null, $timeout);
if ($n > 0) {
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;
}
}
foreach ($write as $w) {
$id = array_search($w, $sockets);
fwrite($w, "HEAD / HTTP/1.0rnHost: " . $hosts[$id] . "rnrn");
$status[$id] = "waiting for response";
}
} else {
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()來建立連接:

復制代碼 代碼如下:


<?php
// 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()打開的管道中的數據。
如果你想讓PHP4.3.x自身擁有處理streams的功能,我已經為你準備了一個讓fsockopen可以異步工作的patch。不贊成使用該補丁,該補丁不會出現在官方發布的PHP版本中,我在補丁中附帶了stream_socket_client()函數的實現,通過它,你可以讓你的腳本兼容
PHP5。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品永久在线| 91精品啪aⅴ在线观看国产| 成人精品网站在线观看| 午夜欧美大片免费观看| 欧美黑人极品猛少妇色xxxxx| 日韩精品免费综合视频在线播放| 国产精品久久一| 国产美女精品视频| 亚洲欧美www| 欧美午夜精品伦理| 亚洲国产美女久久久久| 一本色道久久88综合日韩精品| 亚洲精品电影久久久| 日韩动漫免费观看电视剧高清| 亚洲视频在线观看免费| 亚洲欧美日韩精品久久亚洲区| 国产亚洲精品美女久久久| 亚洲欧美日韩高清| 97人人爽人人喊人人模波多| 国产91精品久久久| 国产精品久久久久久久久久免费| 欧美日韩亚洲视频| 久久久精品免费视频| 国产做受高潮69| 深夜福利一区二区| 国产日韩欧美黄色| 亚洲自拍偷拍网址| 亚洲国产小视频| 欧美成人午夜激情在线| x99av成人免费| 一区二区三区视频免费在线观看| 中文字幕精品网| 欧美日韩免费区域视频在线观看| 亚洲无av在线中文字幕| 日韩美女写真福利在线观看| 亚洲乱码国产乱码精品精天堂| 国产91网红主播在线观看| 91香蕉亚洲精品| 亚洲精品少妇网址| 国产成人综合av| 亚洲国产精品久久久久秋霞蜜臀| 欧美性20hd另类| 中文字幕国产亚洲| 波霸ol色综合久久| 亚洲xxx大片| 欧美一级大片在线免费观看| 91精品免费视频| 国内精品久久久久久中文字幕| 亚洲电影在线观看| 日韩精品久久久久久福利| 欧美超级乱淫片喷水| 成人xvideos免费视频| 日韩在线观看视频免费| 国产精品com| 中文字幕日韩欧美精品在线观看| 在线视频免费一区二区| 亚洲成人激情在线观看| 久久香蕉频线观| 成人性教育视频在线观看| 欧美激情视频给我| 欧美最猛性xxxxx免费| 精品久久久香蕉免费精品视频| 日韩欧美高清视频| 一级做a爰片久久毛片美女图片| 国产成人免费av| 国产狼人综合免费视频| 韩国美女主播一区| 啪一啪鲁一鲁2019在线视频| 亚洲www视频| 日本19禁啪啪免费观看www| 57pao国产成人免费| 国产精品99久久久久久久久久久久| 国产精品久久不能| 亚洲精品国产品国语在线| 欧美夫妻性生活xx| 在线激情影院一区| 91免费福利视频| 久久免费视频网站| 热久久视久久精品18亚洲精品| 91av在线影院| 欧美高清视频一区二区| 久久亚洲精品小早川怜子66| 国产免费一区二区三区香蕉精| 久久这里只有精品99| 欧美乱大交xxxxx另类电影| 97福利一区二区| 亚洲免费中文字幕| 亚洲视频999| 精品国产一区二区三区久久久狼| xx视频.9999.com| 一区二区三区回区在观看免费视频| 欧美在线亚洲在线| 日韩视频免费中文字幕| 欧美国产日本高清在线| 日韩有码在线播放| 亚洲精品欧美极品| 日韩精品免费在线视频| 国产999在线观看| 国产精品黄页免费高清在线观看| 欧美久久精品午夜青青大伊人| 97视频在线观看网址| 日韩精品在线免费观看| 久久精品美女视频网站| 欧美激情在线观看| 亚洲乱码一区二区| 欧美性色19p| 亚洲天堂av在线免费| 久久天堂av综合合色| 欧美一级视频在线观看| 亚洲免费伊人电影在线观看av| 亚洲伊人久久大香线蕉av| 久久这里只有精品99| 国产精品久久久久免费a∨| 亚洲一区av在线播放| 国产精品美女免费视频| 岛国av在线不卡| 国产精品成人va在线观看| 视频一区视频二区国产精品| 亚洲成人精品视频在线观看| 欧美一级视频在线观看| 欧美俄罗斯性视频| 亚洲欧美另类自拍| 国产精品免费小视频| 亚洲第一视频网| 久久天天躁狠狠躁夜夜av| 午夜剧场成人观在线视频免费观看| 欧洲成人午夜免费大片| 亚洲欧美日韩图片| 川上优av一区二区线观看| 国产成人精品视频| 亚洲黄色www| 亚洲欧美日韩国产精品| 亚洲性av网站| 狠狠色香婷婷久久亚洲精品| 国产日本欧美视频| 91精品国产91久久久久久吃药| 97久久精品人人澡人人爽缅北| 久久久av网站| 欧美日产国产成人免费图片| 欧美黑人巨大xxx极品| 成人久久久久爱| 日韩免费在线看| 亚洲一区二区三区四区在线播放| 97av在线影院| 永久免费看mv网站入口亚洲| 欧美性猛交xxxx乱大交| 国产精品视频资源| 欧美老少配视频| 宅男66日本亚洲欧美视频| 国产日产亚洲精品| 国产婷婷色综合av蜜臀av| 久久精彩免费视频| 成人精品久久久| 91精品国产91久久久久久| 欧美亚洲另类在线| 欧美精品免费看| 欧美日韩国产精品一区二区不卡中文| 精品国产一区av| 欧美成人免费在线观看| 亚洲最大在线视频| 精品久久久久久久久久久久久久| 日韩欧美成人网| 91在线观看免费高清完整版在线观看| 欧美专区中文字幕|