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

发表回复