关于PHP中如何跟踪报错的手段
PHP中发生报错,按照道理可以开启报错提示来进行报错输出:
error_reporting();
ini_set('display_errors','on');
可以查看php.ini中的配置:
error_reporting = E_ALL
和
display_errors = On
的开启情况。
另外,我们也可以通过开启php.ini中的php报错日志来查看,例如:
error_log = "d:/wamp/logs/php_error.log"
此时也许我们会发现我们的apache服务器无法启动了,其实这是很多人碰到的情况,一旦开启php.ini中的error_log日志,apache就无法启动。
我这里已经解决掉了这个问题,为了模拟,我们到php.5.3.5中的ext目录下随便把一个.dll文件剪切掉,例如这个php_dblib.dll,这个是php5.3之后连接mssql的扩展库,是微软提供的而不是php本身,因为php5.3之后已不是原生支持连接mssql,把他剪切掉之后,我们重启apache,就会发现apache已无法启动,这个时候我们去看apache的apache_error.log日志,会发现如下报错:
[Thu Jan 16 11:30:12 2014] [warn] pid file D:/wamp/bin/apache/Apache2.2.17/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
网上很多人出了此报错不知道原因,其实是因为php5.3.5中,如果开启了error_log,那么一定要保证加载的.dll必须存在,否则将无法启动apache,不信我们可以此时关掉apache,然后到php.ini中将error_log前面加上分号注释掉,然后此时再重启启动apache,会发现apache的报错日志apache_error.log中报错如下:
[Thu Jan 16 11:30:12 2014] [warn] pid file D:/wamp/bin/apache/Apache2.2.17/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
[Thu Jan 16 11:38:46 2014] [warn] pid file D:/wamp/bin/apache/Apache2.2.17/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
PHP Warning: PHP Startup: Unable to load dynamic library 'd:/wamp/bin/php/php5.3.5/ext/php_dblib.dll' - \xd5\xd2\xb2\xbb\xb5\xbd\xd6\xb8\xb6\xa8\xb5\xc4\xc4\xa3\xbf\xe9\xa1\xa3\r\n in Unknown on line 0
<br />
<b>Warning</b>: PHP Startup: Unable to load dynamic library 'd:/wamp/bin/php/php5.3.5/ext/php_dblib.dll' - 找不到指定的模块。
in <b>Unknown</b> on line <b>0</b><br />
[Thu Jan 16 11:38:46 2014] [notice] Apache/2.2.17 (Win32) PHP/5.3.8 configured -- resuming normal operations
[Thu Jan 16 11:38:46 2014] [notice] Server built: Oct 18 2010 01:58:12
[Thu Jan 16 11:38:47 2014] [notice] Parent: Created child process 10316
PHP Warning: PHP Startup: Unable to load dynamic library 'd:/wamp/bin/php/php5.3.5/ext/php_dblib.dll' - \xd5\xd2\xb2\xbb\xb5\xbd\xd6\xb8\xb6\xa8\xb5\xc4\xc4\xa3\xbf\xe9\xa1\xa3\r\n in Unknown on line 0
<br />
<b>Warning</b>: PHP Startup: Unable to load dynamic library 'd:/wamp/bin/php/php5.3.5/ext/php_dblib.dll' - 找不到指定的模块。
in <b>Unknown</b> on line <b>0</b><br />
[Thu Jan 16 11:38:47 2014] [notice] Child 10316: Child process is running
[Thu Jan 16 11:38:47 2014] [notice] Child 10316: Acquired the start mutex.
[Thu Jan 16 11:38:47 2014] [notice] Child 10316: Starting 64 worker threads.
[Thu Jan 16 11:38:47 2014] [notice] Child 10316: Starting thread to listen on port 80.
说明确实没有正确加载php_mssql.dll,不信我们此时可以再把php.ini中的error_log开启,然后重启apache(此时无法启动apache),查看apache报错日志:
[Thu Jan 16 11:30:12 2014] [warn] pid file D:/wamp/bin/apache/Apache2.2.17/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
[Thu Jan 16 11:38:46 2014] [warn] pid file D:/wamp/bin/apache/Apache2.2.17/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
PHP Warning: PHP Startup: Unable to load dynamic library 'd:/wamp/bin/php/php5.3.5/ext/php_dblib.dll' - \xd5\xd2\xb2\xbb\xb5\xbd\xd6\xb8\xb6\xa8\xb5\xc4\xc4\xa3\xbf\xe9\xa1\xa3\r\n in Unknown on line 0
<br />
<b>Warning</b>: PHP Startup: Unable to load dynamic library 'd:/wamp/bin/php/php5.3.5/ext/php_dblib.dll' - 找不到指定的模块。
in <b>Unknown</b> on line <b>0</b><br />
[Thu Jan 16 11:38:46 2014] [notice] Apache/2.2.17 (Win32) PHP/5.3.8 configured -- resuming normal operations
[Thu Jan 16 11:38:46 2014] [notice] Server built: Oct 18 2010 01:58:12
[Thu Jan 16 11:38:47 2014] [notice] Parent: Created child process 10316
PHP Warning: PHP Startup: Unable to load dynamic library 'd:/wamp/bin/php/php5.3.5/ext/php_dblib.dll' - \xd5\xd2\xb2\xbb\xb5\xbd\xd6\xb8\xb6\xa8\xb5\xc4\xc4\xa3\xbf\xe9\xa1\xa3\r\n in Unknown on line 0
<br />
<b>Warning</b>: PHP Startup: Unable to load dynamic library 'd:/wamp/bin/php/php5.3.5/ext/php_dblib.dll' - 找不到指定的模块。
in <b>Unknown</b> on line <b>0</b><br />
[Thu Jan 16 11:38:47 2014] [notice] Child 10316: Child process is running
[Thu Jan 16 11:38:47 2014] [notice] Child 10316: Acquired the start mutex.
[Thu Jan 16 11:38:47 2014] [notice] Child 10316: Starting 64 worker threads.
[Thu Jan 16 11:38:47 2014] [notice] Child 10316: Starting thread to listen on port 80.
[Thu Jan 16 11:42:11 2014] [notice] Parent: Received shutdown signal -- Shutting down the server.
[Thu Jan 16 11:42:11 2014] [notice] Child 10316: Exit event signaled. Child process is ending.
[Thu Jan 16 11:42:12 2014] [notice] Child 10316: Released the start mutex
[Thu Jan 16 11:42:13 2014] [notice] Child 10316: All worker threads have exited.
[Thu Jan 16 11:42:13 2014] [notice] Child 10316: Child process is exiting
[Thu Jan 16 11:42:13 2014] [notice] Parent: Child process exited successfully.
[Thu Jan 16 11:42:31 2014] [warn] pid file D:/wamp/bin/apache/Apache2.2.17/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
[Thu Jan 16 11:42:38 2014] [warn] pid file D:/wamp/bin/apache/Apache2.2.17/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
会发现又出现之前的报错了,对吧。印证了此php5.3.5版本中确实存在打开error_log之后需保证apache加载的dll都应存在的版本特性。
好,此特性我们告一段落,知道此特性之后,我们只需要在开启error_log之前查看apache报错日志,将没能正确加载的dll都在php.ini中注释掉,确保apache启动时没有此类报错,则可以使用php的error_log了。
因为我已经将php_dblib.dll从ext中去除了,所以我代码中有一段访问数据库的脚本按理说应该报错,但是此时我通过web访问发现页面空白,没有任何报错,另外php的php_error.log文件中也是一片空白,这是什么情况?@_@,难道会有php报错是无法扑捉到的吗?!!
其实php中的php_error.log应该可以记录所有php报错,但是也有例外,是什么呢?当我去检查代码的时候,才发现我的数据库驱动脚本中是这么写的:
function db_connect()
{
if ($this->port != '')
{
$this->hostname .= ','.$this->port;
}
return @mssql_connect($this->hostname, $this->username, $this->password);
}
大家注意了没有,这个@mssql_connect啊,万恶的@啊,他竟然把本该输出的报错给按回去了,就是这里啊,神啊~~~找了我好半天啊,不信我们这个时候再把@去掉,然后重新访问此脚本,发现页面报错,到php报错日志中查看,也发现以下报错:
[16-Jan-2014 04:03:07] PHP Fatal error: Call to undefined function mssql_connect() in D:\wamp\www\monite\system\database\drivers\mssql\mssql_driver.php on line 63
[16-Jan-2014 04:03:07] PHP Stack trace:
[16-Jan-2014 04:03:07] PHP 1. {main}() D:\wamp\www\monite\index.php:0
[16-Jan-2014 04:03:07] PHP 2. require_once() D:\wamp\www\monite\index.php:202
[16-Jan-2014 04:03:07] PHP 3. Cron_promote->__construct() D:\wamp\www\monite\system\core\CodeIgniter.php:308
[16-Jan-2014 04:03:07] PHP 4. CI_Loader->model() D:\wamp\www\monite\application\controllers\cron_promote.php:17
[16-Jan-2014 04:03:07] PHP 5. Cron_assets_expense_model->__construct() D:\wamp\www\monite\system\core\Loader.php:321
[16-Jan-2014 04:03:07] PHP 6. CI_Loader->database() D:\wamp\www\monite\application\models\BI\cron_assets_expense_model.php:11
[16-Jan-2014 04:03:07] PHP 7. DB() D:\wamp\www\monite\system\core\Loader.php:366
[16-Jan-2014 04:03:07] PHP 8. CI_DB_driver->initialize() D:\wamp\www\monite\system\database\DB.php:153
[16-Jan-2014 04:03:07] PHP 9. CI_DB_mssql_driver->db_connect() D:\wamp\www\monite\system\database\DB_driver.php:123
万恶的@,其实,php_error.log在你不做干预的时候会记录所有报错,除非你把他@掉。当然也许php还有其他报错和阻止报错的手段,等以后发现再补充~~
好吧好吧,就这样了,大家自己玩吧~~有什么新发现可以继续记录,嘿嘿~~
关于PHP中如何跟踪报错的手段相关推荐
- 《一起学习rgbdSLAM》中g2o部分报错的问题
<一起学习rgbdSLAM>中g2o部分报错的问题 在高博的<一起学习rgbdSLAM>第六讲中使用到了g2o工具.但是由于版本问题,按照高博的写法来编写代码在编译过程中会报错 ...
- anconda安装后命令行中安装tensorflow报错
现象 anconda安装后命令行中安装tensorflow报错 pip install --upgrade --ignore-installed tensorflow-gpu Building wh ...
- K.O. -------- Eclipse中Maven的报错处理
----------------------siwuxie095 K.O. -------- Eclipse 中 Maven 的报错处理 1.报错一: A 'Maven Build' configur ...
- python无法启动该程序因为计算机中丢失_python报错:无法启动此程序,因为计算机中丢失...
原标题:python报错:无法启动此程序,因为计算机中丢失 python报错:无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-|1-1-0.dll api-ms-win- ...
- Navicat 远程连接docker容器中的mysql 报错1251 - Client does not support authentication protocol 解决办法
Navicat 远程连接docker容器中的mysql 报错1251 - Client does not support authentication protocol 解决办法 1).容器中登录my ...
- python无法启动此程序因为计算机中丢失_python报错:无法启动此程序,因为计算机中丢失...
原标题:python报错:无法启动此程序,因为计算机中丢失 python报错:无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-|1-1-0.dll api-ms-win- ...
- Eclipse中启动tomcat报错:A child container failed during start
我真的很崩溃,先是workspace崩了,费了好久重建的workspace,然后建立了一个小demo项目,tomcat中启动却报错,挑选其中比较重要的2条信息如下: A child container ...
- Eclipse和MyEclipse使用技巧--解决MyEclipse中的js报错的小方法
今天,下了个模版,但是导进去的时候发现js会报错.看了下其他都没有错误.而有一个js报错误,请原谅我有点红色强迫症,不能留一点红色 . 错误如下: Syntax error on token &quo ...
- python下载库报错_下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决...
下载python中Crypto库报错:ModuleNotFoundError: No module named 'Crypto'的解决 前言 最近在网上找了很多下载Crypto的方法,感觉作用都不算很 ...
最新文章
- 中国编程第一人,李开复欣赏他,百度留不住他...
- python语法基础知识总结-python语法基础知识
- 类似QQ管家页面jquery图片显隐轮换效果
- Android中Gson解析json数据使用@SerializedName注解
- 关于 jsp java servlet 中文汉字乱码的解决方法
- React-引领未来的用户界面开发框架-读书笔记(七)
- exit与_exit函fork与vfork函数
- 【OS学习笔记】五 VirtualBox的下载、安装和配置
- LeetCode MySQL 1747. 应该被禁止的Leetflex账户
- 保留小数点后三位_【Meta分析】Stata制作森林图时,如何保留三位小数?
- suma在c语言中表示什么变量,C语言题
- 计算机硬盘修复教程,DiskGenius数据恢复教程 教你电脑硬盘数据如何恢复
- python列表操作符_Python中list()列表操作符的案例分享
- Protel99SE覆铜笔记
- python绘制缓和曲线_曲线标
- 基于Java的超市水果管理系统_技术分享 - 基于JAVA SWING结合链表的水果超市管理系统...
- 详解Unity中的粒子系统Particle System (七)
- html页面中艺术字,html 生成艺术字
- 计算机专业学微积分有什么用,学微积分有什么用啊?
- android 感应器
热门文章
- Latex自定义文档纸张大小
- 学计算机c语言吗,学习C语言对学习计算机很重吗?
- 《Designing Data-Intensive Application》01数据系统的基石-可靠性/可扩展性/可维护性
- 题目:两道迷宫类型题
- 江苏省各地级市县经纬度查询大全
- 一元二次方程的简单回顾
- 用python花猫_Python竟能画这么漂亮的花,帅呆了(代码分享)
- 上海航芯|推出基于ACX200T的V2X解决方案
- [死磕 Spring 21/43] --- IOC 之 Factory 实例化 bean
- mysql分组查询最新数据