为web服务器添加php的支持#
git clone https://github.com/shiyanlou/php-server
#代码说明
server01.c //最最基本的web服务器
server02.c //加入循环读取,判断请求
server03.c //加入php支持,第二个实验
html和图片为测试文件
fastcig //php支持模块,第二个实验
实验原理#
FastCGI 是 Web 服务器和处理程序之间通信的一种协议, 是 CGI 的一种改进方案,它为所有因特网应用提供高性能。FastCGI 像是一个常驻 (long-live) 型的 CGI, 它可以一直执行,在请求到达时不会花费时间去 fork 一个进程来处理(这是 CGI 最为人诟病的 fork-and-execute 模式)。 正是因为他只是一个通信协议,它还支持分布式的运算,即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。
FastCGI 是语言无关的、可伸缩架构的 CGI 开放扩展,将 CGI 解释器进程保持在内存中,以此获得较高的性能。 CGI 程序反复加载是 CGI 性能低下的主要原因,如果 CGI 程序保持在内存中并接受 FastCGI 进程管理器调度, 则可以提供良好的性能、伸缩性、Fail-Over 特性等。
当 WEB 服务器接收到一个 PHP 文件请求时,WEB 服务器会通过 FastCGI 将请求转发给 FastCGI 进程管理器(即 PHP-FPM),FastCGI 进程管理器接收到请求后,调用 php 解释器执行 php 文件,然后将执行结果返回给WEB服务器,之后 WEB 服务器再将 FastCGI 进程管理器返回的结果处理成 HTTP 响应报文格式发送给浏览器。
FastCGI 协议大概流程如下 图1-9 所示
一般情况下,FastCGI 的整个工作流程是这样的:
1.Web Server 启动时载入 FastCGI 进程管理器(PHP-FPM 或 Apache Module)。
2.FastCGI 进程管理器自身初始化,启动多个 CGI 解释器进程(可见多个 php-cgi)并等待来自 Web Server 的连接。
3.当客户端请求到达 Web Server 时,FastCGI 进程管理器选择并连接到一个 CGI 解释器。 Web server 将 CGI 环境变量和标准输入发送到 FastCGI 子进程 php-cgi。
4.FastCGI 子进程完成处理后将标准输出和错误信息从同一连接返回 Web Server。当 FastCGI 子进程关闭连接时, 请求便告处理完成。FastCGI 子进程接着等待并处理来自 FastCGI 进程管理器(运行在 Web Server 中)的下一个连接。在 CGI 模式中,php-cgi 在此便退出了。
#实验过程#
首先安装 php-fpm,使用如下命令:
sudo apt-get install php5-fpm
然后修改 php5-fpm 的配置文件,即 /etc/php5/fpm/pool.d/www.conf文件。
定位到第 33 行,将listen = /var/run/php5-fpm.sock 改为 listen = 127.0.0.1:9000
用vi修改好文件后,发现文件是只读权限的,可以使用下面的命令进行强制保存该文件。
w !sudo tee %
##修改成功##
然后执行以下命令运行 php-fpm。
sudo php5-fpm
使用 netstat -apn | head -10可以查看是否启动成功,如下图所示表示启动成功。
接下来进入之前从 git 上下载下来的目录,请求的 test.php 文件内容为:
echo "This is a test!\n";
echo "The name is " . $_GET['name'];
?>
php 文件会打印 WEB 服务器传递的 {"QUERY_STRING", "name=shiyanlou"} 参数。
在命令编译并执行 fastcgi01.c 文件,运行结果如 图所示:
从上面的运行结果可以看出,test.php 运行成功了!
下面将 fastcgi01.c 与 server02.c 两个文件整理一下,见 php-server 目录中的 server03.c、fastcgi.h 和 fastcgi.c三个文件。编译运行,并在浏览器中输入:127.0.0.1:8080/test.php?name=shiyanlou,运行结果见下图所示。
从上面的运行结果可以看出,WEB 服务器已经成功处理 php 文件请求。至此我们的 WEB 服务器项目已经完成了。
实验总结#
通过本实验学习了 c语言编写 linux 网络程序,socket 编程,以及 CGI 接口介绍,FastCGI 的运用,最后编写 WEB 服务器处理 php 文件请求。