一 CGI
cgi工作模式('fork-and-execute'): 每有一个用户请求到来,首'先fork子进程',然后'处理请求',处理完请求之后'就结束'这个子进程,后续'其它请求'也是这样'一个流程'
更具体: 每一次web请求都会有'启动'和'退出'过程
cgi的好处:就是完全'独立于任何服务器',仅仅是做为'中间分子';例如:提供'接口'给nginx和php
cgi应用场景: '动态(dynamic)'生成'网页'
缺点: cgi一直背负'性能低下'、'高资源消耗'的恶名
++++++++++++'处理流程'++++++++++++
1)客户端'(浏览器)' -->发送请求('/index.php') --> web服务器('nginx'、'apache')
2)Web服务器('nginx')接收'index.php'请求后;首先对'请求参数'进行'解析','判断'是'cgi脚本'请求,而web'服务器自身'不能'直接处理'
3)Web服务器'进而'会启动'对应的 CGI 程序'-->这里就是'PHP的解析器',PHP解析器会'解析php.ini文件','初始化'执行环境,然后'处理请求'
4)该'CGI对应的脚本解释器-->进程'处理完之后,会以'STDOUT的形式-->规定CGI规定的格式'返回给'WEB服务器'
5)WEB服务器会'封装',以'html形式'响应给'客户端-->浏览器'
CGI程序: 可以理解为是'运行在Web服务器上'的一段'物理程序',方便WEB服务器在'识别出是CGI请求之后','调用'该CGI程序'fork子进程'进行处理
(1)FastCGI是什么?
FastCGI是:'交互程序'与'Web服务器'通用的'协议接口',是早期'CGI'(Common Gateway Interface)的一个'变种'
'变'种: 体现在不是以CGI的'fork-and-execute'方式处理请求,而是系统的'常驻进程'持续不断的处理请求
(2)PHP处理器
++++++++++什么是'PHP处理器'(PHP handlers)?++++++++++
1)首先需要'牢记':任何一种'Web服务器'(Apache、Nginx等)都是'被设计成'处理'html、图片等静态资源的'
2)Web服务器'自身并不能解'释任何'动态脚本'(PHP、Python、Perl、Lua)
3)PHP处理器就是用来'解释Web应用中的PHP代码',并将它'解释'为HTML或其他'静态资源',然后将解析的结果'传给Web服务器',最后再由'Web服务器发送'给用户
4)大多数的'Web服务器'都'不能解析PHP代码',因此它需要一个'能解析PHP代码的程序',这就是PHP处理器
+++++++'apache和nginx'常见的'PHP处理器'+++++++
(1)PHP最常用的方式是以'模块的方式(mod_php)'运行在Apache中,也是Apache运行PHP的'默认'方式但
(2)Nginx中'使用'的是'PHP-FPM'
三 PHP-FPM
(2)PHP-FPM是什么
0)全称'FastCGI Process Manager'-->'FastCGI进程管理器'
1)PHP-FPM是一个'实现了Fastcgi的程序',被'PHP官方收了'
2)PHP的解释器是'php-cgi',php-cgi只是个'CGI程序',他自己本身'only'只能'解析请求','返回结果'给we服务器,'不会进程管理'
3)所以就'出现了'一些'能够调度php-cgi进程'的'程序',这就是PHP-FPM
其它调度'php-cgi'进程的程序: 由'lighthttpd'分离出来的'spawn-fcgi'
+++++++++++++'补充理解'+++++++++++++
(1)fastcgi是一个'接口协议',php-fpm'实现了'这个协议
(2)php-fpm的'管理对象'是php-cgi
备注: 'php-cgi'也是fastcgi的'进程管理器',只是有缺点,因此有了'php-fpm'
(3) php-cgi与php-fpm的联系(为什么要有php-fpm)
相同点: php-cgi与php-fpm一样也是'一个fastcgi进程管理器'
差异性: 一旦'修改了php.ini'配置文件后,php-cgi进程'没办法平滑重启',而'php-fpm'可以
php-cgi的'问题'在于
1、php-cgi变更php.ini配置后'需重启'php-cgi才能让'新的php-ini生效','不可以'平滑重启
2、直接杀死php-cgi进程,php就不能运行了,'PHP-FPM'和'Spawn-FCGI'就没有这个问题,守护进程会'平滑'重新生成'新的子进程'
php-fpm的'处理机制':是'新的worker'用'新的配置','已经存在的旧worker'处理完手上的活就'可以歇着了',通过这种机制来'平滑过度'
四 php-fpm的配置文件
前提条件: 假设rpm安装了'php74'
(1)主配置文件解读
+++++++++++++'主配置文件'+++++++++++++
/etc/opt/remi/php74/php-fpm.conf
1)PHP-FPM是一个'PHP FastCGI管理器'
2)'php-fpm.conf'配置文件用于'控制PHP-FPM管理进程'的'相关参数'
'参数': 工作(worker)'子进程的数量'、'运行权限'、监听端口、'慢请求'等等
PHP-FPM'配置文件'为 php-fpm.conf,其'语法类似' php.ini
① 全局配置
日志级别: alert(必须立即处理), error(错误情况), warning(警告情况), 'notice(一般重要信息)', debug(调试信息). 默认: notice.
emergency_restart_threshold = 60
emergency_restart_interval = 60s
表示在'emergency_restart_interval'所设'值内',出现SIGSEGV或者SIGBUS错误的'php-cgi进程数如果超过' emergency_restart_threshold个,php-fpm就会'优雅重启'
备注: 这两个选项一般'保持默认值'
(2)子配置文件解读
+++++++++++++'子配置文件'+++++++++++++
/etc/opt/remi/php74/php-fpm.d/www.conf
'更准确':/etc/opt/remi/php74/php-fpm.d/*.conf
② 进程池
通过'监听不同的端口'和'不同管理选择'可以定义'多个'不同的'子进程池',进程池被用与记录和统计,对于fpm能够'处理进程池数目'并'没有限制'
'解读'该配置文件
重点: '进程池管理器'如何'控制子进程'的'数量'
实验现象-->'idle空闲的子进程数目:5'
需求1: 显示'基本'status页面
http://www.foo.bar/status -->默认'text/plain'
http://www.foo.bar/status?json
http://www.foo.bar/status?html
http://www.foo.bar/status?xml
需求2: 显示'更完整'的status页面
http://www.foo.bar/status?full
http://www.foo.bar/status?json&full
http://www.foo.bar/status?html&full
http://www.foo.bar/status?xml&full
备注: 各个'参数的含义'看配置文件的说明
(1) 我们可以使用php-fpm.conf'配置慢日志'
slowlog = /usr/local/var/log/php-fpm.log.slow
request_slowlog_timeout = 5s
效果: 当某个'请求的时间超过了5秒',就会在'慢日志中记录'相应的记录
注意: 上面的时间5s,'不能忽略了单位',相应的还有其他单位,m分,h时
(2) '解读信息'
php-fpm慢日志会记录下'进程号'、'脚本名称'、'具体哪个文件哪行代码'的'哪个函数'执行时间过长:
[20-Nov-2019 11:30:38] [pool www] pid 11876
script_filename = /var/www/ceshi/c.php
[0xb70fb88c] sleep() /var/www/ceshi/c.php:2
解读: 通过日志,我们就可以知道'第2行的sleep 函数有'点问题,这样我们就能'追踪问题'了,'debug'及'异常排查'神器
1)'php.ini 文件'的 'memory_limit'
2)'php-fpm.conf 子文件 www.conf'的 php_admin_value[memory_limit] = 128 --> 该'www-->线程池'默认的'内存限制'
'/etc/opt/remi/php74/php-fpm.d/www.conf'
备注: 打开了'phpinfo()',结果显示memory_limit的值是'php-fpm.conf'中的,不是'php.ini'
说明: reload'也可生效'
说明: '平均'每个php-fpm子进程内存'大约占' = 进程池'总内存' / 子进程'数目'
五 配置不合理导致的问题
(1)常见错误及解决办法整理
(2)报错原因
原因: 由于将'[www]池中'user和group'注释'了
六 PHP的补充知识
(1) 为什么PHP不适合'密集型(大数据量)运算'的场景
PHP的'语言特性'决定PHP'不适合'做大数据量运算,PHP语言由C写的,'PHP处于C基础之上',PHP的所有运算处理流程'需要转化为C语言',PHP和C想比'性能肯定输了',并且PHP语言还有一些'环境问题'、'语言特性',相比于C而言的'开销要大很多'
(2) PHP'适合场景'
适合衔接WebServer与后端服务,WebServer来了请求交给PHP,PHP'做一些校验'、一些'初始化数据处理',将'请求转发'交给后端,'等待后台响应'
备注: '后端'可能是'缓存、DB等'其他业务,后端响应之后,PHP再作为纽带,将信息传递给WebServer,这是PHP擅长的。
备注: PHP也擅长做'UI呈现',也就是'配合模板引擎'做'模板输出',其实就是一些;字符串文本处理'