web服务器是基于http协议,将对应的文件传输给客户端的服务器。
web服务器是什么
web服务器是基于http协议,将对应的文件传输给客户端的服务器。
HTTP协议
http 协议的请求及响应方式设计
http请求信息的结构
请求信息分为请求行、消息头、消息体等3部分。
http响应信息结构
响应信息格式如上图。
有了对http协议的了解就可以开始来看下面的代码了。
使用方法
1、 启动服务端 php http_server.php
2、打开浏览器输入127.0.0.1:
由于 php没有多线程,不能有效管理子进程。select、 i/o 复用epol,没办法高效
源码 http_server.php
<?php
if ($argc != 2) {
$msg = sprintf("Usage: %s <port>", $argv[0]);
die($msg);
}
$host = "127.0.0.1";
$port = $argv[1];
if (($serv_sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
die("socket_create() error: ". socket_strerror($serv_sock));
}
if (($ret = socket_bind($serv_sock, $host, $port)) < 0) {
die("socket_bind() error: ". socket_strerror($ret));
}
if (($ret = socket_listen($serv_sock, 4)) < 0) {
die("socket_listen() error: ". socket_strerror($ret));
}
echo "服务启动成功 {$host}:{$port}\n";
while (1) {
if (($clnt_sock = socket_accept($serv_sock)) < 0) {
echo "socket_accept() error: ". socket_strerror($clnt_sock), "\n";
break;
} else {
$str = str_pad('', 1024);
echo "Connection Request {$str} \n";
if (!request_handler($clnt_sock)) {
}
socket_close($clnt_sock);
}
}
socket_close($serv_sock);
function request_handler($clnt_sock)
{
$req_buf = socket_read($clnt_sock, 4096);
echo "请求信息:\n";
echo $req_buf;
$req_info = explode( "\n" , $req_buf);
$req_head = $req_info[0];
if (strpos($req_head, "HTTP/") === false) {
send_error($clnt_sock);
return false;
}
$req_head_info = explode(" /" , $req_head);
if (empty($req_head_info[0])) {
send_error($clnt_sock, "http格式错误");
return false;
}
$method = $req_head_info[0];
$file_protocol = explode(' ', $req_head_info[1]);
$file_name = $file_protocol[0];
$file_protocol = $file_protocol[1];
$contype = content_type($file_name);
send_data($clnt_sock, $file_name, $contype);
}
function get_ext($file_name)
{
$file_info = explode('.',$file_name);
$ext = end($file_info);
return $ext;
}
function content_type($file_name)
{
$ext = get_ext($file_name);
if ($ext == "php" || $ext == "html" || $ext == "htm") {
return "text/html";
} else if ($ext == "jpg" || $ext == "jpeg") {
return "image/jpeg";
}else if ($ext == "png") {
return "image/jpeg";
} else {
return "text/html";
}
}
function send_data($clnt_sock, $file_name, $contype, $content = "")
{
$http_code = "200 OK";
if (file_exists($file_name)) {
$ext = get_ext($file_name);
if ($ext == "php") {
ob_start();
include $file_name;
$content = ob_get_contents();
ob_end_clean();
} else if($ext == "html" || $ext == "htm") {
$content = file_get_contents($file_name);
}
} else {
$content = "<html><head><title>404 not found</title></head><body style=\"text-align:center\"><span>404 not found</span></body></html>";
$http_code = 404;
}
if (empty($content)) {
$content = "<html><head><title>PHP WEB 响应</title></head><body>收到信息".date("Y-m-d H:i:s")."</body></html>";
}
$response = "HTTP/1.1 {$http_code}\r\n";
$response .= "Server: PHP Web Server \r\n";
$response .= "Content-lenth:".strlen($content)."\r\n";
$response .= "Content-type:{$contype};charset=utf-8\r\n\r\n";
$response .= $content;
echo $response,"\n";
$clnt_write = socket_write($clnt_sock, $response);
}
function send_error($clnt_sock, $content = "")
{
$file_name = "";
$html_content = "<html><head><title>PHP WEB 响应</title></head><body>出错了{$content}</body></html>";
send_data($clnt_sock, $file_name, $html_content);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)