當前位置:才華齋>計算機>php語言>

如何解決PHP無法實現多執行緒的問題

php語言 閱讀(2.18W)

有沒有辦法在PHP中實現多執行緒呢?其實的是大多數情況下,你大可不必使用fork或者執行緒,並且你會得到比用fork或thread更好的效能,供參考!

如何解決PHP無法實現多執行緒的問題

假設你正在寫一個基於多臺服務器的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