PHP开发web程序的两种模式

本文适合对PHP web开发比较感兴趣的同学阅读,需要具备一定的web后台开发经验。

一、背景

从执行流程上来看,所有程序可以分为同步程序和异步程序。众所周知,同步程序流程清晰,开发友好,容易上手,相比之下异步程序的优点在于程序并发度高,资源能够得到充分利用。于是出现了一些基于协程调度的框架,兼具同步程序和异步程序的优点。对应到PHP领域,除了传统的LAMP/LNMP同步开发模式,还出现了类似swoole的异步协程开发模式。本文通过对两种开发模式进行比较,旨在说明二者实现上的异同,供广大PHP程序员参考。

二、LAMP/LNMP

一直以来,PHP web开发采用LAMP/LNMP架构,即Linux、Nginx,Mysql和PHP。搭建的环境大同小异,大致结构为:

PHP开发web程序的两种模式_第1张图片

当请求进入时,web server将请求转交给PHP-FPM,PHP-FPM是一个进程池架构的FastCGI服务,内置PHP解释器。FPM负责解释执行PHP文件生成响应,最终返回给web server,展现至前端。PHP文件中实现了许多业务逻辑,包括Mysql和Nosql的访问,调用第三方应用等等。

由图可见,从请求到响应,整个处理流程十分清晰,层次结构也很明显,大致分为接入层,逻辑层和数据访问层。但是这个架构的缺点也很明显,主要包括:

  • FPM进程池中进程数目有限,在高并发场景下处理能力可能会受进程数目和系统其他资源的限制

  • 当后端PHP程序长时间阻塞时,会挂起整个PHP-FPM进程

  • 每次请求处理的过程都意味着一次PHP文件解析,环境设置等不必要的耗时操作

  • PHP进程处理完即销毁,无法在PHP程序中使用连接池等技术实现性能优化

  • ......

针对上述问题,LAMP/LNMP架构做了许多优化和调整,比如:

  • 设置超时时间防止FPM假死

  • 利用Opcache扩展避免PHP文件的重复解析和加载

  • 采用本地代理的方式实现降低建立连接的开销

  • ......

三、Swoole

针对LAMP/LNMP架构的问题,swoole从PHP扩展出发,解决了上述问题,其采用的进程模型为:


Swoole底层使用多进程架构,Master-Manager-Worker。

  • Master进程内置多个Reactor线程进行网络收发包,当收到完整的请求之后,其将请求转交给Worker进程执行业务逻辑。

  • Manager进程由Master进程派生而成,主要负责Worker进程的创建和销毁类工作。

  • Worker进程执行PHP业务逻辑代码,生成响应后发送至Master进程的Reactor线程,最终展现至前端。

  • 进程模型中还包括taskWorker,主要执行一些额外的耗时task任务等。

相比于LAMP/LNMP,Swoole进程模型最大的特点在于其多线程Reactor模式处理网络请求,使得其能轻松应对C10k连接。除此之外的优点还包括:

  • 全异步非阻塞,占用资源开销小,程序执行效率高

  • 程序运行只解析加载一次PHP文件,避免每次请求的重复加载

  • 进程常驻,使得连接池和请求之间信息传递等的实现成为可能

  • ......

Swoole在扩展层面实现异步非阻塞操作,提供给PHP回调的操作接口。由于回调写法嵌套较深,逻辑混乱,现有的基于Swoole的PHP框架多数采用yield协程调度的方式实现,这样就可以用同步的代码写法来达到异步的效果,典型实现如ZanPHP框架。

当然,协程的写法也并不是没有代价,开发者需要更多地了解一些底层的原理实现,相比LAMP/LNMP来说对于开发者的门槛较高。

四、总结

综合以上区别,笔者建议,在简单的http server开发场景下,优先采用LAMP/LNMP架构,更加专注于业务逻辑实现。在高并发或对于性能比较关注的场景,或者需要实现类似tcp server,RPC服务,SOA服务等情形下,建议使用基于swoole的协程调度框架,如ZanPHP等。

想要获取最新技术文章?欢迎订阅微信公众号----软件编程之路,鼓励作者持续写作。

PHP开发web程序的两种模式_第2张图片


你可能感兴趣的:(php)