php optimization for millions visits level
TRANSCRIPT
![Page 1: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/1.jpg)
千万级 PHP 接口优化kim
![Page 2: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/2.jpg)
问题• 什么是千万级?• 接口扛不住,措施 1 、 2 、 3 是?• 如何优化?
![Page 3: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/3.jpg)
并发数• 10000000 / 86400 ≈ 116
• 按高峰期 10 倍,即 1160req/s
![Page 4: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/4.jpg)
观察• Ping • Trace• HttpWatch• Uptime• Top• Free• Nagios
![Page 5: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/5.jpg)
Top 举例
![Page 6: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/6.jpg)
紧急措施• 重启• 缓存穿透• 启用备机(如果有的话)
![Page 7: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/7.jpg)
系统日志• Nginx access log
• Nginx error log
• PHP error log
• PHP slow log
![Page 8: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/8.jpg)
访问统计• 各种访问统计• awk -F"[" '{ print $1 }'
/home/nginx/logs/access.log | sort | uniq -c | sort -rn | head -n 10
![Page 9: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/9.jpg)
非 200 统计• 非 200 访问• cat /home/nginx/logs/access.log | grep -v
"\"200\""
![Page 11: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/11.jpg)
PHP 慢?• 有 opcode cache 的 PHP ,已经够快了!
![Page 12: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/12.jpg)
真正的原因• 端口( Socket )连接慢• 端口( Socket )数据交互多
![Page 13: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/13.jpg)
举例 1
• mysql_connect() • mysql_query()
• redis->connect()• redis->select()
![Page 14: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/14.jpg)
举例 2
• memcache->connect()• memcache->get()
• new Mongo()• MongoCollection->find()
![Page 15: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/15.jpg)
举例 3
• Http::Get()
![Page 16: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/16.jpg)
如何优化 Socket
![Page 17: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/17.jpg)
释放要主动• mysql_close()• Redis->close()• Memcache->close()• Mongo->close()• unset
![Page 18: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/18.jpg)
验证要提前• 比如: xxx.56.com/api/someapi.php :• <?php• if (!isset($_GET['ids'])) {• die('Invalid arguments');• }• require 'index.php';
![Page 19: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/19.jpg)
缓存要耦合• 评论数• 人气• 视频顶踩
![Page 20: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/20.jpg)
如何优化 PHP
![Page 21: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/21.jpg)
PHP 优化利器• http://pecl.php.net/package/xhprof
![Page 22: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/22.jpg)
XHProf 安装• XHProf lib 包• 代码举例
![Page 23: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/23.jpg)
XHProf 举例
![Page 24: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/24.jpg)
代码“完美”了,还能优化吗?
![Page 25: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/25.jpg)
Tcp 短连接也不能忍受了!
![Page 27: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/27.jpg)
特性• 1. 轻量,安装配置简单• 2. 多点长连接• 3. 自动冗余• 4. 支持 memcached ascii 和 redis 协议• 5. 可监控,可记录日志
![Page 28: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/28.jpg)
站内使用状况• Infov 视频信息接口• Stat 人气接口• Album 专辑信息接口
![Page 29: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/29.jpg)
客户端选择• Memcached (推荐) VS Memcache
• Phpredis (推荐) VS Predis
![Page 30: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/30.jpg)
反复实战• Memp 类使用举例• $mm = new Memp(array('servers' =>
array('127.0.0.1', 22122)));
![Page 31: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/31.jpg)
Twemproxy 日志• -v, --verbosity=N set logging level (default: 5, min: 0, max:
11)
• 日志举例
![Page 32: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/32.jpg)
Twemproxy 的问题
![Page 33: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/33.jpg)
Memcache 删除不了• Bug 如下:• command_len = spprintf(&command, 0,
"delete %s %d", key, time);• command[command_len] = '\0';
• 需要人工修复:• command_len = spprintf(&command, 0,
"delete %s", key);
![Page 34: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/34.jpg)
乱码与截断• 不能压缩• Memcached->setOption( Memcached::OPT_COMPRESSION,
false);
![Page 35: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/35.jpg)
EOF
• Twemproxy 要求 EOL 是 “ \r\n” ,而不是 “ \n” ,所以在一些情况下是要注意,比如使用 nc 时,要带上 -C 参数,但不是每个版本的 nc 都带这个参数
• $ echo get key | nc -C 127.0.0.1 22121
![Page 36: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/36.jpg)
配置要接地气• 痛苦的经历:不支持 redis->select()
![Page 37: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/37.jpg)
保正一致性• hash: md5• distribution: ketama
![Page 38: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/38.jpg)
缓存冗余• auto_eject_hosts: true
• 无规律• 不一致
![Page 39: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/39.jpg)
如何清缓存?• 循环删除 + 队列补刀• Infov 代码举例
![Page 40: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/40.jpg)
总结
![Page 41: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/41.jpg)
毫秒必争• 如过你的接口平均服务时间是 30ms ,那么
1ms 的价值就是 3% 的性能提升!
![Page 42: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/42.jpg)
• 提升 1ms 的途径:• 1. 把 count 移出 for 循环• 2. 把 preg_match 换成了 strstr• 3. 去掉了数组的 交集 / 并集 / 合并 操作• 4. 少创建了几个 memcache 对象
![Page 43: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/43.jpg)
• 实践和测试• 加节点是最后手段
![Page 44: PHP Optimization for Millions Visits Level](https://reader034.vdocuments.mx/reader034/viewer/2022042600/58e63bd41a28abe3108b5081/html5/thumbnails/44.jpg)
谢谢!