首页
/
每日頭條
/
科技
/
如何理解php的單線程
如何理解php的單線程
更新时间:2026-07-03 02:45:16
先從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
推荐阅读
塑鋼焊機焊闆不加熱
塑鋼焊機焊闆不加熱
1、塑鋼焊機焊闆不加熱,用表檢查熱火線,再查一下保險絲,如斷了或壞了,接上線或換一新的保險管就好了。...
2026-07-03
2023安全技術與管理專業學什麼課程 就業前景及方向
2023安全技術與管理專業學什麼課程 就業前景及方向
安全技術與管理專業基礎課程:工程制圖與CAD、電工技術、安全人機工程、職業衛生、安全生産法律法規、工業通風與除塵、安全系統工程、事故應急救援。安全技術與管理專業将來的就業方向一般是,進入企業從事安全生産方面的管理工作,職位的進階一般包括安全員、安全工程師、安全主管、安全經理。2023安全技術與管理專...
2026-07-03
2023草業技術專業學什麼課程 就業前景及方向
2023草業技術專業學什麼課程 就業前景及方向
草業技術專業基礎課程:植物基礎與植物分類、草地植物與環境、草地機械實用技術、草業地理信息技術、草業遙感技術、草業政策與法規。随着人們生活水平的提高,人們對環境的要求也在逐漸提高,草業技術專業的同學們将來的就業前景是廣闊的。2023草業技術專業課程有哪些草業技術專業基礎課程:植物基礎與植物分類、草地植...
2026-07-03
2023通信技術專科生的出路 好不好找工作
2023通信技術專科生的出路 好不好找工作
通信技術專科生的出路最常見的就是直接做通訊行業。除了網絡優化之外,也就是無線崗位之外,你還可以做工程督導,但是工程督導的發展不是很好,并且出差也比較頻繁通信技術專科生有什麼出路通信技術專業就業主要面向通信和電子、信息等行業的運營商、生産型企業從事通信。通信技術專業的畢業生就業領域主要是各大運營商、電...
2026-07-03
2023女生選警犬技術好不好 畢業能做什麼工作
2023女生選警犬技術好不好 畢業能做什麼工作
女生選警犬技術還可以。警犬技術有優點也有缺點。是否合适是最重要的興趣,與性别關系不大。由于警犬技術的特殊性,我國警犬技術力量絕大多數在地市級以上公安機關,新兵數量少。女生選警犬技術怎麼樣女生選警犬技術還可以。警校警犬專業适合女生,對一個女孩來說,上警察學院是很難的。首先是高考成績,提前批警校女孩要比...
2026-07-03
Copyright 2023-2026 - www.tftnews.com All Rights Reserved