点击进入“PHP开源社区” 免费获取进阶面试、文档、视频资源默认状况下安装的PHP类似于在百货商店中购买的常规软件包,但它非常合适,但并不完美。调优的PHP就像是量身定制的装备。
然则,应该重视的是,调优PHP只是加强PHP性能和效率的一种手段,它与不良的代码和无响应的API调用无关。
php.ini文件PHP 解释器在 php.ini 文件中配置和调优,此文件的位置在区别的操作系统中是区别的,并且常规命令行对应 php.ini 和 PHP-FPM 对应的 php.ini 文件是掰开的。在这儿,咱们假设配置PHP-FPM 对应于php.ini,然则下面讲的优化办法适用于所有 php.ini。注:咱们首要应该运用 PHP Iniscan 工具扫描 php.ini,检测运用了安全方面的最佳实践。
内存运行 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 应用并处理预期的流量。 注:咱们应该运用 Apache Bench 或 Siege 在类似生产环境的要求下对 PHP 应用做压力测试,以确定生产环境是不是有足够的资源可用。
Zend OPcache确定要分配多少内存后,就能够配置 PHP 的 Zend OPcache 扩展PHP 5.5.0+ 内置了这个扩展,下面是在 php.ini 文件中配置和优化 Zend OPcache 扩展所用的设置:
opcache.memory_consumption = 64:为操作码缓存分配的内存量(以MB为单位)。分配的内存量应能够存储应用程序中所有PHP脚本编译的操作码。该值能够按照应用程序的体积设置为区别的值。
opcache.interned_strings_buffer = 16:用于存储常驻字符串的内存量(以MB为单位)。什么是驻留字符串? PHP解释器将在其后找到同一字符串的多个实例,并将此字符串保留在内存中。
倘若再次运用相同的字符串,PHP解释器将运用指针,以节省内存。默认状况下,PHP驻留字符串在每一个PHP进程中都是隔离的。
此设置准许PHP-FPM进程池将所有进程驻留字符串存储在共享缓冲区中,以便能够将其存储在PHP-FPM进程池中。在多个进程之间引用常驻字符串,从而节省了更加多内存。
opcache.max_accelerated_files = 4000:能够存储在操作码缓存中的PHP脚本的最大数量。取值范围是2000〜100,000。此值必须大于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:此设置准许操作码运用更快的停机时间,将对象破坏和内存释放留给Zend Engine的内存管理器。
文件上传倘若您的应用程序准许上传文件,则最好设置能够上传的最大文件体积。另一,最好设置一次能够上传多少个文件:file_uploads = 1upload_max_filesize = 10
M max_file_uploads = 3默认状况下,PHP准许在单个请求中上传20个文件。 上传的最大文件为2MB。在这儿,我将其设置为在单个请求中最多上传3个文件,每一个文件的最大体积为10MB。亦不要设置此值。很大,否则会出现超时。注:倘若非要上传大文件,Web 服务器的配置亦要做相应调节。除了在 php.ini 中设置之外,还要调节 Nginx 虚拟主机配置中的 client_max_body_size 设置。
最长执行时间php.ini 文件中的 max_execution_time 用于设置单个PHP进程在终止之前能够运行的最长期。此设置默认为30秒,意见将其设置为5秒:max_execution_time = 5注:在 PHP 脚本中能够调用 set_limit_time() 函数覆盖这个设置。假设咱们要生成报告并将结果生作为PDF文件。该任务可能需要10分钟才可完成,并且咱们当然不期盼等待PHP请求10分钟。咱们应该编写一个单独的PHP文件,并将其放在单独的背景中。在该流程中执行后,Web应用程序能够在几毫秒内生成一个单独的后台流程,而后返回HTTP响应:exec(echo "create-report.php" | at now
); echo report pending...
; create-report.php在单独的后台进程中运行。运行之后,您能够更新数据库或将报告经过电子邮件发送给收件人。然则,这种用法很少见。一般,咱们经过异步运用队列来实现类似的功能。无论在安全性,可伸缩性和可守护性方面,效果都更好。关联组件拥有轻量级信息队列PHPResque等。
处理会话PHP的默认会话处理程序减慢了大型应用程序的速度,由于该处理程序将会话数据存储在硬盘上,从而导致不必要的磁盘I / O并浪费时间。咱们应该将会话数据保存在内存中,例如运用Memcached或Redis。这还有一个额外的好处-将来更易扩展。倘若会话数据存储在硬盘上,则添加其他服务器不方便。倘若会话数据存储在Memcached或Redis中,则任何分布式PHP-FPM服务器都能够拜访会话数据。倘若想把会话数据保留在 Memcached 中,需要做如下配置:session.save_handler =memcachedsession.save_path = 127.0.0.1:11211
缓冲输出倘若在更少的块中发送更加多的数据,而不是在更加多的块中发送更少的数据,则网络将更加有效,亦便是说,以更少的片段浏览器传递内容以进行拜访,这能够减少HTTP请求的总数。因此呢,咱们必须让PHP缓冲输出。默认状况下,PHP已启用输出缓冲功能,并且PHP将在缓冲4096字节的输出后将内容发送到Web服务器。output_buffering = 4096implicit_flush = false注:倘若想要修改输出缓冲区的体积,保证运用的值是4(32位系统)或8(64位系统)的倍数。真实路径缓存PHP 会缓存应用运用的文件路径,这般每次包括或导入文件时就无需持续搜索包括路径了,这个缓存叫真实路径缓存(realpath cache),倘若运行的是大型的 PHP 文件(如 Composer 组件),运用了海量文件,增多 PHP 真实路径缓存的体积能得到更好的性能。真实路径缓存的默认体积为16K。此缓存所需的确切体积很难确定,但能够运用有些技巧:首要,增多实质路径高速缓存的体积并将其设置为尤其大的值,例如256K。最后在php脚本末尾添加上 print_r(realpath_cache_size());,输出真实路径缓存的真正体积,最后,把真实路径缓存的体积改为这个真正的值。咱们能够在 php.ini文件中设置真实路径缓存的体积:realpath_cache_size = 64
K
*声明:本文于网络整理,版权归原作者所有,如源自信息有误或侵犯权益,请联系咱们删除或授权事宜。 ENDPHP开源社区扫描关注 进入”PHP资料“
免费获取进阶
面试、文档、视频资源 点击“查看原文”获取更加多
|