提高PHP性能的方法

时间:2022-05-11 06:13:49

提高PHP性能的方法

下面的文字从Dustin Whittle的 Scaling PHP in the real world 摘抄而来。原文作于2013年,有些信息可能不是那么新了。 https://speakerdeck.com/dustinwhittle

性能的提高,对于高并发访问量的应用来说,至关重要。本文主要是对上文提到的各种方法进行进一步的解释。

Opcode Cache
后台用queue来处理工作 (doing work in the background with queues)
部署用HTTP caching (Varnish/Squid) 和反向代理缓存
分布式数据缓存: Memcached 或者 redis
采用合适的工具
Xdebug+ Valgrind + WebGrind
AppDynamics
重视架构

具体的小贴士:
* 升级到最新版本的PHP
* 用Nginx + PHP-FPM
* 使用opcode cache
  PHP是解释性语言,每次一个PHP页面请求处理的时候,服务器都需要解释PHP文件,编译成opcode,然后执行。 opcode 缓存把编译好的opcode保存到共享内存中,这样就避免了重复编译,减少了cpu的开销(对于瓶颈是cpu的应用来说,性能提升比较明显)。编译只需要在第一次请求的时候执行。多种方式可以做opcode 缓存: APC, Zend Opcache(https://pecl.php.net/package/ZendOpcache), XCache
  
* 使用自动加载, 避免了多require或者include的解析 spl_autoload_register() 
    bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )
* 优化会话, 把缺省的文件保存形式转为数据库保存,并用缓存起来(memcached, redis等) 
  限制会话数据大小为4M,把所有的数据保存在一个cookie中。 
* 利用好内存数据缓存。 
    Doctrine ORM for PHP 有基于memcached 和redis的缓存机制。缓存可以是某个页面,应用的配置文件, 或者网络服务的响应。
     http://memcached.org/
     http://redis.io
     http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html
* 在后台用一个队列来处理阻塞性工作
    Resque for PHP https://github.com/chrisboulton/php-resque
    Gearman 
    RabbitMQ
    Kafka
    Beanstalkd
    ZeroMQ
    ActiveMQ
    http://kamisama.me/2012/10/09/background-jobs-with-php-and-resque-part-2-queue-system/
    http://kamisama.me/2012/10/12/background-jobs-with-php-and-resque-part-4-managing-worker/
* 使用HTTP缓存
   用Varnish作为反向代理
   http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html
   http://www.mnot.net/cache_docs/
*  优化你的框架
* 数据库 分片
× 学习如何分析PHP 代码,提高性能
    xdebug  http://xdebug.org/
    WebGrind https://github.com/jokkedk/webgrind
    XHprofi
    Appdynamic  http://appdynamics.com
    Valgrind  http://valgrind.org/info/tools.html#callgrind
    
资料来源 
https://speakerdeck.com/dustinwhittle