在PHP中检查PHP文件是否有语法错误的方法


Posted in PHP onDecember 23, 2009

之前在当当的时候的一个项目中用到了一个简单的模板引擎,其实也是借鉴discuz来做的模板引擎,很简单,它所作的事情就是把一些自定义的标签编译成php代码。已经说了很简单了,所以编译的时候也名优进行模板语法的检查,那么在开发过程中就会出现编译出来的php文件有语法问题,有语法问题没有关系,我修改重新编译一下就好了。首先不能在每次请求的时候都把php模板重新编译一下,会严重影响性能,折中的处理时在每个编译好的php文件末尾检查一下该模板文件是否已经修改过,根据设定的更新频率,如果又需要则重新编译模板文件,现在的问题是编译出来的php文件自己有语法错误,根本执行不到模板检查那一步,所以即使修改了模板文件中的问题也不会重新编译。 所以我想寻找一种简单的方法来检查生成的php文件是否合法。不合法就重新编译,这样开发过程中就不用出现错误就得手动删除缓存文件了。

在网上找了一下。刚开始以为 token_get_all()函数能处理语法错误的问题,结果发现,它只是做简单的词法分析。没有办法。后来到论坛上去问了一下

http://groups.google.com/group/professional-php/browse_thread/thread/b8581f6b07b10ff0/2601a63c406bb1c1?lnk=gst&q=reeze#2601a63c406bb1c1

有人告诉我有这样一个函数 php_check_syntax() http://www.php.net/manual/en/function.php-check-syntax.php 我想问题就这么坚决了。。我真应该RTF(Read The Fuck Mannual). 仔细一看。这个函数已近被弃用了:
Note: For technical reasons, this function is deprecated and removed from PHP. Instead, use php -l somefile.php from the commandline.

这个technical reason 到底是什么呢? 先不管了,以后再慢慢研究,反正不能使用这个方法就对了。
他们的建议是使用命令行$php -l filename.php 来检查语法。
Gary Every给了我一个代码片段参考:

在命令行下检查问题也不大。如果我要放在在线应用呢? 这就涉及到可移植性的问题了。首先是操作系统,然后就是环境变量。这样的话就会依赖于服务器端的配置。在http://www.php.net/manual/en/function.php-check-syntax.php 上有人贴出了自己的php_check_syntax()函数实现。
有的采用的就是上面的命令行的方法。
后面有提到使用eval的方法来验证。eval方法会执行传入的代码, 如果代码有语法错误则会抛出parser error, 可以使用'@'错误抑制符去掉错误信息,eval和echo一样并不是函数,不能使用变量函数的方法调用比如:
$func = ‘eval'
$func()这样的调用就是无效的。它会提示没有eval函数,如果你自己定义这么一个函数也是有问题的。因为eval是一个关键字。
eval调用和include差不多,如果被包含文件中没有明确return就返回null。如果直接eval我们需要检查的文件会造成被检查的文件内代码被执行,这可不是我们想要的,我们只需要检查一下这个文件的语法是否正确。 我们可以在要检查的文件之前添加return 语句,让代码提前跳出,那么后面的代码就不会执行了。好的,就这么干。代码如下:
checker.php

<?php if(!function_exists('php_check_syntax')) { 
function php_check_syntax($file_name, &$error_message = null) { 
$file_content = file_get_contents($file_name); 
$check_code = "return true; ?>"; 
$file_content = $check_code . $file_content . "<?php "; 
if(!@eval($file_content)) { 
$error_message = "file: " . realpath($file_name) . " have syntax error"; 
return false; 
} 
return true; 
} 
} 
if(!php_check_syntax("file.php", $msg)) { 
echo $msg; 
} 
else { 
echo "Woohoo, OK!"; 
}

file.php
<?php 
foreach:: a => b 
?>

因为Parse error 是没法被 set_error_handler处理函数处理的。这个异常没办法catch到。所以才使用了@来抑制错误。这带来的问题就是我们无法得到详细的错误信息。 不过目前我需要的功能也只是检查语法是否正确。不正确的话重新编译模板文件,就这么简单,至于语法错误,在显示网页的时候自然会看得到。
最好的办法就是这个被遗弃的php_check_syntax这个方法回到php中。下次再研究下他们是出于什么原因把这个函数去掉的。
////////思维很混乱,写的每一点条理性,谁让我语文那么烂涅。
PHP 相关文章推荐
asp和php下textarea提交大量数据发生丢失的解决方法
Jan 20 PHP
php下安装配置fckeditor编辑器的方法
Mar 02 PHP
PHP中如何调用webservice的实例参考
Apr 25 PHP
探讨捕获php错误信息方法的详解
Jun 09 PHP
PHP简单处理表单输入的特殊字符的方法
Feb 03 PHP
php入门教程之Zend Studio设置与开发实例
Sep 09 PHP
PHPCMS V9 添加二级导航的思路详解
Oct 20 PHP
ThinkPHP简单使用memcache缓存的方法
Nov 15 PHP
php file_get_contents取文件中数组元素的方法
Apr 01 PHP
PHP简单验证码功能机制实例详解
Mar 27 PHP
用php实现分页效果的示例代码
Dec 10 PHP
PHP正则表达式之RCEService回溯
Apr 11 PHP
php 常用类整理
Dec 23 #PHP
PHP 源代码压缩小工具
Dec 22 #PHP
php 8小时时间差的解决方法小结
Dec 22 #PHP
PHP 分页原理分析,大家可以看看
Dec 21 #PHP
c#中的实现php中的preg_replace
Dec 21 #PHP
php 空格,换行,跳格使用说明
Dec 18 #PHP
PHP 抓取新浪读书频道的小说并生成txt电子书的代码
Dec 18 #PHP
You might like
PHP的博客ping服务代码
2012/02/04 PHP
thinkphp控制器调度使用示例
2014/02/24 PHP
PHP SOCKET编程详解
2015/05/22 PHP
php网页版聊天软件实现代码
2016/08/12 PHP
PHP巧妙利用位运算实现网站权限管理的方法
2017/03/12 PHP
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
laravel withCount 统计关联数量的方法
2019/10/10 PHP
IE和FireFox(FF)中js和css的不同
2009/04/13 Javascript
基于jquery的代码显示区域自动拉长效果
2011/12/07 Javascript
js正则表达式匹配数字字母下划线等
2015/04/14 Javascript
JavaScript制作简单的日历效果
2016/03/10 Javascript
AngularJS 与百度地图的结合实例
2016/10/20 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
2017/02/08 Javascript
JavaScript数组和对象的复制
2017/03/21 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
使vue实现jQuery调用的两种方法
2019/05/12 jQuery
layui 实现自动选择radio单选框(checked)的方法
2019/09/03 Javascript
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
2019/12/23 Javascript
JS 数组基本用法入门示例解析
2020/01/16 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
2020/09/04 Javascript
Vue基于localStorage存储信息代码实例
2020/11/16 Javascript
Python使用Srapy框架爬虫模拟登陆并抓取知乎内容
2016/07/02 Python
Python基于sklearn库的分类算法简单应用示例
2018/07/09 Python
对python 生成拼接xml报文的示例详解
2018/12/28 Python
pycharm 批量修改变量名称的方法
2019/08/01 Python
Django 实现前端图片压缩功能的方法
2019/08/07 Python
Django自定义列表 models字段显示方式
2020/04/03 Python
PyQt5多线程防卡死和多窗口用法的实现
2020/09/15 Python
canvas绘制图片drawImage使用方法
2020/09/15 HTML / CSS
英国鞋类及配饰零售商:Kurt Geiger
2017/02/04 全球购物
小学教师节活动方案
2014/01/31 职场文书
个人自我剖析材料
2014/02/07 职场文书
化妆品促销方案
2014/02/24 职场文书
出售房屋委托书范本
2014/09/24 职场文书
使用Nginx+Tomcat实现负载均衡的全过程
2022/05/30 Servers