有沒有辦法在PHP中實現多執行緒呢?其實的是大多數情況下,你大可不必使用fork或者執行緒,並且你會得到比用fork或thread更好的效能,供參考!
假設你正在寫一個基於多臺服務器的PHP應用,理想的情況時同時向多臺伺服器傳送請求,而不是一臺接一臺。可以實現嗎?當有人想要實現併發功能時,他們通常會想到用fork或者spawn threads,但是當他們發現PHP不支援多執行緒的時候,大概會轉換思路去用一些不夠好的語言,比如Perl。
假設你要建立一個服務來檢查正在執行的n臺伺服器,以確定他們還在正常運轉。你可能會寫下面這樣的程式碼:
$hosts = array("", "", "");
$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中的解決方法:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16