《Modern PHP》PHP.ini 调优设置

作者: JONE 分类: PHPer 发布时间: 2018-09-11 09:50

1. 内存

php.ini文件中的memory_limit设置设定单个PHP进程可以使用的系统内存最大值.

2. Zend OPcache

这个扩展用户缓存操作码。
缓存后可以直接从缓存中读取并执行预先编译好的操作码,不用每次处理http请求时都查找、读取和编译PHP脚本。
PHP 5.5+中内置了zend OPcache扩展。

opcache.memory_consumption=64 为操作码缓存分配内存量。

opcache.interned_strings_buffer=4 用来存储驻留字符节的内存量。
驻留字符串是什么?PHP解释器在背后会找到相同字符串的多个实例,吧这个字符串保存在内存中,如果再次使用相同的字符串,PHP解释器会使用指针。这么做能节省内存。默认情况下,PHP主流的字符串会隔离在各个PHP进程中。这个设置能让PHP-FPM进城池中的所有进程把驻留字符串储存到共享的缓冲区中,以便在PHP-FPM进城池中的多个进程之间引用驻留字符串。这样能节省更多内存。这个设置默认值是4MB。不过我喜欢设为16MB。

opcache.max_accelerated_files=2000 操作码缓存中最多能出错多少个php脚本。这个设置的值可以是200到100000之间的任何数。这个值一定要比PHP应用中的文件数量大。

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

opcache.revalidate_freq=2 设置PHP多久(单位秒)检查一次PHP脚本的内容是否有变化,缓存的好处是,不用每次请求都重新编译PHP脚本。这个设置用于确定在多长时间内认为操作码缓存是新的。这这段时间之后,PHP会检查PHP脚本的内容是否有变化。如果有变化会重新编译脚本,再次缓存。仅当opcache.validate_timestamps=1时设置opcache.revalidate_freq=0 则每次请求时都重新验证PHP文件。因此在开发环境中,每次都会重新验证PHP文件(这是好事)。这个设置值生产环境中没有任何意义,因为生产环境中opcache.validate_timestamps的值始终为0。

opcache.fast_shutdown=1 这么设置能让操作码使用更快的体积歩棸,吧对象析构和内存交给Zend Engine的内存管理器完成。这个设置缺少文档,你只需要知道要把它设置为1。

3. 文件上传

你的PHP应用允许上传文件吗?如果不允许,为了增强安全性,应该禁止文件上传功能。如果允许上传文件,最好设置最大能上传的文件大小。除此之外,最好还要设置最多能同时上传多少个文件。
file_uploads = On
upload_max_filesize = 2M
max_file_uploads = 20
默认情况下PHP允许单词请求中上传20个文件,上传的每个文件最大值为2MB。

4. 最长执行时间

max_execution_time 设置用于设定单个PHP进程在终止之前最长可以运行多少时间。这个设置默认值是30秒。我们可不想让PHP进程运行30秒,因为我们想让应用运行的特别快(以毫秒计),建议设置为5秒:max_execution_time = 5
注意:在PHP脚本中可以调用 set_time_limit() 函数来覆盖这个设置。

假设我们要生存报告,并把结果制作成PDF文件,这个任务可能要花10分钟才能完成,而我们肯定不想让PHP请求等等10分钟。我们应该单独编写一个PHP文件,加入将其命名为create-report.php,让这个文件运行10分钟,最后生成报告,其实,web应用只需几毫秒就能派生一个单独的后台进程,然后返回http相应,如下所示。
<?php
exec(‘echo “create-report.php” | at now’);
echo ‘Report pending…’;

create-report.php脚本在单独的后台进程中运行,运行完毕后可以更新数据库,或者通过电子邮件吧报告发给收件人。可以看出,我们完全没有理由让长时间运行的任务拖延PHP主脚本,影响用户体验。

如果发现自己派生了很多后台进程,或许最好使用专门的作业队列。PHPResque是个不错的作业队列管理器,它是基于GitHub的作业队列管理器Resque开发的。

5. 处理会话

PHP默认会话处理程序会拖慢大型应用,因为这个处理程序把会话数据存储在硬盘中,需要创建不必要的文件I/O,浪费时间。我们可以吧会话数据保存在内存中,例如使用redis或者memcache。这么做还有个额外好处就是以便于伸缩。如果吧会话数据存储在memcache或者redis中央数据存储区,任何一台分布式PHP-FPM服务器都能访问会话数据。

若memcache的PECL扩展已经安装好,然后把下面两行添加到php.ini文件中,把PHP默认的会话存储方式改为memcache:
session.save_handler = ‘memcache’
session.save_path = ‘127.0.0.2:11211’

6. 缓冲输出

如果这较少的块中发送更多数据,而不是在较多的块中发送较少的数据,那么网络效率会更高.也就是说,在较少的片段中吧内容传递给访问者的浏览器,能减少http请求总数。
因此,我们要让PHP缓冲输出。默认情况下PHP已经启用了输出缓冲功能(不过没在命令行中启用)。php缓冲4096字节输出之后才会把其中的内容发给web服务器。下面是推荐这php.ini文件中使用的设置
output_buffering = 4096
implicit_fulsh = false

如果想修改输出缓冲区的大小,确保帅勇的值是4(32位系统)或8(64为系统) 的倍数。

7. 真实路径缓存

PHP会缓存应用使用的文件路径,这样每次包含或导入文件时就无需不断搜索包含路径了。这个换成叫真实路径缓存(realpath cache)。如果运行的是大型PHP文件(例如 Drupal和Composer组件等),使用了大量文件,增加PHP真是路径缓存的大小能得到更好的性能。
真实路径缓存的默认大小为16k。这个缓存所需的准确大小不容易确定,不过可以使用一个小技巧。首先,增加真实路径缓存的大小,设置特别大的值,例如256k。然后,在一个PHP脚本的末尾加上print_r(realpath_cache_seize());,输出真实路径缓存的真正大小。最后,把真实路径缓存的大小改为这个真正的值。php.ini文件中设置真是路径缓存的大小。
realpath_cache_size = 64k

 

====摘抄自Modern PHP 中文版