PHP中實現非阻塞模式

2021-09-30 10:53:21 字數 1778 閱讀 2499

程式非阻塞模式,這裡也可以理解成併發。而併發又暫且可以分為網路請求併發本地併發

先說一下網路請求併發

理論描述

假設有乙個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事件的訊息函式,然後在...