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 中文版