博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自己动手用PHP编写一个简单的HTTP Server(单进程版)
阅读量:6593 次
发布时间:2019-06-24

本文共 2683 字,大约阅读时间需要 8 分钟。

自己动手用PHP编写一个简单的HTTP Server(单进程版)

HTTP协议我的简化版理解就是电脑上浏览器向服务器发送一个预先定义好的文本(Http Request)

然后服务器端处理一下(通常是从硬盘读取一个后缀名为html的文件),然后再把这个文件
通过文本方式发回去(Http Response),就这么简单。

唯一麻烦的是我得请操作系统给我建立Http层下面的TCP连接通道,因为所有的文本数据都得

通过TCP管道接收和发送,这个通道是用socket建立的。

  • 伪代码如下

socketMain= socket(...)bind(socketMain,主机的IP和端口号)listen(socketMain,...)无限循环while(true) {    socketAccept = accept(socketMain,....)    receive(socketAccept,....)    send(socketAccept...)    close(socketAccept...)}
  • 伪代码解释

这些socket,bind,listen,accept都是操作系统提供的接口,我们要做的就是把这些进行

组装;现在80或者其他端口监听,然后进入无限循环,如果有请求进来,就接受(accept),创建新的socket,最后通过这个socket来接收和发送Http数据。

  • 实现的php代码如下

只实现了当前目录下的html与jpg图片的解析处理,原理都类似。

_socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($this->_socket === false) { die(socket_strerror(socket_last_error($this->_socket))); } } public function run() { socket_bind($this->_socket, $this->ip, $this->port); socket_listen($this->_socket, 5); while(true) { $socketAccept = socket_accept($this->_socket); $request = socket_read($socketAccept, 1024); echo $request; socket_write($socketAccept, 'HTTP/1.1 200 OK'.PHP_EOL); socket_write($socketAccept, 'Date:'.date('Y-m-d H:i:s').PHP_EOL); $fileName = $this->getUri($request); $fileExt = preg_replace('/^.*\.(\w+)$/', '$1', $fileName); $fileName = __DIR__.'/'.$fileName; switch ($fileExt) { case "html": //set content type socket_write($socketAccept, 'Content-Type: text/html'.PHP_EOL); socket_write($socketAccept, ''.PHP_EOL); $fileContent = file_get_contents($fileName); socket_write($socketAccept, $fileContent, strlen($fileContent)); break; case "jpg": socket_write($socketAccept, 'Content-Type: image/jpeg'.PHP_EOL); socket_write($socketAccept,''.PHP_EOL); $fileContent = file_get_contents($fileName); socket_write($socketAccept, $fileContent, strlen($fileContent)); break; } socket_write($socketAccept, 'web serving', strlen('web serving')); socket_close($socketAccept); } } protected function getUri($request = '') { $arrayRequest = explode(PHP_EOL, $request); $line = $arrayRequest[0]; $file = trim(preg_replace('/(\w+)\s\/(.*)\sHTTP\/1.1/i','$2', $line)); return $file; } public function close() { socket_close($this->_socket); }}$httpServer = new HttpServer();$httpServer->run();

转载地址:http://mecio.baihongyu.com/

你可能感兴趣的文章
hdu 4194(模拟)
查看>>
NYOJ469
查看>>
POSIX规范-unbuffered I/O (文件I/O)
查看>>
sys模块
查看>>
python修行之路(三 模块初识及数据运算类型)
查看>>
[转载]经典搞笑:一个BUG引发的血案|为程序员打造的年终大片
查看>>
Zookeeper01
查看>>
Ajax加载数据中的loading效果
查看>>
C++对象模型5--多继承下的对象模型
查看>>
深入.NET平台和C#编程.第七章:深入理解多态-上机练习2-3
查看>>
MySQL读取配置文件的顺序、启动方式、启动原理
查看>>
配置Linux 11G R2 RAC NTP服务
查看>>
学习路线
查看>>
【洛谷3959】 宝藏
查看>>
Mac安装软件时,提示文件已损坏,需要移动到废纸篓的解决方法
查看>>
redis的安装
查看>>
Xcode 几个图标解释
查看>>
Mybatis插件机制以及PageHelper插件的原理
查看>>
[05-01]Linux如何重启系统
查看>>
基于Jquery、JqueryUI插件编写
查看>>