PHP优化相关知识
很多时候PHP为什么运行效率低,并发不高,其实很多时候都没有对PHP进行优化造成的。优化后PHP的性能能有非常大的提升。本文我们只针对相关优化进行说明,不会有太多的实验数据展示,所以当大家用到了这些优化方案的时候,可以自行去看下性能到底提升了多少,并验证这些优化点是否有实质性的作用。
PHP优化可以从以下几个方向进行:
- 1、首先是php-fpm的工作进程的运行方式;
- 2、OpCache是否开启;
- 3、代码优化;
- 4、操作系统优化;
一、PHP的php-fpm工作进程的运行方式
首先大家可以进入到php-fpm的配置文件中,有几个相关配置:
pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 pm.process_idle_timeout = 10s;
php-fpm的运行方式有三种:static, dynamic, ondemand
pm = static:如果设置为静态,那么始终保持一个固定数量的子进程,那么子进程的数量只受pm.max_children控制。一般这个不被默认,一般不推荐使用。那么何时进行使用呢?其实当访问量一直比较高的情况下,我们可以将这个设置为固定的。这样就避免了创建子进程带来的各种开销,也提高了并发量。
pm = dynamic:如果设置为动态,那么开始的生成的子进程的数量就被pm.start_servers控制,也就是最小的子进程,那么最大的子进程就受pm.max_children控制。但是还有两个其他的参数:pm.min_spare_servers和pm.max_spare_servers,这个就是表示空闲的进程最大值和最小值。如果闲置进程大于pm.max_spare_servers就会被杀死。系统默认也是选用这种动态的配置,在使用的过程中可以根据自己的服务器的配置来对这些参数进行修改。
pm = ondemand:如果设置为按需分配,它受pm.process_idle_timeout参数的控制,如果空置进程超过了多少秒后就会被杀死,服务器的内存也就下来了。如果长时间没有任何访问的时候,就只剩下master进程,遇到高峰期或者如果pm.process_idle_timeout的值太短的话,无法避免服务器频繁创建进程的问题。
从以上三种模式可以看出,其实我们最常用的是static和dynamic两种方式。如何来选择这两种方式呢?下面给两点建议:
1、访问量并发量较高的服务器建议使用static,反之使用dynamic;
2、服务器配置较高(4核8G内存以上)的建议使用static,反之使用dynamic;
对于以上的参数pm.max_children,我们到底设置多大的数呢?这个需要根据机器的内存大小来确定,还有就是一个php需要占用30M左右的内存,所以如果5个进程就需要150M。但是也别直接设置:机器的内存大小/30M,最好比这个数小点,别让php进程将内存占满。
二、PHP的OpCache加速
目前为php提供opcode缓存的扩展有很多,比如:Zend Opcache,xcache,eAccelerator,apc等等。opcache作为官方的提供,并可以在编译php的时候可以直接把这个扩展编译进去,所以我这里使用了opcache。虽然在编译的过程中加了opcache,但是要让它生效还需要配置php.ini,配置信息如下:
zend_extension="opcache.so" opcache.enable=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.revalidate_freq=60 opcache.fast_shutdown=1 opcache.enable_cli=1
以上的配置可以查看php的官方文档:运行时配置
三、PHP代码优化
php代码优化这里不做详细的介绍,作为一个PHPer,需要自己多去思考自己代码的执行效率,比如:避免循环嵌套,避免循环操作数据库,多使用php内置的函数等,大家可以百度一下,很多相关PHP程序上的优化。这里推荐一篇:PHP代码优化技巧总结
四、操作系统优化
如果在高并发的情况下,系统的文件打开数是否配置正确,查看命令如下:
[root@localhost ~]# ulimit -n 65535
如果设置数量过低,需要去设置下这个参数:vim /etc/security/limits.conf,在最后添加:
* soft nofile 65535 * hard nofile 65535 * soft nproc 65535 * hard nproc 65535
CPU和内存才是最大的限制,如果系统支撑不了,就需要对它们进行扩展。如果要承受高并发,就需要用更多的服务器做负载均衡。