| 本文采用的1999年开发者J. David Blackstone写的一个用于学习的http服务器,由于系统的不同,我采用的是修改后适合linux的版本
| Linux改版后的源码地址:https://github.com/qiyeboy/SourceAnalysis
| 图文引用自:https://www.cnblogs.com/qiyeboy/p/6296387.html
| 我的github地址:https://github.com/leilong/tinyhttp_copy
实现原理
源码解析
1,目录分析
http.c 核心文件,请求接收及处理都在这个文件里
Makefile 自动构建脚本
httpd 命令行make后生成的 文件
htdocs 网站运行目录
color.cgi 运行脚本文件
check.cgi
index.html 默认首页
2,http.c文件解读
main 主函数,
start_up 启动服务端(设置http socket,绑定端口,监听连接)
accept 接收客户端连接
pthread_create 启动线程处理新的连接
close 关闭server socket
操作流程
| 注意:由于开发者的系统为Sparc Solaris 2.6,跟我的系统(deepin)有所差别,即使按照文档中给的提示注释掉一些代码依旧无法运行,非常幸运的是找到一个Linux版本的tinyhttp,在此感谢开源工作者的努力。
1,两个cgi文件需要为 700权限
2,index.html权限应该为600
3,执行make
4,输入 ./httpd
5,浏览器地址栏输入 127.0.0.1:40703
举一反三
源文件中,其他人还通过定义一个头部文件让shell脚本能够执行python,那能不能让PHP也能运行呢,翻阅了文档,官方还真的有。
我们在文件里输入,并到浏览器查看,phpinfo信息被展现出来
#!/usr/bin/php
echo phpinfo();
其他实现方式
1,php从5.4.0开始,都有内置的http服务器,可方便开发人员进行本地调试,如果你是tp框架,可在项目根目录下执行 下面这条语句即可。
php -S localhost:8090 -t public ( -t 会指定运行目录 )
2,php还有一种方式实现运行web环境,window下阻塞运行,只可单次连接。
$socket = stream_socket_server("127.0.0.1:8099", $errno, $errstr);
if (!$socket) {
echo "$errstr ($errno)
\n";
} else {
while (true) {
$conn = @stream_socket_accept($socket);
if ($conn) {
echo ('The local time is ' . date('n/j/Y g:i a') . "\n");
} else {
echo "no newSocket\n";
}
}
}
在Linux可增加 pcntl_fork() 进行优化,优化的逻辑是每次连接增加一条新的子进程,但是这样的坏处是用户一多,空置进程增加,运行速度变慢。所以,我们实现的只是一个很简单的http-server,如果需要优化,可增加开发连接线程池,使用epoll模型,开启Gzip等功能。
领取专属 10元无门槛券
私享最新 技术干货