最新消息: 生命不止,奋斗不息……

PHP常见问题或技巧整理

PHP admin 861浏览 0评论

【用户说你的网站打开太慢,请列出所有可能性,以及排查方法】

一、网络问题

1、临时性
检查:ping, mtr 等命令,检查网络状况,DNS等
解决:联系机房或视具体情况而定

2、网络不同或距离太远
检查:客户端和机房所在网络情况
解决:双线机房或分布式部署,动态DNS,需要考虑成本

3、资源加载慢
检查:chrome控制台
解决:CDN,合并请求,压缩页面代码等

二、前端问题

1、浏览器太烂

2、页面设计不佳
检查:浏览器解析时间,是否DOM节点过多,JS有问题等
解决:优化页面代码

三、服务端问题

1、服务器状态
检查:负载,CPU, 网络,内存,磁盘空间等使用情况
如果单台服务器性能受限,考虑调整为分布式架构,如nginx转发,DB分库分表等

2、PHP响应慢
检查webserver日志中的响应时间
如果服务器整体负载不高,但PHP的数据返回时间过长,在PHP代码中分段输出处理时间
更具环境的不同,可以选择直接输出或是写入日志
如果是高访问量的在线调试,一般选取一定比例记录日志,防止日志过多带来的额外系统开销
逐步缩小范围,定位、优化

3、DB响应慢
有分为读取慢和写入慢

读取慢

检查:慢查询日志;
show processlist 查看当前DB状态,看哪些请求停留较多
top查看mysql进程的开销
代码中记录SQL和执行时间
解决:
手动执行可疑SQL(注意排除query cache的影响),用explain,profile等工具分析SQL性能
再考虑是否优化索引,或者分库分表,或者增加缓存

写入慢
检查:除读取慢的检查方法外,还有
iostat 检查磁盘IO
查看mysql binlog的写入速率
解决:增加缓存,分库分表,优化索引,从业务逻辑上考虑减少DB操作,合并写入

4、其他
被攻击,webserver进程数受限,甚至内网流量过高等原因,都有可能导致访问缓慢,具体情况具体分析
7281356103458

【说几个自己掌握的php的技巧 】

1. 交换变量:list($a,$b) = array($b,$a)

2. list还有个奇怪的用法,可以忽略某一项,有go的下划线的感觉 list(, $a, $b) = array(1, 2, 3);

3. 问: 怎么优化处理autoload呢?
答: PSR-0,PSR-4都是autoload的标准, 里面有两个做法,一个是预先生成classmap,一个是通过类前缀去查找类,查看类路径与定义的话,可以用反射:ReflectionClass::export();  按需加载我一般都会用到spl_autoload_register

4.调试-调用栈:如果知道代码的结束点,可在代码结束点插入dump_trace. 不过这个不能实现调用栈的递归打印。如果不知道代码的结束点,一般是二分三分四分查找,插入debugging(__FILE__ . __LINE__) 确定结束点,。如果可以修改服务器,还是重量级的xdebug最爽,不过xhprof查看调试栈比xdebug要方便得多,因为xdebug还需要借助wincacheview/kcachewind(记不住名)去分析php的执行记录,做性能分析的话,也同样如此。
debug_backtrace的是数组形式,不够精简。我直接用异常$e-> getTraceAsString,封装到一个dTrace函数中自己调用,在里面加入时间,还可以查看每一段的执行时间,很方便。dTrace函数: https://gist.github.com/anonymous/7fef93e541cdc6b38c29

5. php有个配置,我说一个简单的,非常好用,叫做auto-prepend-file,能够在所有的php文件里自动加上一个其他文件 。 这个功能貌似可以用于作访问控制,一些文件不允许通过http直接访问的,以前我都是include一个小文件,有这个方法方便多了

6.phabricator,PHP代码review工具,好用

7、5.3或以前版本序列化json会对汉字作unicode编码,这会功能没什么作用还会增加调用者的工作量,我是在服务端对所有数据作urlencode之后再作json序列化,然后再作urldecode后返回,不知这个算不算技巧,从5.4开始就不用这么麻烦了 

我们知道, 用PHP的json_encode来处理中文的时候, 中文都会被编码, 变成不可读的, 类似”\u***”的格式, 还会在一定程度上增加传输的数据量.

<?php

echo json_encode("中文");

//"\u4e2d\u6587"

这就让我们这些在天朝做开发的同学, 很是头疼, 有的时候还不得不自己写json_encode.

而在PHP5.4, 这个问题终于得以解决, Json新增了一个选项: JSON_UNESCAPED_UNICODE, 故名思议, 就是说, Json不要编码Unicode.

看下面的例子:

<?php

echo json_encode("中文", JSON_UNESCAPED_UNICODE);

//"中文"

怎么样, 是不是让大家很开心的改动? 呵呵, 当然, Json在5.4还加入了: JSON_BIGINT_AS_STRING, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES等选项, 如果有兴趣, 大家可以参看: json_encode

转载请注明:IT世界 » PHP常见问题或技巧整理

您必须 登录 才能发表评论!