PHP最初作为一个专门为Web开发量身定制的语言,本身提供了底层的语法、函数和机制让我们拥有了超高的Web开发效率,使用PHP就相当于使用其他语言附加上了一个Web框架。我们拥有非常好用的$_GET, $_POST超全局数组,以及非常令人省心的单进程模型:每次请求对应一个进程,让我们无需理会线程安全、微小的内存泄漏和资源的清理。但是这些优点像我们屏蔽了一些底层的细节。追根溯源,回到Web开发的源头,使用PHP实现一个HTTP服务器并且运行PHP业务代码,应该是一件很有趣的事情, 这有助于我们理解HTTP协议和HTTP服务器的工作原理,以及HTTP服务器是怎样与PHP配合工作。
在这篇文章中我将会介绍如何用PHP实现一个可以运行内置Web框架的HTTP服务器。先从如何实现一个Socket服务器接收网络请求开始, 探究如何解析HTTP协议,处理HTTP请求和返回响应。接下来结合多进程拓展实现一个多进程的服务模型, 再结合Libevent实现一个事件驱动的非阻塞网络调用。为了限制请求的数量,实现对资源的合理分配和使用,我们会建立一个工作的进程池来处理请求队列。最后我会使用Symfony/Console编写一个命令行程序和守护进程用来管理HTTP Server。
需要注意的是这个项目仅仅作为PHP Web框架的容器服务器。为了简化开发,这个服务器不会支持完整的HTTP协议,所以会使用Nginx作为反向代理服务器来支持完整的HTTP协议。
一个简单的Socket Server (套接字服务器)
解析HTTP协议
基于Pcntl拓展的多进程工作模型
及时关闭连接
使用libevent事件驱动
多进程工作模型拓展:工作进程池
编写守护进程和命令行参数
使用Nginx作为反向代理服务器
后记
如果你对使用PHP进行网络编程感兴趣,我推荐Workman和Swoole这两个项目。 前者是使用纯PHP代码实现的网络库,后者是 韩天峰 开发的PHP拓展。二者都支持开发Socket/WebSocket/Http Server。
更多分享,敬请关注
本文来源网络,侵立删!
领取专属 10元无门槛券
私享最新 技术干货