资讯专栏INFORMATION COLUMN

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

khlbat / 3361人阅读

摘要:自己动手用编写一个简单的单进程版协议我的简化版理解就是电脑上浏览器向服务器发送一个预先定义好的文本然后服务器端处理一下通常是从硬盘读取一个后缀名为的文件,然后再把这个文件通过文本方式发回去就这么简单。

自己动手用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();

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22232.html

相关文章

  • 一步步搭建物联网系统——GNU/Linux 强大且Free

    摘要:强大且什么是是一种自由和开放源码的类操作系统内核。是一个领先的操作系统内核,世界上运算最快的台超级电脑运行的都是基于内核的操作系统。开机完成后,就接手初始化硬件设备创建存储器空间的映射,以便为操作系统内核准备好正确的软硬件环境。 GNU/Linux 强大且Free showImg(http://designiot.phodal.com/images/gnu_linux.png); ...

    weapon 评论0 收藏0
  • 一步步搭建物联网系统——GNU/Linux 强大且Free

    摘要:强大且什么是是一种自由和开放源码的类操作系统内核。是一个领先的操作系统内核,世界上运算最快的台超级电脑运行的都是基于内核的操作系统。开机完成后,就接手初始化硬件设备创建存储器空间的映射,以便为操作系统内核准备好正确的软硬件环境。 GNU/Linux 强大且Free showImg(http://designiot.phodal.com/images/gnu_linux.png); ...

    yanwei 评论0 收藏0
  • PHP-FPM和CGI,还有并发响应理解

    摘要:官方对的解释是进程管理器。对并发访问的处理进程和线程从代码级别来讲不支持多线程操作,不能像等语言一样可以编写多线程代码。 关于本篇文章的部分纠正,请参考这篇文章:http://www.cppblog.com/woaido... 首先搞清楚php-fpm与cgi的关系 CGI CGI是一个web server与cgi程序(这里可以理解为是php解释器)之间进行数据传输的协议,保证了传递的...

    tianyu 评论0 收藏0
  • zys高性能服务框架

    摘要:是基于和的高性能服务框架核心特性基于提供分布式服务器通讯服务基于提供远程调用服务基于提供在线网络直播平台服务基于提供同步异步数据库连接池服务基于提供异步任务服务器投递任务服务基于提供服务器硬件实时监控服务基于提供共享数据配置服务基于提供高并 zys是基于yaf和swoole的高性能服务框架核心特性 1.基于swoole提供分布式服务器通讯服务 2.基于thrift提供rpc远程调用服务...

    oujie 评论0 收藏0

发表评论

0条评论

khlbat

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<