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