调优 PHP

调优 PHP

PHP 是运行应用程序代码的引擎。应该仅安装计划使用的那些模块,并配置您的 Web 服务器,使之仅为脚本文件(通常是以 .php 结尾的那些文件)使用 PHP,而非所有静态文件。

操作码缓存

请求一个 PHP 脚本时,PHP 会读取该脚本,并将其编译为 Zend 操作码,这是要执行的代码的一种二进制表示形式。随后,此操作码由 PHP 执行并丢弃。操作码缓存将保存这个编译后的操作码,并在下一次调用该页面时重用它。这会节省很多时间。有多种缓存可用,我比较常用的是 eAccelerator。

要安装 eAccelerator,您的计算机上需要有 PHP 开发库。由于不同的 Linux 发布版存放文件的位置不同,所以最好直接从 eAccelerator 的 Web 站点获得安装说明(参见 参考资料 部分获得链接)。您的发布版也有可能已经包含了一个操作码缓存,只需安装即可。

无论如何在系统上安装 eAccelerator,都有一些配置选项需要注意。配置文件通常是 /etc/php.d/eaccelerator.ini。eaccelerator.shm_size 定义共享高速缓存的大小,编译后的脚本就存储在 这里。该值的单位是兆字节(MB)。根据您的应用程序确定恰当的大小。eAccelerator 提供了一个脚本来显示缓存的状态,其中包含内存占用,64MB 是个不错的选择(eaccelerator.shm_size="64")。如果您选择的值未被接受,那么必须修改内核的最大共享内存的大小。向 /etc/sysctl.conf 添加 kernel.shmmax=67108864,运行 sysctl -p 来使设置生效。kernel.shmmax 值的单位是字节。

如果共享内存的分配超出极限,eAccelerator 必须将旧脚本从内存中清除。默认情况下,这是被禁用的;eaccelerator.shm_ttl = "60" 指定:当 eAccelerator 用完共享内存时,60 秒内未被访问的所有脚本都将被清除。

另一种流行的 eAccelerator 替代工具是 Alternative PHP Cache(APC)。Zend 的厂商也提供了一种商业操作码缓存,包括一个进一步提高效率的优化器。

php.ini

PHP 的配置是在 php.ini 中完成的。四个重要的设置控制 PHP 可使用多少系统资源,如表 1 所列。

表 1. php.ini 中与资源相关的设置

设置

描述

建议值

max_execution_time

一个脚本可使用多少 CPU 秒

30

max_input_time

一个脚本等待输入数据的时间有多长(秒)

60

memory_limit

在被取消之前,一个脚本可使用多少内存(字节)

32M

output_buffering

数据发送给客户机之前,有多少数据(字节)需要缓存

4096

具体数字主要取决于您的应用程序。如果要从用户处接收大文件,那么 max_input_time 可能必须增加,可以在 php.ini 中修改,也可以通过代码重写它。与之类似,CPU 或内存占用较多的程序也可能需要更大的设置值。目标就是缓解超标程序的影响,因此不建议全局禁用这些设置。关于 max_execution_time, 还有一点需要注意:它表示进程的 CPU 时间,而不是绝对时间。因此一个进行大量 I/O 和少量计算的程序的运行时间可能远远超过 max_execution_time。这也是 max_input_time 可以大 于 max_execution_time 的原因所在。

PHP 可执行的日志记录数是可配置的。在生产环境中,禁用除最重要的日志以外的一切日志记录能够减少磁盘写操作。如果需要使用日志来排除问题,那么可以按需启用 日志记录。error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR 将启用足够的日志记录,使您发现问题,同时从脚本中消除大量无用的内容。

结束语

本文重点探讨 Web 服务器的调优,包括 Apache 和 PHP。对于 Apache,总体的想法是消除 Web 服务器必须执行的多余检查,例如处理 .htaccess 文件。还必须调优所用的多处理模块,以便在使用的系统资源和可供传入请求使用的空闲 worker 之间找到平衡。对于 PHP,最好的事情就是安装一个操作码缓存。密切注意几个资源设置也能确保脚本不会浪费系统资源,不会减慢系统处理其他任务的速度。

本系列的下一篇也是最后一篇文章将介绍 MySQL 数据库的调优。请继续关注!

参考资料

学习

  • 您可以参阅本文在 developerWorks 全球网站上的 英文原文。
  • “使用应用程序跟踪对性能改变进行量化分析 ” (developerWorks,2006 年 8 月)介绍了如何利用应用程序追踪来展示 Apache 配置更改的效果。
  • “PHP V5.2 中的新增功能,第 1 部分: 使用新的内存管理器 ”(developerWorks,2007 年 4 月)涵盖了 PHP 5.2 在内存处理方面的最新变化。PHP 一直在不断优化其对系统资源的使用。
  • mod_deflate 是一个 Apache 模块,可动态压缩输出。在 PHP 中也可通过 输出压缩 实现这种功能。
  • 预缓存将压缩 JavaScript 代码之类的静态文件。CSS 是提高性能的另一种途径。压缩和连接所有 JavaScript 代码及 CSS 就更好了。
  • 介绍 多处理模块 的 Apache 文档值得一读,可从中了解各模块的功能性,单击相应链接可查看所选 MPM 的具体文档。
  • 在 developerWorks 中国网站 Linux 专区 可找到针对 Linux 开发人员的更多资源。
  • 随时关注 developerWorks 技术活动 和 网络广播。

获得产品和技术

  • 如果您的发布版不包含 eAccelerator,Install From Source 说明会对您有所帮助。
  • Alternative PHP Cache 和 Zend Platform 是 eAccelerator 的替代工具。
  • Siege 使您可以模拟用户,以便了解站点能够处理多少流量。
  • 您迟早会打算缓存站点的某些元素,并将负载分布到多个 Web 服务器上。Squid 的加速器模式(也称为反向代理)或 Linux Virtual Server Project 都是不错的工具。
  • 订购 SEK for Linux,这有两张 DVD,包含用于 Linux 的最新 IBM 试用软件,包括 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere®。
  • 利用可从 developerWorks 直接下载的 IBM 试用版软件 构建您的下一个 Linux 开发项目。

讨论

通过参与 developerWorks blog 加入 developerWorks 社区。

本文分享自微信公众号 - 马哥Linux运维(magedu-Linux)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-08-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • varnish缓存实现动静分离

    一、简介 Web缓存是指一个Web资源(html,js,css,images...)存在与Web服务器和客户端(浏览器),缓存会根据进来的请求报文做出响应,后...

    小小科
  • [干货]varnish原理|杨过同学

    Varnish是一款高性能的开源HTTP加速器(其实就是带缓存的反向代理服务),可以把http响应内容缓存到内存或文件中,从而提高web服务器响应速度。与传统的...

    小小科
  • python,django做中间件屏蔽非法访问

    我使用django1.6. django框架没有urlfilter这样的原生中间件,但是灵活的django设计者为我们留下了更自由的渠道。 在没有使用djan...

    小小科
  • 草图大师(SketchUp Pro)2017安装教程

    课代表
  • LeetCode 1293. Shortest Path in a Grid with Obstacles Elimination

    ShenduCC
  • docker运行php网站程序

    官方提供了诸如php:7.1-apache的基础镜像,但是确认必要的扩展,例如gd,当然官方提供了docker-php-ext-install命令,可以用来安装...

    用户1177380
  • Linux shell命令总结大全

    Linux shell命令应该算是非常入门的东西,权当给大家做个记录。但是实际上在使用的时候,会遇到各种各样的问题,前几天我在我们的项目上需要做一个功能,根据进...

    java进阶架构师
  • 【Linux】shell命令总结

    Linux shell命令应该算是非常入门的东西,但是实际上在使用的时候,会遇到各种各样的问题,前几天我在我们的项目上需要做一个功能,根据进程名字杀死这个进程,...

    zenRRan
  • Linux shell命令总结大全

    Linux shell命令应该算是非常入门的东西,但是实际上在使用的时候,会遇到各种各样的问题,前几天我在我们的项目上需要做一个功能,根据进程名字杀死这个进程,...

    用户2769421
  • [日常] Go语言圣经-GIF动画练习语法

    1.常量声明的值必须是一个数字值、字符串或者一个固定的boolean值。 2.常量声明和变量声明一般都会出现在包级别 3.[]color.Color{...}生...

    陶士涵

扫码关注云+社区

领取腾讯云代金券