使用PHP编写HTTP服务器

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。

感谢你的阅读!本文系原创文章,出自 行间小筑 并遵循 自由转载-非商用-非衍生-保持署名(创意共享3.0许可证),转载时请注明出处和本文链接:https://panlatent.com/archives/use-php-compose-http-sever

发表评论