首页
/
每日頭條
/
科技
/
如何理解php的單線程
如何理解php的單線程
更新时间:2025-03-12 13:34:11
先從socket通信簡單的demo開始

server.php $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); socket_set_option($socket,SOL_SOCKET,SO_REUSEADDR,true); socket_bind($socket,0,8888); socket_listen($socket); while(true){ $conSock = socket_accept($socket); socket_getpeername($conSock,$ip,$port); echo 'ip:'.$ip.'...port:'.$port.'...connetted'.PHP_EOL; while(true){ $recMsg = socket_read($conSock,1024); socket_write($conSock,strtoupper($recMsg),strlen($recMsg)); echo $recMsg ; } } client.php $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); socket_connect($socket,'192.168.113.136',8888); while(true){ fwrite(STDOUT,'請輸入内容:'); $in = fgets(STDIN); socket_write($socket,$in,strlen($in)); echo socket_read($socket,1024); }

socket/workman/swoole學習交流群:604438441

php學習交流群:163656536

先運行 server.php

如何理解php的單線程(php網絡編程之io多路複用以及實現http服務器功能)1

在運行 client.php

如何理解php的單線程(php網絡編程之io多路複用以及實現http服務器功能)2

實現了socket的通信,但是這裡有個問題,當我們在開一個終端運行 client.php時,這時 無法進行 socket通信,因為 上一個client.php在阻塞,沒辦法進行應答。這裡就需要一個新的知識點,來解決。

如何理解php的單線程(php網絡編程之io多路複用以及實現http服務器功能)3

IO阻塞模型隻能是同一個時刻隻能由一個客戶端進行訪問。不能好幾個客戶端同時訪問服務端。

解決:

1 多進程

2 IO多路複用機制

select(apache) epoll (nginx) 模型

socket_select() 函數 就是使用了 select 模型 實現io多路複用

如何理解php的單線程(php網絡編程之io多路複用以及實現http服務器功能)4

socket_select 這個函數解決

//實現io多路複用 返回活躍的連接 socket_select ( array &$read , array &$write , array &$except , int $tv_sec [, int $tv_usec = 0 ] ) 注意 :前三個參數都是引用傳值。 $read 服務端監聽的套接字資源,當它有變化(就是有新消息到或者有客戶端連接/斷開)時,socket_select函數才會返回,繼續往下執行。 $write是監聽是否有客戶端寫數據,傳入NULL是不關心是否有寫變化。 $except是$sockets裡面要被排除的元素,傳入NULL是”監聽”全部。 第四個參數為null為阻塞, 為0位非阻塞, 為 >0 為等待時間 返回 活躍的鍊接數 當有連接 或數據操作時就會返回

改造一下sever.php的代碼

//server.php 把上面的server.php 改造之後 $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); socket_set_option($socket,SOL_SOCKET,SO_REUSEADDR,true); socket_bind($socket,0,8888); socket_listen($socket); $sockets[] = $socket; $write = null; $except = null; while(true){ $tmp_sockets = $sockets; socket_select($tmp_sockets,$write,$except,null); foreach($tmp_sockets as $sock){ if($sock==$socket){ $conSock = socket_accept($socket); socket_getpeername($conSock,$ip,$port); echo 'ip:'.$ip.'...port:'.$port.'...connetted'.PHP_EOL; $sockets[] = $conSock; }else{ $recMsg = socket_read($sock,1024); socket_write($sock,strtoupper($recMsg),strlen($recMsg)); echo $recMsg ; } } }

client.php代碼不變 然後 在分别執行 server.php 以及 client.php

如何理解php的單線程(php網絡編程之io多路複用以及實現http服務器功能)5

如何理解php的單線程(php網絡編程之io多路複用以及實現http服務器功能)6

兩個終端鍊接 可以進行通信 不受影響

實現web服務器功能

$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); socket_set_option($socket,SOL_SOCKET,SO_REUSEADDR,true); socket_bind($socket,0,80); socket_listen($socket); $sockets[] = $socket; $write = null; $except = null; while(true){ $tmp_sockets = $sockets; socket_select($tmp_sockets,$write,$except,null); foreach($tmp_sockets as $sock){ if($sock==$socket){ $conSock = socket_accept($socket); socket_getpeername($conSock,$ip,$port); $sockets[] = $conSock; }else{ $str = 'hello this is socket'; $len = strlen($str); $response = "HTTP/1.1 200 OK\r\n"; $response .= "Content-Type: text/html; charset=utf-8\r\n"; $response .="Content-Length: $len\r\n\r\n"; $response .=$str; @socket_write($sock,$response,strlen($response)); } } }

浏覽器訪問

如何理解php的單線程(php網絡編程之io多路複用以及實現http服務器功能)7

已經可以正常的能夠訪問了,不依賴于 nginx apache 就可以直接訪問,比較簡陋 但是大體功能實現了。僅供學習參考。

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
目前哪些手機支持wifi 6e
目前哪些手機支持wifi 6e
蘋果的硬件軟件都是可控的技術,産品向來都有着一整套的盈利模式,,數碼産品的配件也必須帶有蘋果的标準認證,最常見的就是蘋果的數據線,大廠商都必須通過蘋果的MFi認證,但認證過去的廠商少之又少,不認證的數據線用一般時間就不會不能使用,手機提示此...
2025-03-12
u啟動安裝系統步驟
u啟動安裝系統步驟
u啟動安裝系統步驟?做系統有三種方法,分别是光盤方法、U盤安裝以及硬盤解壓方法,最簡單的是u盤安裝系統的方法,接下來小編跟大家介紹怎麼自己在家做系統的方法,現在小編就來說說關于u啟動安裝系統步驟?下面内容希望能幫助到你,我們來一起看看吧!u...
2025-03-12
我的世界火把照明距離
我的世界火把照明距離
在《我的世界》中是不是一個人在寂靜的夜晚感到害怕呢?身邊不斷傳來生物的叫聲,火把并不能帶來安全感。這個時候就需要一些MC黑科技了,這些方法可以讓你的夜晚不再害怕,而且光亮在我的世界的夜晚中非常重要,那麼到底是什麼辦法呢?我們一起來看一下吧!...
2025-03-12
gta6飛機墜落
gta6飛機墜落
IT之家9月28日消息,近日,一位匿名用戶在GTA論壇發布了一個多小時的《GTA6》開發視頻,可能會成為遊戲行業有史以來最引人注目的數據洩露事件之一。英國警方已經證實,他們已經指控一名因涉嫌黑客行為而被捕的青少年,據一份報告稱,這與最近的《...
2025-03-12
youtube獎勵機制
youtube獎勵機制
你好,我是認真努力學習自媒體YouTube運營攻略的“油管小生”。現在研究YouTube賺錢攻略的人越來越多,我一直在努力學習YouTube的運營技巧,如果你也和我一樣想學習YouTube賺錢方法和運營技巧,那麼就請訂閱我一起探讨學習吧。油...
2025-03-12
Copyright 2023-2025 - www.tftnews.com All Rights Reserved