php写web服务器端,如何用php实现一个web服务器
①實(shí)現(xiàn)一個(gè)回顯服務(wù)器
客戶端發(fā)來(lái)一個(gè)請(qǐng)求,我們把請(qǐng)求包發(fā)回去顯示。
創(chuàng)建監(jiān)聽套接字
新建start_web.php
//創(chuàng)建監(jiān)聽套接字
$web = stream_socket_server('0.0.0.0:8088');
接收請(qǐng)求,并回顯
$conn = @stream_socket_accept($web);
if($conn){
fwrite($conn,fgets($conn));
fclose($conn);
}
啟動(dòng)服務(wù)
php start_web.php //啟動(dòng)服務(wù)
瀏覽器訪問(wèn)
http://0.0.0.0:8088/?id=1
顯示結(jié)果
GET /?id=1 HTTP/1.1
上面的例子在接收客戶端連接后,會(huì)回顯消息。
但是服務(wù)端會(huì)中斷服務(wù)。
我們改進(jìn)一下代碼如下:
$web = stream_socket_server('0.0.0.0:8088');
while(1){
$conn = @stream_socket_accept($web);
if($conn){
fwrite($conn,fgets($conn));
fclose($conn);
}
}
注意 ctrl+c 可以中斷服務(wù)器運(yùn)行
②解析請(qǐng)求報(bào)文
要求如下
區(qū)分GET和POST
獲取請(qǐng)求變量
$_SERVER = array();
//創(chuàng)建一個(gè)tcp套接字,并監(jiān)聽8088端口
if($web = stream_socket_server('0.0.0.0:8088',$errno,$errstr)){
while(true){
$conn = @stream_socket_accept($web);
if($conn){
$_SERVER = array();
decode(fgets($conn));
fwrite($conn,encode("訪問(wèn)方法是:".$_SERVER['REQUEST_METHOD']."\n請(qǐng)求變量是:".$_SERVER['QUERY_STRING']));
fclose($conn);
}
}
}else{
die($errstr);
}
//http協(xié)議解碼
function decode($info){
global $_SERVER;
list($header,) = explode("\r\n\r\n",$info);
//將請(qǐng)求頭變?yōu)閿?shù)組
$header = explode("\r\n",$header);
list($_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI'], $_SERVER['SERVER_PROTOCOL']) = explode(' ', $header[0]);
$_SERVER['QUERY_STRING'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY);
}
//http協(xié)議加密
function encode($str){
$content = "HTTP/1.1 200 OK\r\nServer: vruan_web/1.0.0\r\nContent-Length: " . strlen($str )."\r\n\r\n{$str}";
return $content;
}
啟動(dòng)服務(wù)
php start_web.php //啟動(dòng)服務(wù)
瀏覽器訪問(wèn)
http://0.0.0.0:8088/?id=1&age=19
顯示結(jié)果
訪問(wèn)方法是:GET
請(qǐng)求變量是:id=1&age=19
總結(jié)
以上是生活随笔為你收集整理的php写web服务器端,如何用php实现一个web服务器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: trait功能 php,PHP之Trai
- 下一篇: php网站入门鹿泉银山,01PHP编程新