⑴ 如何使用php日志调试rewrite规则
RewriteLog "/myfolder/mylogfile.log"
RewriteLogLevel 9
这样apache可以自动生成一个重写日志,看着日志调试就方便了
Rewriteloglevel 0 代表关闭,9代表开启最大debug输出,调为9可以看到最详细的重写匹配信息
可是IIS环境呢,这个有点麻烦,于是我用网上搜的一个log类来做日志
大致原理是这样的,在网站的index.php这里写一段
$log = new log("/logs/sys.log");
$log->logThis($_SERVER["REQUEST_URI"]);
//$_SERVER["REQUEST_URI"] 是重写的实际执行页面
⑵ php程序调试方法总结
相信很多朋友们都有调试程序的经历 然而很多时候调试程序是痛苦而又漫长的过程;它不仅需要细心 更需要耐心 切忌心浮气躁 但是当找出问题并顺利解决它时 又会给人无比激动的喜悦 这里总结一下笔者在程序调试中的使用的原则 工具 以及方法 这里需要说明的是 某些原则性的东西 各种语言都是差不多的 而涉及到具体的工具和某些具体的调试方法 这里只涉及web开发方面的内容
总体原则
找出问题原因
程序需要调试 是因为程序有问题 而调试的第一目标是找到原因 常见调试方法 排除法: 当我们面对整个复杂的系统时 常常完全不知道问题出在什么地方;这个时候可以先将与问题不相关的地方排排除 逐渐缩小调试范围 独立模块法: 大部分程序都有模块结构 将可疑模块单独拿出来 模拟输入相应的操作数据 看是否出现问题 比较法 如果程序或系统是基于某个平台时 可以先看看其他基于本平台的程序或系统 找出是平台问题还是本程序问题 很多时候这种方法是用来排除不成熟平台上的隐藏问题 对比法 对于自己实现的程序 可能已经有相应的开源的模块 可以把这些程序源码找出来 和自己的程序进行对比 这样不仅节省时间 还能借鉴别人的优秀之处
问题定位
问题原因的多种多样 可能这个时候你只能知道是什么样的问题 可能与什么相关 这个时候就需将出现的代码段找出来 而需要做到这一步 一般开发环境为我们提供很多实用工具 借助这些工具 可以一步一步地查看程序的输入和输出 根据每一步的输入输出 定位问题
有一部分很厉害的人 可以通过阅读代码 找到出现问题的地方 但是很多问题都是调试者自己因为疏忽造成的 而要通过这样方式去查找问题 几乎是不可能的 因为已经形成固定的思维定势
解决问题
找到问题的原因和相应代码行 解决它很多时候是一件比较简单的事 因为这些问题往往自己疏忽或者自己考虑不周 但是某些时候并不总是这样的 而是由于外部环境造成的 比如你的网站访问的人数增多 你当初没有考虑到这些数据压力 同时也没有考虑到高度并发性的问题 这个时候问题解决起来是你觉得比较棘手 而要解决这样的问题 不仅仅要专注程序 更要从系统架构方面着手 综合各方面的知识 进行全面的考虑
web开发常用调试工具
俗话说 工欲善其石 必先利其器 对于程序的调试 也必须借助外部工具 这里介绍几种在开发web程序中常常用到的工具
xdebug xhprof php性能调试工具 他们都是php的一种扩展 可以很方便的安装和配置 这两个工具主要是将你程序的内部运行状况 调用函数以一种简洁的方式告诉你 让你对程序在什么地方占用过多的资源 那些地方需要进行优化一目了然 顺便提一下 xdebug生成的profile文件一般借助winCacheGrid查看
firephp firbug 前者主要是php的调试工具 而后者是web开发必不可少的工具 它不仅能查看请求 还能调试js css
在ie下面可以使用HttpWatch 如果需要将数据做深入分析 可以使用抓包工具
php中常使用的调试函数 error_report var_mp print_r var_export
mysql apache/nginx的常用的调试技巧 分析他们日志文件也是相当重要 在linux下查看日志文件的常用命令 cat more less grep awk sed
常见的调试技巧和方法
下面以我调试的程序来介绍一下具体的调试方法和技巧
例子 这是一个php开发的游戏引擎 主要功能提供双发球员移动位置 状态 传球 技能等功能控制 整个程序通过xml文件保存结果 突然某天 有两个用户进行比赛 返回的xml不符合正常的结构 从返回的结果来看 球员的移动位置有些不正常 其中少了某些步骤 于是决定从游戏的AI入手查找 但是也没有发现此处有什么异常 最后将输入的球员数据打印出来 然后将中间产生的数据也打印出来 结合程序的处理逻辑 发现是这两个用户有同一个球员 因此导致在处理的时候 两个人的球员出现混乱 找到原因后 就将这个以球员标识改为以球队和球员共同决定即可
例子 程序刚上线 有些热心的朋友们喜欢对程序进行一些压力测试 某次突然 w的请求很大的一个静态资源 直接导致硬盘瘫痪 对于这种情况 必须查看访问日志 才知道发生什么事 否则人家对你攻击了 你还找不到原因 当然对于这样的攻击 直接把静态资源放到cdn上 另外 随着访问用户量的增大 系统的压力增大 反应逐渐变慢 我们不得不考虑 以前只需要 几毫秒能处理的程序 现在需要 几秒 这个时候程序的并发性设计就很重要了 否则会造成数据异常的情况
例子 使用外部软件出现异常 例如使用memcached的时候 如果某台没有启动或者不能使用了 这个时候nginx一般就会对某些使用memcache的请求返回 是不是感觉有点无厘头 可以考虑改写memcahce 的php扩展了
lishixin/Article/program/PHP/201311/21278
⑶ 如何 gdb 调试php-fpm
1,安装strace
[html] view plain
sudo apt-get install strace
2,查看php-fpm进程
[html] view plain
vagrant@vagrant-ubuntu-precise-64:~$ ps -ef | grep php-fpm
root 2105 1 0 04:02 ? 00:00:02 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)
www-data 2105 0 04:02 ? 00:00:02 php-fpm: pool www
www-data 18481 2105 0 07:05 ? 00:00:01 php-fpm: pool www
www-data 18513 2105 0 07:06 ? 00:00:03 php-fpm: pool www
vagrant 19312 6379 0 10:14 pts/4 00:00:00 grep --color=auto php-fpm
3,调试进程输出日志到文件
[html] view plain
vagrant@vagrant-ubuntu-precise-64:~$ sudo strace -f -p 2105 -e trace=file -o /temp/trace.log
Process 2105 attached - interrupt to quit
Process 19349 attached
Process 19350 attached
4,查看日志文件
[html] view plain
tail -f /temp/trace.log
⑷ 如何使用php日志调试rewrite规则
rewrite
是nginx 和 apache web服务器的事情。一般不用。看这两个web服务器的错误日志
⑸ php异步调试和线上调试网站程序
php异步调试和线上调试网站程序
php异步调试和线上调试网站程序既方便网站程序错误调试,又不影响网站的正常运行的调试方法。下面是我为大家带了的php异步调试和线上调试网站程序,欢迎阅读。
php异步调试和线上调试网站程序
代码如下
//ini_set('error_reporting',E_ALL ^ E_NOTICE);//显示所有除了notice类型的错误信息
ini_set('error_reporting',E_ALL);//显示所有错误信息
ini_set('display_errors',off);//禁止将错误信息输出到输出端
ini_set('log_errors',On);//开启错误日志记录
ini_set('error_log','C:/phpernote');//定义错误日志存储位置
另外附加两句比较常用的排除错误信息的PHP语句:
代码如下
@ini_set('memory_limit','500M');//设置程序可占用最大内存为500MB
@ini_set('max_execution_time','180');//设置允许程序最长的执行时间为180秒
补充
die()和exit()也是我们常用的php调试一个方法
die()和exit()函数都有终止线程的作用,是php断点调试需要使用的最主要的函数,它们也是php程序员使用非常频繁的函数。然而两者又有什么区别呢?在程序调试时需要注意什么问题呢?
die()函数一般与“or”一并使用,写作“or die()”,经常看到这样的语句:
代码如下
$file = fopen($filename, 'r') or die("抱歉,无法打开: $filename")
or在这里是这样理解的,因为在PHP中并不区分数据类型,所以$file既可以是int也可以bool,所以这样的语句不会报错。但其处理过程可能有些朋友不大明白。其实在大多数的语言中, bool or bool这样的语句中,如果前一个值为真后一个值就不会再判断了。这里也是的,所以如果fopen函数执行正确的话,会返回一个大于0的int值(这其实就是"真"),后面的语句就不会执行了。如果fopen函数执行失败,就会返回false,那么就会判断后面的表达式是否为真了。结果执行了die()之后,不管返回什么,程序都已经停止执行了,并且显示指定的.出错信息,也就达到了调试的目的。就这样。
实际上,die和exit是等价的,都是用来终止当前脚本。
php手册对两者的解释如是说:
exit() 函数输出一条消息,并退出当前脚本。该函数是 die() 函数的别名。
die() 函数输出一条消息,并退出当前脚本。该函数是 exit() 函数的别名。
实例:
代码如下
<?php $site = "http://www.111cn.net/"; fopen($site,"r") or exit("Unable to connect to $site"); ?>
<?php $site = "http://www.111cn.net/"; fopen($site,"r") or die("Unable to connect to $site"); ?>
var_mp()和print_r()
var_mp -- 打印变量的相关信息
void var_mp ( mixed expression [, mixed expression [, ...]] )
此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
提示: 为了防止程序直接将结果输出到浏览器,可以使用输出控制函数(output-control functions)来捕获此函数的输出,并把它们保存到一个例如 string 类型的变量中。
代码如下
<?php
$a = array (1, 2, array ("a", "b", "c"));
var_mp ($a);
$b = 3.1;
$c = TRUE;
var_mp($b,$c);
?>
var_mp()可以输出多个变量,如:var_mp($b,$c)
print_r -- 打印关于变量的易于理解的信息
bool print_r ( mixed expression [, bool return] )
注: 参数 return 是在 PHP 4.3.0 的时候加上的
print_r() 显示关于一个变量的易于理解的信息。如果给出的是 string、integer 或 float,将打印变量值本身。如果给出的是 array,将会按照一定格式显示键和元素。object 与数组类似。
记住,print_r() 将把数组的指针移到最后边。使用reset() 可让指针回到开始处。
代码如下
<pre>
<?php
$a = array ('a' => 'apple',
'b' => 'banana',
'c' => array ('x','y','z'));
print_r ($a);
?>
</pre>
上边的代码将输出:
<pre> Array ( [a] => apple [b] => banana [c] => Array ( [0] => x [1] => y [2] => z ) ) </pre>
如果想捕捉 print_r() 的输出,可使用 return 参数。若此参数设为 TRUE,print_r() 将不打印结果(此为默认动作),而是返回其输出。
例子:return 参数示例
代码如下
<?php
$b = array ('m' => 'monkey',
'foo' => 'bar',
'x' => array ('x', 'y', 'z'));
$results = print_r ($b, true); //$results 包含了 print_r 的输出结果
?>
注: 如果想在 PHP 4.3.0 之前的版本中捕捉 print_r() 的输出,可使用输出控制函数。
注: 在 PHP 4.0.4 之前的版本中,如果给出的 array 或 object 包含了直接或间接指向自身的引用,print_r() 将永远继续下去。print_r($GLOBALS) 就是一个例子,因为 $GLOBALS 自身即是全局变量,其包含了指向自身的引用。
下面的几个函数可以让你随时查看程序中任何变量的类型及其值。
代码如下
function ss_array_as_string (&$array, $column = 0) {
$str = "Array(
n";
while(list($var, $val) = each($array)){
for ($i = 0; $i < $column+1; $i++){
$str .= "&nbsp;&nbsp;&nbsp;&nbsp;";
}
$str .= $var. ==>; ;
$str .= ss_as_string($val, $column+1)."
n";
}
for ($i = 0; $i < $column; $i++){
$str .= "&nbsp;&nbsp;&nbsp;&nbsp;";
}
return $str.);
}
function ss_object_as_string (&$object, $column = 0) {
if (empty($object->;classname)) {
return "$object";
}
else {
$str = $object->;classname."(
n";
while (list(,$var) = each($object->;persistent_slots)) {
for ($i = 0; $i < $column; $i++){
$str .= "&nbsp;&nbsp;&nbsp;&nbsp;";
}
global $$var;
$str .= $var. ==>; ;
$str .= ss_as_string($$var, column+1)."
n";
}
for ($i = 0; $i < $column; $i++){
$str .= "&nbsp;&nbsp;&nbsp;&nbsp;";
}
return $str.);
}
}
function ss_as_string (&$thing, $column = 0) {
if (is_object($thing)) {
return ss_object_as_string($thing, $column);
}
elseif (is_array($thing)) {
return ss_array_as_string($thing, $column);
}
elseif (is_double($thing)) {
return "Double(".$thing.")";
}
elseif (is_long($thing)) {
return "Long(".$thing.")";
}
elseif (is_string($thing)) {
return "String(".$thing.")";
}
else {
return "Unknown(".$thing.")";
}
}
;
⑹ debug.php调试文件应该放哪里
开启debug调试模式,只需要主入口文件里面定义一个常量。
define(‘APP_DEBUG’,TRUE); //开启调试模式
然后在配置文件config.php里面定义一个参数开启页面trace显示信息,如下
‘SHOW_PAGE_TRACE’ =>true, //开启页面Trace
这样就已经配置好了,开启调试模式后项目会去加载thinkphp核心包的Conf目录下面的默认的debug.php文件,你也可以在你的项目配置目录下面自定义一个debug.php,这样就可以覆盖核心包里面的默认文件了,我们来看下默认的debug.php都是配置一些什么参数
return array(
'LOG_RECORD'=>true, // 进行日志记录
'LOG_EXCEPTION_RECORD' =>
true, // 是否记录异常信息日志!
⑺ thinkphp5.0日志详情
这就是 thinkPHP 在开发模式下内置的调试工具和函数如 Trace 在 log 中记录的对当前请求的详细信息;这些调试信息在 console 浏览器控制台也可以看到;在正式上线后应该关闭调试模式即可;
调试模式并不能完全满足我们调试的需要,有时候我们需要手动的输出一些调试信息。除了本身可以借助一些开发工具进行调试外,ThinkPHP还提供了一些内置的调试工具和函数。
官方说明文档地址
网页链接
网页链接
⑻ thinkphp怎么开启调试模式
thinkphp开启调试模式的方法:
1、开启调试模式,首先在入口文件打开调试开关:
//开启调试模式
define('APP_DEBUG',true);
2、然后需要配置调试文件,该文件位于项目配置目录下,默认名字为 debug.php:
<?php
return array(
// 开发环境配置信息
'DB_TYPE' =>'mysql',
'DB_HOST' =>'localhost',
'DB_NAME' =>'mydb',
'DB_USER' =>'root',
'DB_PWD' =>'root123',
'DB_PORT' =>'3306',
'DB_PREFIX' =>'my_',
);
?>
配置完调试配置文件之后,调试模式就配置成功了。
3、在 Index 模块的 index 操作写入如下测试代码:
public function index(){
$Dao = M('User');
$user_list = $Dao->select();
$this->display();
}
4、在页面上虽然没有做任何逻辑输出,但是却有系统调试信息,下面是页面 Trace 信息截图:

⑼ PHP调试函数和日志记录函数分享
网站程序开发过程经常需要调试,发布阶段也需要记录运行日志,方便发现问题和还原事件。这就要求有调试和日志记录功能。
下面分别写了用于调试的函数和用于记录错误的函数。
使用方法很简单,且自动根据日期生成日志文件:
复制代码
代码如下:
//调试时,多个参数都可以:
sysdebug("hello");
sysdebug("hello",
"tiger
is
coming
now");
//错误记录也一样:
syserror("error");
syserror("error",
"unfortunately
tiger
is
dead
",
"we
are
sad");