服务器程序源代码分析之二:php-fpm

php作为排名top2 互联网开发工具,非常流行,可以参考:中国最大的25个网站采用技术选型方案

php这个名称实际上有两层含义

  1. 广义的php 是指用后缀名为.php的脚本,就是程序员编写的php代码:
  2. 狭义的php 是指php部署程序,比如说 lnmp,这个php 就是 php-fpm

php-fpm是什么

直接定义:

php-fpm是一个内置php解析器,采用prefork+异步IO 模型的高性能服务器程序

php-fpm从php5.3.3开始已经进入到php源代码包,之前是作为patch存在的

很少人会去读php本身源代码,我6年前解决php内存泄露问题的时候做了些研究,最近再查看了一番,发现php的开发者很有诚意,这是一款非常出色的服务器软件,支持如下

  1. php-fpm 采用 prefork的方式 (listen同一个地址,然后fork出若干子进程)
  2. 在子进程里面,采用异步IO处理客户端请求
  3. event模型可以在php-fpm.conf中配置
; Specify the event mechanism FPM will use. The following 
is available:
; - select     (any POSIX os)
; - poll       (any POSIX os)
; - epoll      (linux >= 2.5.44)
; - kqueue     (FreeBSD >= 4.1, OpenBSD >= 2.9, NetBSD >= 2.0)
; - /dev/poll  (Solaris >= 7)
; - port       (Solaris >= 10)
; Default Value: not set (auto detection)
;events.mechanism = epoll

在linux服务器上,如果不设置events.mechanism,那么默认就是采用epoll,所以

php-fpm的IO模型&并发处理能力和nginx是完全一致

nginx以性能卓越闻名,大部分程序员都认为php效率低下,看了源代码,才知道这是传奇啊

在高性能部署的时候,大家往往会针对性的优化nginx 。我自己之前部署php程序也犯了错误,8G内存的server,php-fpm的max children都会设置128+,现在看来太多了,参考nginx的部署:

nginx的worker_process一般设置为 2 * cpu-core

php-fpm配置为 3倍 cpu core number就可以了

php-fpm稳定性比nginx稍差 这是因为php-fpm内置了一个php解析器,php-fpm进程就和php程序捆绑了,如果php脚本写的不好,有死循环或者阻塞在某个远端资源上,会拖累加载它的php-fpm进程

而nginx和后端应用服务器之间通过网络连接,可以设置timeout,不容易堵死的

php-fpm的fastcgi是短连接 我原以为是长连接的,看了代码才知道也是短连接,处理一个request就关闭掉

php-fpm接口采用fastcgi 非常遗憾,php-fpm和fastcgi完全绑定了,无法独立使用 。只能部署在支持http-fcgi协议转换程序背后(nginx)。其实可以考虑在php-fpm代码包里面引入http协议支持,这样php-fpm可以独立运行,让nodejs无话可说

php-fpm等同于OpenResty OpenResty是一个国人开发的nginx模块,就是在nginx引入lua解释器. 实际上,它和php-fpm的唯一差别就是一个采用php语法,一个用lua,所以OpenResty要作为nginx增强包使用还可以,要选择它作为一个主要编程工具,没有任何必要

从架构上来说,php-fpm已经做到最好,超过大多数 python部署工具,我再也不黑它了

原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2014-10-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android群英传

Siri 帮我开灯

1122
来自专栏技术翻译

为微服务架构编写端到端测试

微服务架构的一个主要方面是应用程序形成为松散耦合的服务的集合,每个服务可以独立地部署并且通过某种轻型协议相互通信。

2161
来自专栏FreeBuf

没有身份凭证的情况下,攻击者就能登录FreeRADIUS

近期,来自卢森堡RESTENA的安全研究专家Stefan Winter在当前全球最流行的radius服务器中发现了一个TLS认证绕过漏洞。 ? FreeRADI...

2899
来自专栏Fundebug

Web应用架构入门之11个基本要素

译者: 读完这篇博客,你就可以回答一个经典的面试题:当你访问Google时,到底发生了什么?

1373
来自专栏影子

springMVC项目国际化(i18n)实现方法

3599
来自专栏FreeBuf

年度盘点 | 安全测试者偏爱的安全测试工具

国外网站Concise Courses总结了安全测试者常用且好用的安全测试工具,本文摘录并分类整理列举一二,供安全从业者与爱好者参考。 ? 无线类 Metasp...

5627
来自专栏北京马哥教育

推荐!国外程序员整理的系统管理员资源大全(一)

备份软件 Amanda -客户端-服务器模型备份工具 Bacula - 另一个客户端-服务器模型备份工具 Backupninja -轻量级,可扩展的元数据备份系...

52510
来自专栏从零开始的linux

web

Web网络服务也叫 WWW(World Wide Web),一般是指能够让用户通过浏览器访问到互联网中文档等资源的服务。目前提供WEB网络服务的程序Ap...

3316
来自专栏ThoughtWorks

Kubernetes救援 - 教你如何从新技术的坑里爬出来(下) | TW洞见

今日洞见 文章作者/配图来自ThoughtWorks:佟达。 本文所有内容,包括文字、图片和音视频资料,版权均属ThoughtWorks公司所有,任何媒体、网站...

3818
来自专栏大魏分享(微信公众号:david-share)

从API源码看API经济 | 从开发角度看应用架构13

https://yq.aliyun.com/articles/497806?utm_content=m_42865

2252

扫码关注云+社区

领取腾讯云代金券