自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深入講解PHP線程并發(fā)種類

開發(fā) 后端
通過本文了解如何使用 stream_select 和 stream_socket_client 實(shí)現(xiàn)進(jìn)程內(nèi)PHP線程多任務(wù)處理,希望對大家有幫助。

線程是我們在做項(xiàng)目中首要考慮的,在php中怎么實(shí)現(xiàn)線程呢,我們這里就看看PHP線程的實(shí)現(xiàn)。許多 PHP 開發(fā)人員認(rèn)為,由于標(biāo)準(zhǔn)的 PHP 缺少線程功能,因此實(shí)際 PHP 應(yīng)用程序不可能執(zhí)行多任務(wù)處理。

例如,如果應(yīng)用程序需要其他 Web 站點(diǎn)的信息,那么在遠(yuǎn)程檢索完成之前它都必須停止。這是錯誤的!通過本文了解如何使用 stream_select 和 stream_socket_client 實(shí)現(xiàn)進(jìn)程內(nèi) PHP 多任務(wù)處理。PHP 不支持線程。盡管如此,與前述大多數(shù) PHP 開發(fā)人員所相信的想法形成對比的是,PHP 應(yīng)用程序可以 執(zhí)行多任務(wù)處理。讓我們開始盡可能清晰地描述一下 “多任務(wù)” 和 “線程” 對于 PHP 編程的意義。

PHP線程并發(fā)的種類

首先拋開幾個和主題無關(guān)的例子。PHP 與多任務(wù)或并發(fā)的關(guān)系十分復(fù)雜。在較高層次上,PHP 經(jīng)常涉及多任務(wù):以多任務(wù)方式使用 標(biāo)準(zhǔn)的服務(wù)器端 PHP 安裝 —— 例如,作為 Apache 模塊。換句話說,若干個客戶機(jī) —— Web 瀏覽器 —— 可以同時(shí)請求同一個 PHP 解釋的頁面,而 Web 服務(wù)器將差不多同時(shí)返回所有這些頁面。

一個 Web 頁面不會妨礙其他 Web 頁面的發(fā)送,盡管可能會由于諸如服務(wù)器內(nèi)存或網(wǎng)絡(luò)帶寬之類的受限資源而使它們相互之間略有妨礙。這樣,實(shí)現(xiàn)并發(fā) 的系統(tǒng)級需求可能適合使用基于 PHP 的解決方案。就實(shí)現(xiàn)而言,PHP 允許它的管理 Web 服務(wù)器負(fù)責(zé)實(shí)現(xiàn)并發(fā)。

Ajax 名下的客戶端并發(fā)近幾年來也已成為開發(fā)人員關(guān)注的焦點(diǎn)。雖然 Ajax 的含義已經(jīng)變得十分模糊,但是它的一個方面是瀏覽器顯示可以同時(shí)執(zhí)行計(jì)算和保留對諸如選擇菜單項(xiàng)之類的用戶操作的響應(yīng)。這實(shí)際上就是某種 多任務(wù)。用 PHP 編碼的 Ajax 就是這樣 —— 但是不涉及任何特定的 PHP;用于其他語言的 Ajax 框架均以完全相同的方法操作。

只粗略地涉及 PHP 的第三個并發(fā)實(shí)例是 PHP/TK。PHP/TK 是 PHP 的擴(kuò)展,用于為核心 PHP 提供可移植圖形用戶界面(GUI)綁定。PHP/TK 允許用 PHP 編寫代碼構(gòu)造桌面 GUI 應(yīng)用程序。其基于事件的特性將模擬一種易于掌握并且比線程更少出錯的并發(fā)形式。此外,并發(fā)是 “繼承” 自一項(xiàng)輔助技術(shù),而不是 PHP 的基本功能。

#T#向 PHP 本身添加線程支持的試驗(yàn)已經(jīng)做過多次。據(jù)我所知,沒有一次是成功的。但是,Ajax 框架和 PHP/TK 的面向事件的實(shí)現(xiàn)表明事件可能比線程能更好地體現(xiàn) PHP 的并發(fā)。PHP V5 證明事實(shí)確實(shí)如此。使用標(biāo)準(zhǔn)的 PHP V4 和更低版本,必須按順序執(zhí)行 PHP 應(yīng)用程序的所有工作。例如,如果程序需要在兩個商業(yè)站點(diǎn)檢索商品的價(jià)格,則請求第一個站點(diǎn)的價(jià)格,等待至響應(yīng)到達(dá),再請求第二個站點(diǎn)的價(jià)格,然后再次等待。如果程序請求同時(shí)完成若干項(xiàng)任務(wù)會怎么樣?總體來看,程序?qū)⒃谝欢螘r(shí)間內(nèi)完成,在這段時(shí)間內(nèi),將始終進(jìn)行連續(xù)處理。

第一個示例PHP線程新的 stream_select 函數(shù)及它的幾個助手使這成為可能。請考慮以下示例。

清單 1. 同時(shí)請求多個 HTTP 頁面

  1. <?php  
  2. echo "Program starts at ". date('h:i:s') . ".\n";  
  3.  
  4. $timeout=10;  
  5. $result=array();  
  6. $sockets=array();  
  7. $convenient_read_block=8192;  
  8.  
  9. /* Issue all requests simultaneously; there's no blocking. */  
  10. $delay=15;  
  11. $id=0;  
  12. while ($delay > 0) {  
  13. $s=stream_socket_client("phaseit.net:80", $errno,  
  14. $errstr, $timeout,  
  15. STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT);  
  16. if ($s) {  
  17. $sockets[$id++]=$s;  
  18. $http_message="GET /demonstration/delay?delay=" .  
  19. $delay . " HTTP/1.0\r\nHost: phaseit.net\r\n\r\n";  
  20. fwrite($s, $http_message);  
  21. } else {  
  22. echo "Stream " . $id . " failed to open correctly.";  
  23. }  
  24. $delay -3;  
  25. }  
  26.  
  27. while (count($sockets)) {  
  28. $read=$sockets;  
  29. stream_select($read, $w=null, $e=null, $timeout);  
  30. if (count($read)) {  
  31. /* stream_select generally shuffles $read, so we need to  
  32. compute from which socket(s) we're reading. */  
  33. foreach ($read as $r) {  
  34. $id=array_search($r, $sockets);  
  35. $data=fread($r, $convenient_read_block);  
  36. /* A socket is readable either because it has  
  37. data to read, OR because it's at EOF. */  
  38. if (strlen($data) == 0) {  
  39. echo "Stream " . $id . " closes at " . date('h:i:s') . ".\n";  
  40. fclose($r);  
  41. unset($sockets[$id]);  
  42. } else {  
  43. $result[$id] .= $data;  
  44. }  
  45. }  
  46. } else {  
  47. /* A time-out means that *all* streams have failed  
  48. to receive a response. */  
  49. echo "Time-out!\n";  
  50. break;  
  51. }  
  52. }  
  53. ?>  

如果運(yùn)行此清單,您將看到如下所示的輸出。

責(zé)任編輯:田樹 來源: it168
相關(guān)推薦

2010-01-13 16:55:10

CentOS PHP安

2024-12-31 09:00:12

Java線程狀態(tài)

2009-11-27 11:19:11

PHP打印函數(shù)

2021-06-03 14:08:03

開發(fā)技能代碼

2021-06-04 14:28:07

協(xié)程線程Android開發(fā)

2021-09-18 06:56:01

JavaCAS機(jī)制

2010-09-14 17:20:57

2020-11-12 18:08:05

JavaLinux多線程

2010-09-25 12:46:10

DHCP運(yùn)行方式

2009-12-22 11:21:11

2010-06-10 15:46:07

RIP路由協(xié)議

2009-11-09 09:34:07

WCF集合

2009-12-07 10:37:48

PHP預(yù)定義變量數(shù)組

2009-11-30 16:48:08

PHP操作符

2010-04-21 15:20:31

Unix線程

2009-12-11 17:57:13

PHP應(yīng)用JSON

2009-11-17 15:07:16

PHP數(shù)組遍歷

2011-07-05 17:52:41

PHP

2009-09-17 14:21:19

LINQ表達(dá)式

2009-12-18 18:10:55

Fedora proc
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號