资讯详情

php基础(07):开发工具和调试方法

(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脚本

  1. <?php
  2. $num="1800";
  3. $arr=array();
  4. for($i=0;$i<20000;$i ){
  5. $arr[]="{$i}";
  6. }
  7. sleep(5);
  8. for($i=0;$i<3000;$i ){
  9. if(in_array($num,$arr)){
  10. continue;
  11. }
  12. }

第一个命令:time:

解析:linux下time命令可以获得包括程序实际运行时间在内的程序执行时间(real time),以及程序在用户态中运行的时间(user time)内核状态的时间(sys time)。

  1. -bash-4.1#timephptest.php
  2. real0m5.675s#实际时间(realtime):从command命令行开始执行到运行终止的消失时间;
  3. user0m0.665s#用户CPU时间(userCPUtime):用户执行命令执行费用CPU时间,即命令在用户态中执行时间总和;
  4. sys0m0.007s#系统CPU时间(systemCPUtime):命令执行完成费用的系统CPU时间,即命令在核心态度中执行时间总和。

可以看到,sleep5秒没有占用user和sys,也就是说,sleep并不占用cpu

第二个命令:strace

解析:strace系统调用和接收到的信号常用于跟踪过程执行。在Linux世界不能直接访问硬件设备。当过程需要访问硬件设备(如读取磁盘文件、接收网络数据等)时, 通过系统调用访问硬件设备。strace系统调用可以跟踪一个过程,包括参数、返回值和执行时间。

执行命令:

  1. strace-ttt-ostrace_resultphptest.php

-ttt 参数表示微秒输出,秒表示时间

-o 参数表示将结果输出到文件中

  1. 1443442345.373206munmap(0x3915200000,2276448)=0
  2. 1443442345.373250munmap(0x7f24a0f34000,2347568)=0
  3. 1443442345.373291munmap(0x7f24a0bf6000,3397480)=0
  4. 1443442345.373334munmap(0x3914600000,2275920)=0
  5. 1443442345.373374munmap(0x7f24a07ed000,2113912)=0
  6. 1443442345.373434munmap(0x7f24a09f2000,2109776)=0
  7. 1443442345.373474munmap(0x3914a00000,2346240)=0
  8. 1443442345.373516munmap(0x3917e00000,2201520)=0
  9. 1443442345.374489munmap(0x7f24a158a000,323584)=0
  10. 1443442345.374622exit_group(0)=?

在输出结果中,每一行都是系统调用。

第三个命令:ltrace

解析:ltrace命令用于跟踪过程中调用库函数的情况

  1. -bash-4.1#ltrace-cphptest.php
  2. ^C%timesecondsusecs/call&nsp;  calls      function  
  3. ------ ----------- ----------- --------- --------------------  
  4.  55.32   97.979893         233    419223 strtol  
  5.  30.04   53.213711    53213711         1 __libc_start_main  
  6.   9.19   16.272251         305     53287 memcpy  
  7.   3.17    5.621030         279     20107 __ctype_b_loc  
  8.   1.74    3.074011         229     13392 malloc  
  9.   0.12    0.217684          83      2618 strlen  
  10.   0.12    0.205593       18690        11 dlopen  
  11.   0.11    0.194501          79      2445 __ctype_tolower_loc  
  12.   0.06    0.111315          82      1351 strrchr  
  13.   0.02    0.043957          80       545 calloc  
  14.   0.02    0.042310          81       521 free  
  15.   0.02    0.039427          83       475 strcasecmp  
  16.   0.01    0.025975          79       327 realloc  
  17.   0.01    0.022132       11066         2 getprotobyname  
  18.   0.01    0.016168          81       199 memset  
  19.   0.00    0.006055          82        73 strncasecmp  
  20.   0.00    0.004099          87        47 strchr  
  21.   0.00    0.003631          80        45 fileno  

上面列出系统函数的调用次数和执行时间,其中发现strtol调用了40w多次。进行优化时,可以考虑从这方向去入手。

strtol是将字符串转化成long型,在代码中,仅有in_array这个函数实现这个操作(由于使用非严格匹配,in_array如果参数可以转化成int类型,会使用int类型进行比较)

简单修改了一下代码:if(in_array($num,$arr,true)){

再次执行:

  1. % time     seconds  usecs/call     calls      function  
  2. ------ ----------- ----------- --------- --------------------  
  3.  29.58   11.395604    11395604         1 __libc_start_main  
  4.  26.64   10.263876         192     53293 memcpy  
  5.  19.79    7.623026         379     20108 __ctype_b_loc  
  6.  13.17    5.075651         378     13393 malloc  
  7.   8.12    3.129727         223     14009 free  
  8.   0.83    0.319670          83      3832 strlen  
  9.   0.53    0.203854       18532        11 dlopen  
  10.   0.50    0.194224          79      2445 __ctype_tolower_loc  

可以看到程序执行的时间大大缩短了。

4.其他开源工具:

360的:Phptrace  // https://github.com/Qihoo360/phptrace

Phptrace是一种用于PHP的低开销跟踪工具。它可以跟踪运行时所有的PHP执行、函数调用、请求信息.并提供过滤器、统计、当前状态等功能。在所有环境中,特别是在生产环境中,查找阻塞、重载问题和调试非常有用

标签: 3917连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台