如何用php实现一个web服务器
①实现一个回显服务器
客户端发来一个请求,我们把请求包发回去显示。
创建监听套接字
新建start_web.php
<?php
//创建监听套接字
$web = stream_socket_server('0.0.0.0:8088');
接收请求,并回显
$conn = @stream_socket_accept($web);
if($conn){
fwrite($conn,fgets($conn));
fclose($conn);
}
启动服务
php start_web.php //启动服务
浏览器访问
http://0.0.0.0:8088/?id=1
显示结果
GET /?id=1 HTTP/1.1
上面的例子在接收客户端连接后,会回显消息。
但是服务端会中断服务。
我们改进一下代码如下:
<?php
$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
可以中断服务器运行
②解析请求报文
要求如下
区分
GET
和POST
获取请求变量
<?php
$_SERVER = array();
//创建一个tcp套接字,并监听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("访问方法是:".$_SERVER['REQUEST_METHOD']."\n请求变量是:".$_SERVER['QUERY_STRING']));
fclose($conn);
}
}
}else{
die($errstr);
}
//http协议解码
function decode($info){
global $_SERVER;
list($header,) = explode("\r\n\r\n",$info);
//将请求头变为数组
$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协议加密
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;
}
启动服务
php start_web.php //启动服务
浏览器访问
http://0.0.0.0:8088/?id=1&age=19
显示结果
访问方法是:GET
请求变量是:id=1&age=19
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。