(1) PHP IDE :phpstorm, zend studio,推荐phpstorm
(2) PHP服务器组件: phpStudy、XAMPP,推荐phpStudy
(3)MySql管理工具:Navicat for Mysql、PhpMyAdmin ,推荐Navicat
(4)文本编辑器 : sublime, editplus
(5) 管理代码版本 :github,gitee
(6) 远程连接工具:SecureCRT SecureFX, xshell, ftp
(7) 代码部署工具 :Spug,walle(瓦力)
(8) 接口调试工具:postman
(9) 抓包工具 :whistle,fiddler
(10) 在线文档:石墨文档,知道笔记
(1)最古老的方法-文件输出,写入日志
///输出变量或数组到文件 $fp = fopen('./php.log', 测试; fwrite($fp, print_r($content, true)); fclose($fp); //输出对象到文件 file_put_contents("/php.log", var_export($objects,true), FILE_APPEND); ///一般开发框架包装有记录日志,直接调用即可
(2)PHP扩展----xdebug (本地),xhprof(线上)
下载相应版本的安装:http://www.xdebug.org/download.php
编辑php.ini,加入以下几行
zend_extension=D:\xampp\php\ext\php_xdebug.dll (Win)
zend_extension=/usr/lib/php5/20090626 lfs/xdebug.so(Linux)
xdebug.profiler_enable=on
xdebug.trace_output_dir="../Projects/xdebug"
xdebug.profiler_output_dir="../Projects/xdebug" //你想要放置Xdebug输出数据文件的目的
重启,查看phpinfo()是否有xdebug模块,php -m 查看输出信息,知道它是否成功
除了使用xdebug或者xhprof等PHP扩展分析PHP除了程序,我们还可以使用它linux的命令对PHP分析程序。当然,也有一些缺陷,即只能分析CLI执行的PHP程序。
以下是要分析的PHP脚本
- <?php
- $num="1800";
- $arr=array();
- for($i=0;$i<20000;$i ){
- $arr[]="{$i}";
- }
- sleep(5);
- for($i=0;$i<3000;$i ){
- if(in_array($num,$arr)){
- continue;
- }
- }
第一个命令:time:
解析:linux下time命令可以获得包括程序实际运行时间在内的程序执行时间(real time),以及程序在用户态中运行的时间(user time)内核状态的时间(sys time)。
- -bash-4.1#timephptest.php
- real0m5.675s#实际时间(realtime):从command命令行开始执行到运行终止的消失时间;
- user0m0.665s#用户CPU时间(userCPUtime):用户执行命令执行费用CPU时间,即命令在用户态中执行时间总和;
- sys0m0.007s#系统CPU时间(systemCPUtime):命令执行完成费用的系统CPU时间,即命令在核心态度中执行时间总和。
可以看到,sleep5秒没有占用user和sys,也就是说,sleep并不占用cpu
第二个命令:strace
解析:strace系统调用和接收到的信号常用于跟踪过程执行。在Linux世界不能直接访问硬件设备。当过程需要访问硬件设备(如读取磁盘文件、接收网络数据等)时, 通过系统调用访问硬件设备。strace系统调用可以跟踪一个过程,包括参数、返回值和执行时间。
执行命令:
- strace-ttt-ostrace_resultphptest.php
-ttt 参数表示微秒输出,秒表示时间
-o 参数表示将结果输出到文件中
- 1443442345.373206munmap(0x3915200000,2276448)=0
- 1443442345.373250munmap(0x7f24a0f34000,2347568)=0
- 1443442345.373291munmap(0x7f24a0bf6000,3397480)=0
- 1443442345.373334munmap(0x3914600000,2275920)=0
- 1443442345.373374munmap(0x7f24a07ed000,2113912)=0
- 1443442345.373434munmap(0x7f24a09f2000,2109776)=0
- 1443442345.373474munmap(0x3914a00000,2346240)=0
- 1443442345.373516munmap(0x3917e00000,2201520)=0
- 1443442345.374489munmap(0x7f24a158a000,323584)=0
- 1443442345.374622exit_group(0)=?
在输出结果中,每一行都是系统调用。
第三个命令:ltrace
解析:ltrace命令用于跟踪过程中调用库函数的情况
- -bash-4.1#ltrace-cphptest.php
- ^C%timesecondsusecs/call&nsp; calls function
- ------ ----------- ----------- --------- --------------------
- 55.32 97.979893 233 419223 strtol
- 30.04 53.213711 53213711 1 __libc_start_main
- 9.19 16.272251 305 53287 memcpy
- 3.17 5.621030 279 20107 __ctype_b_loc
- 1.74 3.074011 229 13392 malloc
- 0.12 0.217684 83 2618 strlen
- 0.12 0.205593 18690 11 dlopen
- 0.11 0.194501 79 2445 __ctype_tolower_loc
- 0.06 0.111315 82 1351 strrchr
- 0.02 0.043957 80 545 calloc
- 0.02 0.042310 81 521 free
- 0.02 0.039427 83 475 strcasecmp
- 0.01 0.025975 79 327 realloc
- 0.01 0.022132 11066 2 getprotobyname
- 0.01 0.016168 81 199 memset
- 0.00 0.006055 82 73 strncasecmp
- 0.00 0.004099 87 47 strchr
- 0.00 0.003631 80 45 fileno
上面列出系统函数的调用次数和执行时间,其中发现strtol调用了40w多次。进行优化时,可以考虑从这方向去入手。
strtol是将字符串转化成long型,在代码中,仅有in_array这个函数实现这个操作(由于使用非严格匹配,in_array如果参数可以转化成int类型,会使用int类型进行比较)
简单修改了一下代码:if(in_array($num,$arr,true)){
再次执行:
- % time seconds usecs/call calls function
- ------ ----------- ----------- --------- --------------------
- 29.58 11.395604 11395604 1 __libc_start_main
- 26.64 10.263876 192 53293 memcpy
- 19.79 7.623026 379 20108 __ctype_b_loc
- 13.17 5.075651 378 13393 malloc
- 8.12 3.129727 223 14009 free
- 0.83 0.319670 83 3832 strlen
- 0.53 0.203854 18532 11 dlopen
- 0.50 0.194224 79 2445 __ctype_tolower_loc
可以看到程序执行的时间大大缩短了。
4.其他开源工具:
360的:Phptrace // https://github.com/Qihoo360/phptrace
Phptrace是一种用于PHP的低开销跟踪工具。它可以跟踪运行时所有的PHP执行、函数调用、请求信息.并提供过滤器、统计、当前状态等功能。在所有环境中,特别是在生产环境中,查找阻塞、重载问题和调试非常有用