【CNMP系列】PHP配置和调优

本文详细介绍了PHP-FPM的配置方法及优化技巧,包括进程池管理、内存配置、Zend OPcache配置等内容,并提供了实际场景下的配置建议。

上一节我们说到PHP5.6.30在CentOS7.0下的整个安装过程,http://www.cnblogs.com/riverdubu/p/6428226.html

今天我来和大家讲解一下PHP-FPM安装的一些配置和调优。

PHP-FPM配置相关

再来解释下php-fpm的概念,PHP-FPM(PHP FastCGI Process Manager的简称,意思是“PHP FastCGI进程管理器”),是用于管理PHP进程池的软件,用于接收和处理来自Web服务器(例如nginx)的请求。

PHP-FPM软件会创建一个主进程(通常以操作系统中根用户的身份运行),控制何时以及如何把HTTP请求转发给一个或多个子进程处理。

这个master process就是PHP-FPM的主进程。

PHP-FPM主进程还控制着什么时候创建和销毁子进程,PHP-FPM进程池中的每一个进程存在的时间都比单个HTTP请求长。因为这章不是讲进程的,所以,进程这个概念不在此赘述,不懂的朋友可以去百度好好了解下。

PHP-FPM的配置文件在/usr/local/php/etc/里面。打开该文件。

vim /usr/local/php/etc/php-fpm.conf

可以看到很多注释掉的代码段(这里的分号是注释符)。vim快速查找单个单词的方式,在非编辑模式,按'/'这个符号,输入你想要查找的单词,然后按'n'字母跳到下一个。

全局配置相关

先来解释一下这两个配置参数。

emergency_restart_threshold:在指定的一段时间内,如果失效的PHP-FPM子进程超过这个值,PHP-FPM子进程就重启。emergency_restart_interval这个值就是指定的一段时间。这是PHP-FPM进程的基本安全保障,建议设置成如下值。

关键配置相关

各个PHP-FPM进程池都以指定的操作系统用户和用户组的身份运行,个人建议以单独的非根用户身份运行各个PHP-FPM进程池,这样你在命令行中使用top的时候便于识别每个PHP的应用的PHP-FPM进程池。

PHP-FPM进程池监听的IP地址和端口号。

拥有这个PHP-FPM进程池中子进程的系统用户(组),要把这个设置的值设置成运行PHP应用的非根用户的用户(组)名。

可以向这个PHP-FPM进程池发送请求的IP地址(一个或多个),为了安全,我是将其设为本机或者注释掉,如果你有需求,可以打开。

PHP-FPM进程池中最多能有多少进程。具体的进程数按照自己分配给php服务的内存决定,具体算法如下。

一共分配给PHP多少内存?我在阿里云申请了一台2G内存的VPS,除去分配给Nginx,MySql,Memcache的内存,我觉得给PHP分配个512MB差不多。

单个PHP进程平均消耗多少内存?PHP进程一般消耗5~20MB的内存,上传文件,图像处理等另算。

能负担起多少个PHP-FPM进程?做个简单的除法,我发现此VPS能够承担30个左右的进程,如果你觉得这样不够,可以考虑增加服务器的内存数量。

PHP-FPM启动时PHP-FPM进程池中立即可用的进程数。保持默认值即可,这么做是为了保证有2个进程,等待请求进入,不让PHP应用的头几个HTTP请求等待PHP-FPM初始化进程池中的进程。

PHP应用空闲时PHP-FPM进程池中可以存在的进程数量最小值/最大值。

PHP-FPM进程池中每个进程最多能处理的HTTP请求数量,还是各位根据需求计算出来的。

日志,各位可以配置下,用于记录处理时间超过n秒的HTTP请求信息,可以找出PHP慢的原因。

上面的n秒,一般设为5s。

保存退出,重启PHP-FPM服务。

#service php-fpm restart

可能没有日志文件,我们新建一个即可。

#mkdir -p /usr/local/php/log/
#touch /usr/local/php/log/www.log.slow

PHP调优原理

我们来分析一下每次HTTP请求时通常是如何处理PHP脚本的。

首先,nginx把http请求转发给PHP-FPM,PHP-FPM再把请求交给某个PHP子进程处理。

PHP进程找到相应的PHP脚本后,读取脚本,把PHP脚本编译成操作码(或字节码)格式,然后执行编译得到操作码,生成响应。

最后,把HTTP响应发给nginx,nginx再把响应发给HTTP客户端。

PHP调优计划

PHP解释器在php.ini文件中配置和调优,首先,我们得找到php.ini文件的所在地。

我们回想一下昨天打开的那个phpinfo.php文件,获取到php的一些信息,心细的朋友可能在里面就找到了php.ini的位置。

打开该文件。

#vim /usr/local/php/lib/php.ini

内存配置

比较科学的默认值,如果网站比较大,可以考虑到512M,如果只是一个个人网站,这个足够,或者降到64M即可。

Zend OPcache配置

字节码缓存不是PHP的新特性,很多独立的扩展可以实现缓存,例如APC、eAccelerator、XCache。从PHP 5.5.0开始,PHP内置了字节码缓存功能,名为Zend OPcache。

Zend OPcache会自动在内存中缓存预先编译好的PHP字节码,如果缓存了某个文件的字节码,就执行对应的字节码。PHP是解释型的语言,PHP解释器执行PHP脚本的时候会解析PHP脚本代码,把PHP代码编译成一系列Zend操作码,然后执行字节码。就和C汇编转机器码一样的,缓存的是可执行的字节码。

如果php.ini文件中的opcache.validate_timestamps指令的值为0,Zend OPcache就会察觉不到PHP脚本的变化,我们必须要手动去清空Zend OPcache缓存的字节码,让它发现PHP文件的变动。

下面推荐一组Zend OPcache的配置:

只是推荐,针对每个打开的属性,我下面做详解。

首先,需要打开opcache。opcache.enable=1

; Determines if Zend OPCache is enabled for the CLI version of PHP
;opcache.enable_cli=0

; The OPcache shared memory storage size.
opcache.memory_consumption=64

为操作码缓存分配的内存量。

; The amount of memory for interned strings in Mbytes.
opcache.interned_strings_buffer=16

用来存储驻留字符串的内存量,何为驻留字符串,PHP解释器在背后会找到相同字符串的多个实例,把这个字符串保存在内存中,如果再次使用相同的字符串,PHP解释器就会使用指针这么做能节省内存。

; The maximum number of keys (scripts) in the OPcache hash table.
; Only numbers between 200 and 100000 are allowed.
opcache.max_accelerated_files=4000

操作码缓存中最多能存储多少个PHP脚本。

; When disabled, you must reset the OPcache manually or restart the
; webserver for changes to the filesystem to take effect.
opcache.validate_timestamps=1

这个值设置为1时,经过一段时间后PHP会检查PHP脚本的内容是否有变化。

; How often (in seconds) to check file timestamps for changes to the shared
; memory storage allocation. ("1" means validate once per second, but only
; once per request. "0" means always validate)
opcache.revalidate_freq=0

设置PHP多久(时间是秒)检查一次PHP脚本的内容是否有变化。这么设置会在每次请求时都重新验证PHP文件,适用于线上生产环境。

; If enabled, a fast shutdown sequence is used for the accelerated code
opcache.fast_shutdown=1

这么设置能让操作码使用更快的停机过程,把对象析构和内存释放交给Zend Engine的内存管理器完成。

最长执行时间

默认最长执行时间为30秒,PHP进程运行到30秒,那还不把Web应用的访问者等死啊,所以我们不能让访问者等这么长时间,设置为5即可。如果要处理长时间的运行任务,放到单独的进程中运行即可。

会话处理

如果大家对Memcache和Redis比较熟悉,可以将这里面的session存储换成这两种内存存储,速度快,也便于以后大小的伸缩。

好的,关于PHP的配置和优化就先说到这里,如果各位需要对文件上传、缓冲设置以及其他的相关设置,可以参见php.net,在官网上可以学到更多,还有什么不明白的,可以在评论区留言评论,我会一一给大家解答。^_^

注1

zend opcache的打开还需要新增一个配置属性,在刚才的opcache区间内加入这句

zend_extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/opcache.so

重启php-fpm。重启Nginx。即可在phpinfo里看到opcache的相关信息。

 

基于NSGA-III算法求解微电网多目标度研究(Matlab代码实现)内容概要:本文围绕基于NSGA-III算法的微电网多目标度展开研究,重点介绍了如何利用该先进多目标进化算法解决微电网系统中多个相互冲突的目标(如运行成本最小化、碳排放最低、供电可靠性最高等)的协同化问题。文中结合Matlab代码实现,详细阐述了NSGA-III算法的基本原理、在微电网度模型中的建模过程、约束条件处理、目标函数设计以及仿真结果分析,展示了其相较于传统化方法在求解高维、非线性、多目标问题上的越性。同时,文档还提供了丰富的相关研究案例技术支持背景,涵盖电力系统化、智能算法应用及Matlab仿真等多个方面。; 适合人群:具备一定电力系统基础知识Matlab编程能力的研究生、科研人员及从事能源化领域的工程技术人员;尤其适合正在进行微电网度、多目标化算法研究或撰写相关论文的研究者。; 使用场景及目标:①掌握NSGA-III算法的核心思想及其在复杂能源系统化中的应用方式;②学习如何构建微电网多目标度模型并利用Matlab进行仿真求解;③为科研项目、毕业论文或实际工程提供算法实现参考技术支撑。; 阅读建议:建议读者结合文中提供的Matlab代码实例,逐步试运行并深入理解算法流程与模型构建细节,同时可参考文档中列出的其他化案例进行横向对比学习,以提升综合应用能力。
内容概要:本文深入探讨了YOLOv11目标检测模型在计算机竞赛中的应用价值,介绍了其作为实时目标检测前沿技术的核心原理,即通过单次前向传播实现目标分类与定位,具备高精度与高速度的势。文章阐述了YOLOv11基于深度学习卷积神经网络的特征提取机制,并重点分析了在竞赛中提升性能的关键技巧,包括数据集精细化管理、针对性数据增强策略(如光照整)、模型结构选择与学习率化。结合自动驾驶、医疗影像分析环境监测等实际应用场景,展示了其广泛适用性。并通过一段完整的代码实例,详细解析了模型加载、图像预处理、推理、后处理及结果可视化的全流程。最后展望了YOLOv11未来在硬件加速、多模态融合及模型可解释性方面的演进趋势。; 适合人群:具备一定深度学习基础,参与计算机视觉相关竞赛的高校学生、研究人员及算法工程师;熟悉PythonPyTorch框架的技术人员。; 使用场景及目标:①掌握YOLOv11在各类计算机竞赛中的实际部署方法;②学习如何针对特定任务化模型性能;③理解从数据处理到结果可视化的完整目标检测流程;④为参赛项目提供高效、可靠的解决方案。; 阅读建议:建议结合代码实例动手实践,复现检测流程,并根据具体竞赛需求整数据增强策略与模型参数,同时关注模型轻量化与推理效率的平衡。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值