php.ini 配置参数详解及优化

php解释器在php.ini文件中配置和调优。

内存

memory_limit = 128

用于设定单个php进程可以使用的系统内存的最大值。

默认值是128M,这对大多数中小型php应用来说或许合适。可是如果运行的是微型php应用,可以降低这个值,例如设为64M,节省系统资源。

zend opcahce

确定要分配多少内存后,我们会配置php的zend opcache扩展。这个扩展用于缓存操作码。

每次http请求时,首先nginx把http请求转发给php-fpm,php-fpm再把请求交给某个php子进程处理。php进程找到相应的php脚本后,读取脚本,把php脚本编译成操作码(或字节码)格式,然后执行编译得到的操作码,生成响应。最后,把http响应发给nginx,nginx再把响应发给http客户端。这样的话每次http请求都要消耗很多资源。

我们可以缓存编译每个http脚本得到的操作码,加速这个处理过程。缓存后,我们可以从缓存中直接读取并执行预先编译好的操作码,不用每次处理http请求时都查找、读取和编译php脚本。

优化zend opcahce扩展的设置

opcache.memory_consumption=64 //php7默认是64

opcache.interned_strings_buffer=16 //php7默认是4

opcache.max_accelerated_files=4000 //php7默认是2000

opcache.validate_timestamps=1 //php7默认是1

opcache.revalidate_freq=0 //php7默认是2

opcache.fast_shutdown=1 //php7默认是0

opcache.memory_consumption=64

为操作码缓存分配的内存量(单位MB)。分配的内存量应该够保存应用中所有php脚本编译得到的操作码。如果是小型的php应用,脚本数较少,可以设为较低的值,例如16M

opcache.interned_strings_buffer=16

用来存储驻留字符串的内存量(单位MB)。

php解释器在背后会找到相同字符串的多个实例,把这个字符串保存在内存中,如果再次使用相同的字符串,php解释器会使用指针,这样能节省内存。默认情况下,php驻留的字符串会隔离在各个php进程中。这个设置能让php-fpm进程池中的所有进程把驻留字符串存储到共享的缓冲区中,以便在php-fpm进程池中的多个进程之间引用驻留字符串。这样能节省内存。这个的默认值是4M,可以设为16M

opcache.max_accelerated_files=4000

操作码缓存中最多能存储多少个php脚本。这个设置的值可以在200-100000之间的任何数。这个值一定要比php应用中的文件数量大。

opcache.validate_timestamps=1

这个值设为1时,经过一段时间后php会检查php脚本的内容是否变化。检查的时间间隔由opcache.revalidate_freq设置指定。如果这个设置的值为0,php不会检查php脚本的内容是否变化,我们必须手动清除缓存的操作码。建议开发环境中设为1,生产环境设为0

opcache.revalidate_freq=0

这个设置多久(单位是秒)检查一次php脚本的内容是否变化。缓存的好处是不用每次都重新编译php脚本。这个设置用于确定在多长时间内认为操作码是新的。 在这段时间之后,php会检查php脚本的内容是否有变化。如果有变化,php会重新编译脚本,再次缓存。

opcache.fast_shutdown=1

这个设置能让操作码使用更快的停机步骤,把对象析构和内存释放交给zend Enginer的内存管理器去完成。

文件上传

这个应该都懂

file_uploads = On

upload_max_filesize = 2M

max_file_uploads = 20

如果需要上传更大的文件,需要调整nginx配置中的client_max_body_size参数

最长执行时间

这个参数用于设定单个php进程在终止之前最长可以运行多少时间。

max_execution_time = 5 //默认是30

在php脚本中可以调用set_time_limit()函数来覆盖这个值。

如果需要运行更长的时间,则要在单独的进程中运行。

比如要生成报告,把结果制作成pdf文件,这个任务大概需要10分钟完成。我们要单独编译一个php文件,为create.php

<?php

exec('echo "create.php"|at now');

echo 'report pending...';

?>

处理会话

session.save_handle = 'memcached'

session.save_path = '127.0.0.1:11211'

缓存输出

如果在较少的块中发送更多的数据,而不是在较多的块中发送较少的数据,那么网络的效率会更多。也就是说,在较少的片段中把内容传递给访问者的浏览器,能减少http请求总数。

因此,我们要让php缓冲输出。默认情况下,php已经启用了输出缓冲功能。php缓冲4096字节的输出之后才会把其中的内容发送给web服务器。推荐设置

output_buffering = 4096

implicit_flush = false

真实路径缓存

php会缓存应用使用的真是路径,这样每次包含或导入文件时就无需不断搜素包含路径了。这个缓存叫真实缓存路径。如果运行的是大型php文件(Drupal和Composer组件等),使用了大量文件,增加php真实路径缓存的大小就能得到更好的性能。

真实路径缓存的默认大小是16K。这个缓存所需要的准确大小不容易确定,不过可以使用一个小技巧。首先,增加真实路径缓存的大小,设为特别大的值,例如256K。然后在这个php脚本的末尾加上print_r(realpath_cache_size());输出真实路径缓存的真正大小。最后,把真实路径缓存的大小改为这个真正的值。我们可以在php.ini文件中设置真实路径缓存的大小:

realpath_cache_size = 64K