php调试

参考资料

http://www.syyong.com/php/Using-strace-GDB-and-tcpdump-debugging-tools-in-PHP.html

性能调试工具

xdebug
webgrind(xdebug的网页版)

用top查看服务器负载和cpu的占用率

技巧:运行 top 时,按「1」打开 CPU 列表,按「shift+p」以 CPU 排序。
shell> strace -cp
通过「c」选项用来汇总各个操作的总耗时,可以帮助查看单个进程的情况。
shell> strace -T -e clone -p
通过「T」选项可以获取操作实际消耗的时间
strace -T cat index.php 2>&1|grep read
参考:https://huoding.com/2015/10/16/474 ( 这篇文章写得很具体)

存在多个版本的php或php-cli与php-fpm加载不同的配置
  1. 懂得通过which php(区别于whereis php)来看是哪个PHP,或者加绝对路径制定php版本。
    另外一个情况就是php-cli与php-fpm得到的执行情况不一样,如在web浏览器中执行是对的,cli下执行是错的。这时候可能是2个环境加载的php.ini不同所致。cli下通过php -i |grep php.ini得到加载了哪个php.ini。而fpm下通过phpinfo()函数可以得到php.ini的绝对路径。
  2. 使用strace工具跟踪程序执行
    strace可以用来查看系统调用的执行,使用strace php test.php,或者strace -p 进程ID。strace就可以帮助你透过现象看本质,掌握程序执行的过程。这个手段是在大型网站,大公司里最常用的。如果没掌握strace,这里只能说抱歉了,我们不接受不会strace的PHPer。
    strace其实也是对程序员基础的考验,如果不懂操作操作系统,完全不懂底层,肯定也达不到会用strace的程度。当然strace对于PHP代码里的死循环是解决不了的。比如你发现一个php-fpm进程CPU100%了,strace恐怕是解决不了的。因为strace是看系统调用,一般都是IO类操作,既然是IO密集,那CPU一定不可能是100%。
    段时间内调用系统函数最多的统计等等,strace -p 进程ID 是查看该进程的系统函数调用情况,对于异步脚本很有用!
    参考:
    https://www.15yan.com/story/fte6mnO2rye/
    https://xnow.me/ops/php-debug.html

3.tcpdump可以抓到网卡的数据通信过程,甚至数据内容也可以抓到。
使用tcpdump可以看到网络通信过程是什么样的,如何时发起了TCP SYN3次握手,何时发送FIN包,何时发送RST包。这是一个基本功,如果不懂tcpdump,证明不具备网络问题解决能力。
监视指定网络接口的数据包:tcpdump -i eth1
如果不指定网卡,默认tcpdump只会监视第一个网络接口,一般是eth0
截获所有192.168.11.15 的主机收到的和发出的所有的数据包:tcpdump host 192.168.11.15
打印helios 与 hot 或者与 ace 之间通信的数据包:tcpdump host helios and ( hot or ace )
打印ace与任何其他主机之间通信的IP 数据包, 但不包括与helios之间的数据包:tcpdump ip host ace and not helios
截获主机hostname发送的所有数据:tcpdump -i eth0 src host hostname
如果想要获取主机210.27.48.1接收或发出的telnet包;tcpdump tcp port 23 and host 210.27.48.1
打印本地主机与Berkeley网络上的主机之间的所有通信数据包(nt: ucb-ether, 此处可理解为'Berkeley网络'的网络地址,此表达式最原始的含义可表达为: 打印网络地址为ucb-ether的所有数据包):tcpdump net ucb-ether
参考:
http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html

你可能感兴趣的:(php调试)