登录 |

PHP性能checklist

2013年10月14日 上午 08:22 | 作者:

  1. 运行环境
    1. 使用最新的PHP版本 + 20%
      5.5 > 5.4 > 5.3
    2. 使用更快的OPCache缓存 + 20%
      ZendOpcache > APC
    3. 使用Nginx+PHP-FPM 而不是 Apache+mod_php
      1. Nginx
        1. workers进程数等于CPU核数
          worker_processes =  [CPU cores];
        2. 设置cpu亲密性,每个worker对于一个cpu
          worker_cpu_affinity 01 10; #双核
        3. 使用 limit_zone阻止恶意访问
          limit_req_zone  $binary_remote_addr  zone=qps1:1m   rate=3r/s;
          location /delay {
              limit_req   zone=qps1  burst=5;
          }
        4. 静态文件缓存
          location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
              expires 24h;
              log_not_found off;
          }
      2. PHP-FPM
        1. 打开error_log+slow_log,帮助你监控,迅速定位错误
          slowlog = /var/log/php-fpm.$pool.slow
          request_slowlog_timeout = 1
          php_admin_value[error_log] = /var/log/php-fpm.$pool.error
        2. 使用进程池
          PHP支持使用进程池,比如将网站前端和管理后台分别设置两个进程池:
          [fontend]
          # 前端:并发请求多,限制内存占用,限制单请求执行时长
          max_children=100;memory_limit=16M;request_terminate_timeout=15
          [backend]
          # 后端:并发请求少,占用内存大,不限制执行时间
          max_children=10;memory_limit=128M;request_terminate_timeout=0
        3. 设置合理的进程数
          取决于你的PHP程序是IO密集型还是CPU密集型,可使用htop观察;
          IO密集型:100/%MEM
          * 限制内存 php_admin_value[memory_limit] = 32M
          CPU密集型:100/%CPU
          pm = dynamic
          pm.max_children = ?
        4. 设置PHP最长执行时间
          PHP-FPM一个请求独占一个进程,如果不设置超时时间,慢请求会迅速占满所有fpm进程
          request_terminate_timeout = 15
    4. PHP的mysql扩展使用Mysqlnd驱动,而不是libmysql
      ./configure –with-mysql=mysqlnd –with-mysqli=mysqlnd –with-pdo-mysql=mysqlnd
    5. MySQL
      1. 打开慢日志
        log_slow_queries = /var/log/mysql/mysql-slow.log
        long_query_time = 1
      2. Innodb 设置
        innodb_buffer_pool_size = 1G
        innodb_log_file_size = 256M
        innodb_log_buffer_size = 4M
        innodb_flush_log_at_trx_commit = 2
        innodb_thread_concurrency = 8
        innodb_flush_method = O_DIRECT
  2. PHP
    1. 优化原则
      抓大放小(总执行时长=执行时长*执行次数)
      * 安装xhprof+XHGui;进入Hardest Hit ,按Total Wall Time(总执行时长)排序
    2. CPU
      * 监测代码执行前后的,脚本使用内存变化 

      1. 大加载
        1. 使用大数组作为配置文件
          使用hidef 一次性载入
        2. 载入不需要的类/库文件
          lazyload,按需加载库文件
      2. 反序列化
        1. 使用更快的序列化/反序列化方法
          explode > msgpack > igbinary > json> serialize
        2. 避免反序列化大对象(同大加载)
          保持小对象的序列化/反序列化,不要缓存大数据,检测方法同上
      3. 使用简单的数据/对象结构
        例如:避免对大数据集使用Active Record
    3. IOwait
      1. 架构设计上,避免单点,可水平扩展
        异步解决不了可扩展性问题,总执行时长还是一样多
      2. 设置请求timeout
        避免一个服务延迟,拖累整个页面请求
      3. 合并请求  curl/sql/redis/memcache
        * PHPIO: 循环执行IO函数,记录代码路径重复次数,例如:
        foreach ($users as $uid) {
        mysql_query(‘SELECT * FROM usr WHERE uid = $uid’)
        }
        =>
        mysql_query(‘SELECT * FROM usr WHERE uid IN (‘.implode(‘,’,$users).’)’);

评论(9条评论)

  1. http://www.RunescapeGold2007.com...

    You bet !…

  2. RunescapeGold2007.com…

    I do not know what you are saying…

  3. fifa 17 coins…

    I mean it!…

  4. buy fifa 17 coins…

    Your company is very impressive ….

  5. nba2k16store…

    Hold it!…

  6. cheapest mt 2k16 coins ps4 for sale…

    this site might help me personally to locate some good suggestions!…

  7. UPAlbion.com…

    You started it !…

  8. Cheap NBA 2K17 MT for Sale

    You always love it.

  9. Cheap NBA 2K17 MT Coins for Sale

    That makes two of us.

发表评论

您必须登陆才可以发表评论