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

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

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

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

直接定义:

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

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

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

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

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

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

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部署工具,我再也不黑它了

服务器IP用:

echo(gethostbyname($SERVER_NAME))

客户端IP用下面函数

function iptype1 () {

if (getenv("HTTP_CLIENT_IP")) {

return

getenv("HTTP_CLIENT_IP")

}

else {

return "none"

}

}

function iptype2 () {

if (getenv("HTTP_X_FORWARDED_FOR")) {

return getenv("HTTP_X_FORWARDED_FOR")

}

else {

return "none"

}

}

function iptype3 () {

if (getenv("REMOTE_ADDR")) {

return getenv("REMOTE_ADDR")

}

else {

return "none"

}

}

function ip() {

$ip1 = iptype1()

$ip2 = iptype2()

$ip3

= iptype3()

if (isset($ip1) &&$ip1 != "none" &&$ip1 !=

"unknown") {

return $ip1

}

elseif (isset($ip2) &&$ip2

!= "none" &&$ip2 != "unknown") {

return $ip2

}

elseif

(isset($ip3) &&$ip3 != "none" &&$ip3 != "unknown") {

return $ip3

}

else {

return "none"

}

}

使用时,直接调用ip()

从图上可以看到,PHP实现了一个典型的动态语言执行过程:拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令 (opcodes),然后ZEND虚拟机顺次执行这些指令完成操作。PHP本身是用C实现的,因此最终调用的也都是C的函数,实际上,我们可以把PHP看 做是一个C开发的软件。

PHP的执行的核心是翻译出来的一条一条指令,也即opcode。

Opcode是PHP程序执行的最基本单位。一个opcode由两个参数(op1,op2)、返回值和处理函数组成。PHP程序最终被翻译为一组opcode处理函数的顺序执行。

常见的几个处理函数:

1    ZEND_ASSIGN_SPEC_CV_CV_HANDLER : 变量分配 ($a=$b)  

2    ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER:函数调用  

3    ZEND_CONCAT_SPEC_CV_CV_HANDLER:字符串拼接 $a.$b  

4    ZEND_ADD_SPEC_CV_CONST_HANDLER: 加法运算 $a+2  

5    ZEND_IS_EQUAL_SPEC_CV_CONST:判断相等 $a==1  

6    ZEND_IS_IDENTICAL_SPEC_CV_CONST:判断相等 $a===1  


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/489760.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-06-13
下一篇2023-06-13

发表评论

登录后才能评论

评论列表(0条)

    保存