PHP實現非阻塞模式的方法分析

2022-09-28 03:21:12 字數 1600 閱讀 5837

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

先說一下網路請求併發

理論描述

假設有乙個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協議。詳細內容請參考手冊。

2、這裡鏈結成功後通過傳送各自http頭資訊來獲取不同響應(這裡使用**根目錄下的test.php做服務端)。

3、傳送header前需要個微小的延遲,**中已經做了注釋。

cli模式執行jlmdovod結果:

多執行幾次會發現,三次請求結束順序是無序的。該demo太過簡單導致整個過程一秒內已完成,但可以針對三次不同請求做相應延遲,來看出非阻塞時時間復用的效果。

下面再大概說下本地併發

本地併發只能通過語言自己的特性在程式本身實現多工效果,一般來說現在的語言會通過多執行緒或多程序的方式來實現。由於php不支援多執行緒,目前只能採用多程序方式,讓作業系統來幫助實現本地併發。

至於**實現,可以通過pcntl擴充套件(封裝fork等程序控制函式,和c語言中使用非常相似,windows下不可用)、proc_open、popen等方式,方法不止一種,這裡就不做詳細介紹了。詳情可自行搜尋「php多程序」進行了解:)

PHP中實現非阻塞模式

程式非阻塞模式,這裡也可以理解成併發。而併發又暫且可以分為網路請求併發和本地併發。先說一下網路請求併發 理論描述 假設有乙個client,程式邏輯是要請求三個不同的server,處理各自的響應。傳統模型當然是順序執行,先傳送第乙個請求,等待收到響應資料後再傳送第二個請求,以此類推。就像是單核cpu,...

PHP非阻塞執行方法

正常訪問乙個a方法,a方法需要立即返回,但是a方法會呼叫乙個b方法,b方法可能會阻塞執行很長時間 或者b方法是定時任務 使用fsockopen方法,請求b方法的url,並設定為非阻塞模式傳送請求 fsockopen test.php 非阻塞請求 param url return bool funct...

Socket的阻塞模式和非阻塞模式

阻塞模式 windows套接字在阻塞和非阻塞兩種模式下執行i o操作。在阻塞模式下,在i o操作完成前,執行的操作函式一直等候而不會立即返回,該函式所在的執行緒會阻塞在這裡。相反,在非阻塞模式下,套接字函式會立即返回,而不管i o是否完成,該函式所在的執行緒會繼續執行。在阻塞模式的套接字上,呼叫任何...