程式非阻塞模式,這裡也可以理解成併發。而併發又暫且可以分為網路請求併發和本地併發。
先說一下網路請求併發
理論描述
假設有乙個client,程式邏輯是要請求三個不同的server,處理各自的響應。傳統模型當然是順序執行,先傳送第乙個請求,等待收到響應資料後再傳送第二個請求,以此類推。就像是單核cpu,一次只能處理一件事,其他事情被暫時阻塞。而併發模式可以讓三個server同時處理各自請求,這就可以使大量時間復用。
畫個圖更好說明問題:
前者為阻塞模式,忽略請求響應等時間,總耗時為700ms;而後者非阻塞模式,由於三個請求可以同時得到處理,總耗時只有300ms。
**實現
<?php
echo "program starts at ". date('h:i:s') . "./n";
$timeout = 3;
$sockets = array(); //socket控制代碼陣列
//一次發起多個請求
//非阻塞模式來接收響應
$result = array();
$read_block_size = 8192;
while (count($sockets))
closes at " . date('h:i:s') . "./n";
fclose($r);
unset($sockets[$id]);
} else
}
} else
}
//print_r($result);
幾點說明:
1、使用stream_socket_client函式鏈結請求伺服器和埠(簡便起見這裡使用同一位址localhost)。這裡不受限於http協議,可廣泛用於所有tcp/ip協議。詳細內容請參考手冊。
3、傳送header前需要個微小的延遲,**中已經做了注釋。
cli模式執行結果:
多執行幾次會發現,三次請求結束順序是無序的。該demo太過簡單導致整個過程一秒內已完成,但可以針對三次不同請求做相應延遲,來看出非阻塞時時間復用的效果。
下面再大概說下本地併發
本地併發只能通過語言自己的特性在程式本身實現多工效果,一般來說現在的語言會通過多執行緒或多程序的方式來實現。由於php不支援多執行緒,目前只能採用多程序方式,讓作業系統來幫助實現本地併發。
至於**實現,可以通過pcntl擴充套件(封裝fork等程序控制函式,和c語言中使用非常相似,windows下不可用)、 proc_open、popen等方式,方法不止一種,這裡就不做詳細介紹了。詳情可自行搜尋「php多程序」進行了解:)
PHP實現非阻塞模式的方法分析
程式非阻塞模式,這裡也可以理解成併發。而併發又暫且可以分為網路請求併發和本地併發。先說一下網路請求併發 理論描述 假設有乙個client,程式邏輯是要請求三個不同的server,處理各自的響應。傳統模型當然是順序執行,先傳送第乙個請求,等待收到響應資料後再傳送第二個請求,以此類推。就像是單核cpu,...
阻塞模式和非阻塞模式
好文得轉 何為阻塞?在以上過程中若連線還沒到來,那麼 accept 會阻塞 程式執行到這裡不得不掛起,cpu 轉而執行其他執行緒。在以上過程中若資料還沒準備好,read 會一樣也會阻塞。阻塞式網路 io 的特點 多執行緒處理多個連線。每個執行緒擁有自己的棧空間並且占用一些 cpu 時間。每個執行緒遇...
非阻塞模式
非阻塞模式是指利用socket事件的訊息機制,server端與client端之間的通訊處於非同步狀態。在非阻塞模式下利用socket事件的訊息機制,server端與client端之間的通訊處於非同步狀態下。通常需要從csocket類派生乙個新類,派生新類的目的是過載socket事件的訊息函式,然後在...