php socket隨心記一

2021-10-01 05:35:13 字數 3014 閱讀 7018

php中socket擴充套件建立的資源和stream_socket建立的資源不是同一種資源,所以他們之間的方法不能通用,他們之間可以通過socket_import_stream將stream轉化為socket(php5.4+)。

下面我們探索stream_socket的用法。

php文件中對於socket建立的描述

(php 5, php 7)

stream_socket_server— create an internet or unix domain server socket

resourcestream_socket_server( string $local_socket [, int &$errno [, string &$errstr [, int $flags = stream_server_bind | stream_server_listen [, resource $context ]]]] )

stream_socket_client— open internet or unix domain socket connection

resourcestream_socket_client( string$remote_socket[, int&$errno[, string&$errstr[, float$timeout= ini_get("default_socket_timeout") [, int$flags= stream_client_connect [, resource$context]]]]] )

其中引數 $local_socket、$remote_socket是必填項,支援ipv4、ipv6、網域名稱形式,支援ssl,tcp,udp,unix等協議,這裡有幾個需要注意的地方.

1、127.0.0.1是只監聽本機網絡卡,當ip層收到目的位址為127.0.0.1的資料報時,不呼叫網絡卡進行二次封裝,而是立即轉到本機ip層進行處理,所以很多socket框架,如workerman在壓力測試時,監聽這個位址,排除掉了網路傳輸開銷,短鏈結吞吐率高達2萬/s,長連線吞吐率高達36萬,評價乙個框架的好壞,這個是乙個重要的指標。

2、0.0.0.0 是監聽未知ip,即任意ip,同理如果192.0.0.0,則是監聽192開頭的源ip訪問。

3、如果是網域名稱,那麼在呼叫stream_socket_get_name的true時,返回的時ip位址值,開發時一定要注意這點。

stringstream_socket_get_name( resource$handle, bool$want_peer) true時remote,false時local,沒有預設值。

4、引數$flags的stream_server_bind即繫結,stream_server_listen即刻監聽,udp套接字時,因為是非連線的,所以只取繫結,不能設定監聽。

5、引數 $context 來自

resourcestream_context_create([ array$options[, array$params]] )

建立並返回乙個資源流上下文,該資源流中包含了options中提前設定的所有引數的值。

可以看出,這裡不需要設定引數,這裡設定引數的效果和stream_context_set_option、stream_context_set_params設定效果一致,也可以先設定好引數(必須是二維陣列)後,再用後面兩個進行補充。

如:$context=stream_context_create(array('socket'=>array('backlog'=>102400)))設定等待處理連線佇列的最大長度,再stream_context_set_option($context,"socket","so_reuseport",1);(等效於stream_context_set_option($context,array('socket'=>array('so_reuseport'=>1)));)補充乙個允許埠復用的規則(php7+)。這裡的二位陣列引數還有其他哪些可以設定的,等我再去研究研究再來分享。

6、對於stream_socket_client:

引數$timeout在stream_client_connect時有效,表示等待連線成功的最大時間,這個時間不影響fread的等待時間,而stream_set_timeout也不影響$timeout的效果,可以影響fread的等待時間。

引數flags預設為stream_client_connect,還有其他2個選項,含義如下

stream_client_connect:同步連線,返回檔案描述符,等待連線成功後返回,連線不成功返回false。

stream_client_async_connect:非同步連線,返回檔案描述符,不用等待連線成功,也就是說非同步連線乙個不存在的服務端時,返回的檔案描述符仍然是有效資源,即is_resource為真,feof為真,stream_socket_get_name返回正常,只有通過fwrite或fread返回false來判斷是否連線有效,經過fwrite或fread後feof就被置為假了,但是is_resource任然為真。

stream_client_persistent:長連線,可以和上面配合|使用,建立的連線不會因為結束而銷毀,當新建連線ip相同時,port不在隨機,使用相同連線,免去三次握手,四次揮手的開銷,提高效率。

前端隨心記 MySQL

資料庫 顧名思義,就是儲存資料的倉庫。mysql是一種關聯資料庫管理系統,關聯資料庫將資料儲存在不同的表中,而不是將所有資料放在乙個大倉庫內,這樣就增加了速度並提高了靈活性。mysql是乙個輕量級的資料庫,與php配合使用效果非常好,mysql支援大部分sql語句。常見的資料庫 oracle mys...

Python隨心記 鎖

同步鎖 死鎖 遞迴鎖 訊號量和同步evrnt物件 了解即可 佇列 生產者消費者模型 程序併發並行與同步非同步的概念 併發 系統具有處理多個任務 動作 的能力 並行 系統具有同時處理多個任務 動作 的能力 並行時併發的乙個子集 同步 當程序執行到乙個io 等外部的資料 的時候,等 就是同步 不等 直到...

Python隨心記 練習

l1 11,22,33 l2 22,33,44 for item in l1 if item not inl2 print item 統計123455678組合兩位數且不能重複 num 0 for item in range 1,9 for vtem in range 1,9 if item vte...