很多PHP程序员调试使用echo、print_r()、var_dump()、printf()等,虽然对于有较丰富开发经验的程序员来说这些也已经足够了,他们往往可以在程序执行的过程中,通过输出特定变量的值可以判断程序执行是否正确,甚至效率高低也可以看出来(当然可能还需要使用一些时间函数)。那么我们为什么还需要一个专门的调试程序来监控我们的程序运行呢?

在我们平时的php开发中,一个大的项目经过长时间的积累以后你会发现性能越来越慢,而性能到底消耗在了什么地方,常常是一个令人头疼的问题,function a()调用了多少次,function b()又消耗了多少时间,我们到底怎么查找是哪个蛀虫拉慢了我们的程序运行速度呢?在这里给大家介绍一款工具xdebug,相信很多人已经听说过了,希望借助这个工具我们可以起到简单分析php程序性能瓶颈的问题。

XDebug是什么

XDebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况。

安装XDebug

    1. 访问 www.xdebug.org ,下载php_xdebug.dll,根据版本号与自己的操作系统、PHP版本下载合适的。
    2. 将下载的php_xdebug.dll放到PHP的安装目录php\ext下。
    3. 编辑php.ini,有些集合环境已自带xdebug的配置,如果没有则自己手动加入下面几行:
1 [xdebug]
2 zend_extension = "/home/ad/php/lib/php/extensions/no-debug-non-zts-20060613/xdebug.so"
3 xdebug.auto_trace = on
4 xdebug.auto_profile = on
5 xdebug.collect_params = on
6 xdebug.collect_return = on
7 xdebug.profiler_enable = on
8 xdebug.trace_output_dir = "/home/ad/xdebug_log"
9 xdebug.profiler_output_dir = "/home/ad/xdebug_log"

XDebug参数简介:

    • zend_extension 加载xdebug扩展
    • xdebug.auto_trace 自动打开打开函数调用监测
    • xdebug.auto_profile 自动打开性能监测
    • xdebug.trace_output_dir 设定函数调用监测信息的输出文件的路径。
    • xdebug.profiler_output_dir 设定效能监测信息输出文件的路径。
    • xdebug.collect_params 打开收集“函数参数”的功能。将函数调用的参数值列入函数过程调用的监测信息中。
    • xdebug.collect_return 打开收集“函数返回值”的功能。将函数的返回值列入函数过程调用的监测信息中。
  1. 重启Apache。
  2. 写一个test.php,内容为<?php phpinfo(); ?>,如果输出的内容中有看到xdebug,说明安装配置成功。或者去/home/ad/xdebug_log下看看是不是日志已经出来了。

设置选项

Category Setting Description

日志

xdebug.trace_output_dir

日志追踪输出目录
xdebug.trace_output_name 日志文件名,xdebug提供了一系列的标识符,生成相应格式的文件名,具体请参考官网
xdebug.trace_options 记录添加到文件中方式:1 = 追加(如果存在该文件). 0 (default) = 覆盖(如果存在该文件)
显示数据 xdebug.collect_params 非零值 = 控制function的参数显示选项

  • 0 = 不显示.
  • 1 = 参数类型,值  (例如:array(9)).
  • 2 = 同上1,只是在CLI模式下略微有区别
  • 3 = 所有变量内容
  • 4 = 所有变量内容和变量名(例如:array(0 => 9)).
xdebug.collect_return 1 = 显示function返回值. Default 0 不显示
xdebug.collect_vars 1 = 显示当前作用域使用了哪些变量,显示变量名,该选项不会记录变量的值,如果需要,使用xdebug.collect_params
xdebug.collect_assignments 1 = 添加一行显示变量赋值(若为1,形如$a = 1;这类Assignment Expression会在trace文件里显示)
格式 xdebug.trace_format
  • 0 = 人可读. 从左至右每列分别表示:时间点, 内存, 内存差 (需要设置xdebug.show_mem_delta=1), 等级, 函数名,函数参数 (需要设置,xdebug.collect_params=1,只要是非零), 当前代码行所在文件名 , 行号.
  • 1 = 机器可读[1]. 需要借助第三方app,例如:xdebug trace file parser 或者 xdebug trace viewer
  • 2 = html格式 即table,用browser打开,显示table
xdebug.show_mem_delta 1 = 显示每次函数调用内存消耗(内存差)
行为  xdebug.auto_trace 1 = 打开自动追踪. (追踪方式有2种,一种是自动追踪,所有php脚本运行时,都会产生trace文件;另一种是触发方式追踪,如下)
xdebug.trace_enable_trigger[2]

1 = 使用 XDEBUG_TRACE GET/POST 触发追踪, 或者通过设置cookie XDEBUG_TRACE. 为了避免每次请求时,都会生成相应trace追踪文件,你需要把auto_trace设置为0

注:该特性只在2.2+版本才能设置

[xdebug-general] Re: Is trace_enable_trigger defunct?

限制 xdebug.var_display_max_depth 数组和对象元素显示深度:主要用在数组嵌套,对象属性嵌套时,显示几级的元素内容. Default 3.
xdebug.var_display_max_data 变量值为字符串时显示多长. Default 512.
xdebug.var_display_max_children 数组和对象元素显示的个数. Default 128

一些自定义函数

Function Description
void xdebug_enable() 手动打开,相当于xdebug.default_enable=on
void var_dump() 覆写php提供的var_dump,出错时,显示函数堆栈信息,(前提:php.ini里html_errors为1),使用xdebug.overload_var_dump 设置是否覆写
void xdebug_start_trace( 
string trace_file_path 
[, integer options] )
手动控制需要追踪的代码段
trace_file_path :文件路径(相对或绝对,若为空).如果为空,或者不传参, 使用xdebug.trace_output_dir设置的目录
options :

  • XDEBUG_TRACE_APPEND: 1 = 追加文件内容末尾, 0 = 覆写该文件
  • XDEBUG_TRACE_COMPUTERIZED:
    • 2 =同 xdebug.trace_format=1 .
  • XDEBUG_TRACE_HTML: 4 = 输出HTML表格,浏览器打开为一table
void xdebug_stop_trace() 停止追踪,代码追踪在该行停止
string xdebug_get_tracefile_name() 获得输出文件名,与 xdebug.auto_trace配合使用.
void xdebug_var_dump([mixed var[,...]])  输出变量详细信息,相当于php里的var_dump,具体显示请看这里
xdebug.show_local_vars  默认为0,不显示;非零时,在php执行出错时,显示出错代码所在作用域所有本地变量(注:这会产生大量信息,因此默认是closed),具体显示差别如下图[3]
array xdebug_get_declared_vars() 显示当前作用域中已声明的变量
array xdebug_get_code_coverage() 显示某一段代码内,代码执行到哪些行[4]

关于xdebug.trace_format=1,如果你使用触发方式启用代码追踪:(xdebug.auto_trace = 0;xdebug.trace_enable_trigger = 1),那么,你可以在URL里添加XDEBUG_TRACE,例如:localhost/test.php?XDEBUG_TRACE,或者localhost//test.php?XDEBUG_TRACE=1(任意值)。

是不是觉得很麻烦,那么装个插件,让它来帮你。Chrome XDEBUG Helper,使用它,你可以切换3种状态,disabled ,debugging enabled,profiling enabled(下篇详细介绍),然后切换到debugging enabled。运行该脚本,(去掉URL里的?XDEBUG_TRACE),就可以代码跟踪了。

使用xdebug_start_trace()和xdebug_stop_trace()可以手动追踪你的代码执行情况。

1 xdebug_start_trace();
2 //your code required to trace
3 xdebug_stop_trace();

设定 xdebug.auto_trace = 1 将在执行所有 PHP 脚本之前先启用自动跟踪。另外,您可以通过代码设定 xdebug.auto_trace = 0,并分别使用 xdebug_start_trace() 和 xdebug_stop_trace() 函数启用和禁用跟踪。但是,如果 xdebug.auto_trace 为 1,则可以在包括配置好的 auto_prepend_file 之前先启动跟踪。

选项 xdebug.trace_ouput_dir 和 xdebug.trace_output_name 用于控制保存跟踪输出的位置。在这里,所有文件都被保存到 /tmp/traces 中,并且每个跟踪文件都以 trace 为开头,后接 PHP 脚本的名称(%s)以及进程 ID(%p)。所有 Xdebug 跟踪文件都以 .xt 后缀结尾。

默认情况下,XDebug 将显示时间、内存使用量、函数名和函数调用深度字段。如果将 xdebug.trace_format 设为 0,则输出将符合人类阅读习惯(将参数设为 1 则为机器可读格式)。此外,如果指定 xdebug.show_mem_delta = 1,则可以查看内存使用量是在增加还是在减少,而如果指定 xdebug.collect_params = 4,则可以查看传入参数的类型和值。要监视每个函数返回的值,请设定 xdebug.collect_return = 1。

php可逆加密解密函数的更多相关文章

  1. 各种加密解密函数(URL加密解密、sha1加密解密、des加密解密)

    原文:各种加密解密函数(URL加密解密.sha1加密解密.des加密解密) 普通hash函数如md5.sha1.base64等都是不可逆函数.虽然我们利用php可以利用这些函数写出可逆函数来.但是跨语 ...

  2. 介绍几个PHP 自带的加密解密函数

    PHP 自带的加密解密函数 目前经常使用的加密函数有:md5(), sha1(), crypt(), base64_encode(), urlencode() . 其中 md5(), sha1(), ...

  3. php自带加密解密函数

    php自带加密解密函数 一.总结 一句话总结:可逆和不可逆函数. 二.php自带加密解密函数 1.不可逆的加密函数为:md5().crypt() md5() 用来计算 MD5 哈稀.语法为:strin ...

  4. 2个比较经典的PHP加密解密函数分享

    项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理. 最常见的应用在用户登录以及一些AP ...

  5. php中base64_decode与base64_encode加密解密函数

    php中base64_decode与base64_encode加密解密函数,实例分析了base64加密解密函数的具体用法,具有一定的实用价值,需要的朋友可以参考下 本文实例讲述了php中base64_ ...

  6. onethink加密解密函数

    onethink中封装的加密解密函数 <?php /** * 系统加密方法 * @param string $data 要加密的字符串 * @param string $key 加密密钥 * @ ...

  7. C# 字符串加密解密函数

    原文:C# 字符串加密解密函数 using System; using System.Text;using System.Security.Cryptography; using System.IO; ...

  8. PHP 2个比较经典的加密解密函数

    这篇文章主要介绍了2个比较经典的PHP加密解密函数分享,一个是Discuz!的authcode加密函数(带详细分解),一个是encrypt()函数,都比较经典,需要的朋友可以参考下 项目中有时我们需要 ...

  9. 一组PHP可逆加密解密算法

    对于大部分密码加密,我们可以采用md5.sha1等方法.可以有效防止数据泄露,但是这些方法仅适用于无需还原的数据加密. 对于需要还原的信息,则需要采用可逆的加密解密算法. 下面一组PHP函数是实现此加 ...

随机推荐

  1. redis服务部署脚本

    yum install -y gcc jemalloc-devel cd /usr/local/src curl -L -O http://download.redis.io/releases/red ...

  2. C#进行数据筛选(一)

    这里介绍数据筛选的第一种方式,不用过滤器,给新手看得 public DataTable SourceList(string Wmain, string OrderNo, string Process) ...

  3. Navicat11全系列激活工具和使用方法

    Navicat特别好使,但是就是得注册,在网上看到了一个激活工具,成功激活了Navicat...工具链接地址是.. https://files.cnblogs.com/files/miantiaoan ...

  4. Codeforces833A

    A. The Meaningless Game time limit per test:1 second memory limit per test:256 megabytes input:stand ...

  5. SDN架构

    一:网络设备(Network Devices) 二:南向接口(Southbound Interface) 三:控制器(Controllers) 四:北向接口(Northbound Interface) ...

  6. DNS协议详解

    DNS协议详解 简介 DNS(Domain Name System)域名系统,主要实现的功能是将域名转换成ip地址的一个服务.它是由一个分层的DNS服务器实现的分布式数据库,同时.他也是一个使得主机能 ...

  7. page、request、session和application有什么区别?

    转自:http://liuyuru.iteye.com/blog/773367 1.简单说 page指当前页面.在一个jsp页面里有效 2.request 指从http请求到服务器处理结束,返回响应的 ...

  8. React之设置元素的滚动条

    在React中,解耦了对DOM元素的操作,但有时我们确实需要对DOM操作,比如设置元素的滚动条,这时ref就满足了我们的需求 在低版本的react中,ref可以是一个string类型的属性,通过thi ...

  9. 纯小白入手 vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单

    vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 我的 github 地址 - vue3.0St ...

  10. python实现分页插件

    class Pages: def __init__(self, current_page, data_count, per_page_count=10, pager_num=7):#pager_num ...