PHP细数实现提高并发能力的方法_第1页
PHP细数实现提高并发能力的方法_第2页
PHP细数实现提高并发能力的方法_第3页
PHP细数实现提高并发能力的方法_第4页
PHP细数实现提高并发能力的方法_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第PHP细数实现提高并发能力的方法目录内存优化开启ZendOPcache性能加速文件上传执行时间处理会话缓冲区安全设置本文已收录编程学习笔记gitee。涵盖PHP、JavaScript、Linux、Golang、MySQL、Redis和开源工具等等相关内容。

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

PHP相对其他的编译性语言,最大的缺点在于每次请求都会去做一些模块解析,真正执行的是work进程。work进程的开启需要消耗更多的资源。同时,来一个请求都会去重新解析一些代码,导致重复解析。

对于PHP的优化,可以重点充这方面去考虑进行优化。

内存优化

运行PHP时需要关心每个PHP进程要使用多少内存,php.ini中的memory_limit设置用于设定单个PHP进程可以使用的系统内存最大值。

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

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

有足够的系统资源吗?最后还需要确认有足够的系统资源运行PHP应用并处理预期的流量。具体的PHP配置信息可以参考php-fpm.config配置文件。

;Timelimitforchildprocessestowaitforareactiononsignalsfrommaster.

;Availableunits:s(econds),m(inutes),h(ours),ord(ays)

;DefaultUnit:seconds

;DefaultValue:0

;process_control_timeout=0

;ThemaximumnumberofprocessesFPMwillfork.Thishasbeendesignedtocontrol

;theglobalnumberofprocesseswhenusingdynamicPMwithinalotofpools.

;Useitwithcaution.

;Note:Avalueof0indicatesnolimit

;DefaultValue:0

;process.max=128

;Specifythenice(2)prioritytoapplytothemasterprocess(onlyifset)

;Thevaluecanvaryfrom-19(highestpriority)to20(lowestpriority)

;Note:-ItwillonlyworkiftheFPMmasterprocessislaunchedasroot

;-Thepoolprocesswillinheritthemasterprocesspriority

;unlessspecifiedotherwise

;DefaultValue:noset

;process.priority=-19

;SendFPMtobackground.SettonotokeepFPMinforegroundfordebugging.

;DefaultValue:yes

daemonize=no

php-fpm有三种运行模式,分别是固定进程数、按需进程数、完全动态进程数。

按需进程数,默认初始化几个进程数,如果进去量过大,动态创建一些新的进程数,等请求结束之后,新创建的进程数在销毁掉。固定进程数,默认固定几个进程,如果进程数不够的情况时,新的请求处于等待中,直到其他的进程处理完毕才会处理新的请求。完全动态进程数,表示完全由请求量控制,来一个请求创建一个进程,处理完毕在销毁掉。

开启ZendOPcache性能加速

确定要分配多少内存后,就可以配置PHP的ZendOPcache扩展。OPcache主要是将一些代码解析成字节码,在后续的请求中就无需重复去解析、编译这部分代码。减少编译、解析的过程,也能提高PHP的处理速度。

PHP5.5.0+内置了这个扩展,下面罗列几项必要的配置信息:

opcache.memory_consumption=64:为操作码缓存分配的内存(单位是MB),分配的内存量应该可以保存应用中所有PHP脚本编译得到的操作码,这个值根据应用的体量可以设置成不同大小的值。

erned_strings_buffer=16:用来存储驻留字符串的内存量(单位是MB),什么是驻留字符串呢?PHP解释器在背后会找到相同字符串的多个实例,把这个字符串保存在内存中,如果再次使用相同的字符串,PHP解释器会使用指针,这么做的目的是节省内存。默认情况下,PHP驻留字符串会隔离在各个PHP进程中,这个设置能让PHP-FPM进程池把所有进程驻留字符串存储到共享的缓冲区中,以便在PHP-FPM进程池中的多个进程之间引用驻留字符串,这样能节省更多内存。

opcache.max_accelerated_files=4000:操作码缓存中最多能存储多少个PHP脚本,这个值的区间是2000到100000之间,这个值一定要比PHP应用中的文件数大。

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

opcache.revalidate_freq=0:设置多久(单位是秒)检查一次PHP脚本内容是否有变化。设置为0秒的含义是仅当opcache.validate_timestamps设置为1时,才会在每次请求时都重新验证PHP文件,因此,在开发环境中每次都会重新验证PHP文件,在生产环境中则不验证。

opcache.fast_shutdown=1:这么设置能让操作码使用更快的停机步骤,把对象析构和内存释放交给ZendEngine的内存管理器完成。

文件上传

如果你的应用允许上传文件,最好设置最大能上传的文件大小。除此之外,最好还要设置最多能同时上传多少个文件:

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默认的情况是将会话产生的信息存在磁盘中,例如所谓的session信息。在创建和读取session时,都会对磁盘进行I/O操作,读写磁盘其实是比较耗时的一个操作。并且session不方便做分布式应用的会话机制处理。推荐可以放在Redis、memcached这样的内存性服务中,读写速度快,并且可以做分布式会话机制处理。

下面举例将session这样的信息,存储在memcached内存中。

session.save_handler="memcached"

session.save_path="服务地址:端口号"

缓冲区

如果是在较少的块中发送更多数据,而不是在较多的块中发送较少的数据,那么网络的效率会更高,也就是说,在较少的片段中把内容传递给访问者的浏览器,能减少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:一般我们要禁止系

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论