如何解決PHP無法實現多線程的問題

來源:文萃谷 2.1W

有沒有辦法在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

熱門標籤