page contents

php.ini配置文件参数优化

用于生产环境中的PHP需要对其进行优化,让PHP自身发挥更好的性能,除了写好PHP代码,还要配置好php-fpm以及php.ini调优。本文从内存、OPcache、上传、会话以及安全等方面讲解php.ini的配置调优。
用于生产环境中的PHP需要对其进行优化,让PHP自身发挥更好的性能,除了写好PHP代码,还要配置好php-fpm以及php.ini调优。本文从内存、OPcache、上传、会话以及安全等方面讲解php.ini的配置调优。

attachments-2020-05-kIrq6jyo5eb4c82a39805.jpg


内存优化


运行 PHP 时需要关心每个 PHP 进程要使用多少内存,php.ini 中的memory_limit 设置用于设定单个 PHP 进程可以使用的系统内存最大值。
这个设置的默认值是 128M,这对于大多数中小型 PHP 应用来说或许合适,不过,如果运行的是微型 PHP 应用,可以降低这个值,以便节省系统资源,反之,如果运行的是内存集中型 PHP 应用,可以增加这个值。这个值的大小由可用的系统内存决定,确定给 PHP 分配多少值是一门艺术,决定给 PHP 分配多少内存,以及能负担起多少个 PHP-FPM 进程时,可以根据以下维度信息进行判断:

  1. 一共可以分配给 PHP 多少内存?以一个 2G 内存的 VPS 为例,这台设备中可能还运行了其他进程,如 MySQL、Nginx 等,那么留 512M 给 PHP 是合适的。
  2. 每个 PHP 进程平均耗费多少内存?这个要监控进程的内存使用量,可以使用命令行命令top,也可以在 PHP 脚本中调用 memory_get_peak_usage() 函数,不管使用哪种方式,都要多次运行同一个脚本,然后取内存消耗的平均值。
  3. 能负担起多少个 PHP-FPM 进程?假设我给 PHP 分配了 512M 内存,每个 PHP 进程平均耗费 15M 内存,那么可以负担起 34 个 PHP-FPM 进程。

  4. 有足够的系统资源吗?最后还需要确认有足够的系统资源运行 PHP 应用并处理预期的流量。


开启Zend OPcache性能加速


attachments-2020-05-RutzOL925eb4c8589c838.jpg

PHP属于解释型语言,在执行代码过程中,翻译器并不产生目标机器代码,而是产生易于执行的中间代码,这种中间代码每执行一次就翻译一次,通常会导致执行效率较低,而在PHP7中可以直接开启Opcache来进行性能优化和加速。
PHP 5.5+版本以上的,可以使用PHP自带的opcache开启性能加速(默认是关闭的),PHP5.5之后opcache可以直接--enable-opcache。对于PHP 5.5以下版本的,可以使用APC来进行缓存。


配置Opcache


zend_extension=opcache.so

;(网上很多资料使用engine = On来,是window下的php)

opcache.enable=1

;设置多少内存缓存opcode,单位M。如果内存不够用,就会出现一些php文件缓存不到的情况。解决办法是设置缓存到文件中去

opcache.memory_consumption=128

;最大允许缓存多少个php文件,需要根据项目的文件数来定。这个值一定要比 PHP 应用中的文件数大。最大支持100万个文件

opcache.max_accelerated_files=4000

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

opcache.validate_timestamps=0

;验证时间戳的频率。单位是秒。;此选型依赖于opcache.vilidate_timestamps=1(开启检查机制),才生效

opcache.revalidate_freq = 60

;字符串驻留技术使用多少内存,设置为8M,这是默认值。

opcache.interned_strings_buffer = 16

;快速释放内存,推荐开启,节省资源。php-7.2.0开始,不需要配置,已集成在php引擎中

opcache.fast_shutdown=1

;设置:是不是只使用文件来缓存opcode,不使用内存缓存。建议:关掉。最好内存和文件都同时使用

opcache.file_cache_only=false

;将内存中缓存的opcdoe,备份到磁盘文件中。这样好处,重启服务器时,可以避免重新生成了。注意目录的权限要设对,设置php引擎所属linux用户能够写入。实测,若权限不够,并不会报错,只是缓存不进去

opcache.file_cache=/apps/php-7.1.7/opcode_file_cache


文件上传


如果你的应用允许上传文件,最好设置最大能上传的文件大小。除此之外,最好还要设置最多能同时上传多少个文件
file_uploads = 1
 upload_max_filesize = 10M
 max_file_uploads = 3

默认情况下,PHP 允许在单次请求中上传 20 个文件,上传的文件最大为 2MB,这里我设置为单次请求最多只能上传 3 个文件,每个文件最大为 10MB,这个值不要设置太大,否则会出现超时。
注:如果非要上传大文件,Web 服务器的配置也要做相应调整。除了在 php.ini 中设置之外,还要调整 Nginx 虚拟主机配置中的 client_max_body_size 设置。
此外,如果是上传特大文件,我建议使用Webuploader专门的上传组件,前端对大文件进行切片,后端php对分片数据进行合并还原文件。有关WebUploader应用请参考本站文章:功能强大的文件上传组件-WebUploader。


执行时间


max_execution_time 用于设置单个 PHP 进程在终止之前最长可运行时间。这个设置默认是 30 秒,建议将其设置为 5 秒:

max_execution_time = 5
注:在 PHP 脚本中可以调用set_limit_time()函数覆盖这个设置。
假设我们想要生成报告,并把结果制作成 PDF 文件,这个任务可能要花 10 分钟才能完成,而我们肯定不想让 PHP 请求等待 10 分钟,我们应该单独编写一个 PHP 文件,让其在单独的后台进程中执行,Web 应用只需几毫秒就可以派生一个单独的后台进程,然后返回 HTTP 响应。
实际上,我们在跑需要消耗大量时间来完成的任务,一般采用后台进程方式,比如我们可以使用PHP的swoole扩展来生成报表、批量发送邮件耗时长的任务。


处理会话


PHP 默认的会话处理程序会拖慢大型应用,因为这个处理程序会把会话数据存储在硬盘中,需要创建不必要的磁盘 I/O,浪费时间。我们应该把会话数据保存在内存中,例如可以使用 Memcached 或 Redis。这么做还有个额外好处 —— 以后便于伸缩。如果会话数据存储在硬盘中,不便于增加额外的服务器,如果把会话数据存放在 Memcached 或 Redis 里,任何一台分布式 PHP-FPM 服务器都能访问会话数据。
如果想把会话数据保存在 Memcached 中,需要做如下配置:
session.save_handler = 'memcached'
session.save_path = '127.0.0.1:11211'


缓冲输出


如果是在较少的块中发送更多数据,而不是在较多的块中发送较少的数据,那么网络的效率会更高,也就是说,在较少的片段中把内容传递给访问者的浏览器,能减少 HTTP 请求总数。
因此,我们要让 PHP 缓冲输出,默认情况下,PHP 已经启用了输出缓冲功能,PHP 缓冲 4096 字节的输出之后才会把内容发送给 Web 服务器,推荐配置如下:

output_buffering = 4096
implicit_flush = false

注:如果想要修改输出缓冲区的大小,确保使用的值是4(32位系统)或8(64位系统)的倍数。


安全


open_basedir:使用open_basedir选项能够控制PHP脚本只能访问指定的目录,这样能够避免PHP脚本访问不应该访问的文件,一定程度上限制了phpshell的危害。我们一般可以设置为只能访问网站目录:

open_basedir = /data/www

一般我们要禁止系统函数和禁止任何文件和目录的操作,如:

disable_functions = passthru,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server

①expose_php = Off:将此项设置为false即不会再header头输出PHP版本信息。
②display_errors = Off:生产环境中,我们应该禁止错误提示,如果是本地开发环境,可以设置为On。
③log_errors = On:建议在关闭display_errors后能够把错误信息记录下来,便于查找服务器运行的原因。
④error_log:设置PHP错误日志存放的目录。


attachments-2020-05-84QmizVo5eb4c80f4f860.jpg

  • 发表于 2020-05-08 10:48
  • 阅读 ( 543 )
  • 分类:PHP开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1478 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章