PHP实现动态web服务器方法
以下内容通过图文并茂的方式介绍php实现动态web服务器的方法,具体内容如下: 本文所实现的服务器仅仅是演示和理解原理所用,力求简单易懂。有兴趣的朋友可以继续深入改造 要是现实一个 web 服务器,那么就需要大概了解 web 服务器的运行原理。先从静态的文本服务器开始,以访问 web 服务器的1.html为例 1.客户端通过发送一个 http 请求到服务器,如果服务器监听的端口号是9002,那么在本机自身测试访问的地址就是http://localhost:9002/1.html。2.服务器监听着9002端口,那么在收到请求了请求之后,就能从 http head 头中获取到请求里需要访问的 uri 资源在web 目录中的位置。3.服务器读取需要访问的资源文件,然后填充到 http 的实体中返回给客户端。示意图如下: ip = $ip;
$this->port = $port;
$this->await();
}
private function await() {
$sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
if ($sock < 0) {
echo "Error:" . socket_strerror(socket_last_error()) . "n";
}
$ret = socket_bind($sock,$this->ip,$this->port);
if (!$ret) {
echo "BIND FAILED:" . socket_strerror(socket_last_error()) . "n";
exit;
}
echo "OKn";
$ret = socket_listen($sock);
if ($ret < 0) {
echo "LISTEN FAILED:" . socket_strerror(socket_last_error()) . "n";
}
do {
$new_sock = null;
try {
$new_sock = socket_accept($sock);
} catch (Exception $e) {
echo $e->getMessage();
echo "ACCEPT FAILED:" . socket_strerror(socket_last_error()) . "n";
}
try {
$request_string = socket_read($new_sock,1024);
$response = $this->output($request_string);
socket_write($new_sock,$response);
socket_close($new_sock);
} catch (Exception $e) {
echo $e->getMessage();
echo "READ FAILED:" . socket_strerror(socket_last_error()) . "n";
}
} while (TRUE);
}
/**
* @param $request_string
* @return string
*/
private function output($request_string){
// 静态 GET /1.html HTTP/1.1 ...
$request_array = explode(" ",$request_string);
if(count($request_array) < 2){
return $this->not_found();
}
$uri = $request_array[1];
$filename = web_config::WEB_ROOT . $uri;
echo "request:".$filename."n";
// 静态文件的处理
if (file_exists($filename)) {
return $this->add_header(file_get_contents($filename));
} else {
return $this->not_found();
}
}
/**
* 404 返回
* @return string
*/
private function not_found(){
$content = "
File Not Found"; return "HTTP/1.1 404 File Not FoundrnContent-Type: text/htmlrnContent-Length: ".strlen($content)."rnrn".$content; } /** * 加上头信息 * @param $string * @return string */ private function add_header($string){ return "HTTP/1.1 200 OKrnContent-Length: ".strlen($string)."rnServer: mengkangrnrn".$string; } } $server = new server("127.0.0.1",web_config::PORT);代码已经上传 github 如上代码所述,只要在终端执行该文件,那么一个静态的 web 服务器就启动啦。 下图为我访问我 web 目录下的1.jpg文件的截图 简单的静态 web 服务器已经完成了,下面的问题就是怎么让其支持动态内容的输出了。是不是只需要在 web 服务器内部执行完某个程序之后,把得到的结果返回给客户端就行呢?但是这样 web 服务器的代码就和业务代码耦合在一起了,怎么解决一个 web 服务器,可以运用在各个业务场景下呢? CGI 的出现解决了这一问题。那么 CGI 是什么呢?下面这段话复制的: CGI是外部应用程序(CGI程序)与Web服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的规程。CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。 好晕,举个具体的例子,比如我们在使用的 PHP 的全局变量 代码如下: 没错 nginx 把自己的全局变量 下面我们也以 CGI 的 我们约定 Web 服务器中访问的资源是 大致的访问逻辑如下图 演示代码地址: 如果要运行该 demo 需要做如下操作 1.修改
|