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

之前在当当的时候的一个项目中用到了一个简单的模板引擎,其实也是借鉴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中。下次再研究下他们是出于什么原因把这个函数去掉的。
////////思维很混乱,写的每一点条理性,谁让我语文那么烂涅。

(0)

相关推荐

  • PHP语法自动检查的Vim插件

    由于最近写PHP比较多,偶尔手误少写个分号之类的语法错误难免,一般的检查方式是回到命令行运行 php -l ,或者升级一下直接在Vim里运行 :!php -l % ,或者再将此绑定为快捷键,如 :map <F5> :!php -l %<CR> ,每当按F5便可立即执行语法检查.但还是觉得略有不爽,因为很多IDE是实时检查的,语法错误会提示在代码行的旁边.虽然实时检查未必有必要,但自动检查要比手动检查方便的多,比如在php文件保存时自动执行检查. 于是写了这个 phpcheck.vi

  • php正则表达式的基本语法总结

    首先,让我们看看两个特别的字符:'^' 和 '$' 他们是分别用来匹配字符串的开始和结束,一下分别举例说明 "^The": 匹配以 "The"开头的字符串; "of despair$": 匹配以 "of despair" 结尾的字符串; "^abc$": 匹配以abc开头和以abc结尾的字符串,实际上是只有abc与之匹配 "notice": 匹配包含notice的字符串 你可以看见如果你

  • php trim 去除空字符的定义与语法介绍

    定义和用法 trim() 函数从字符串的两端删除空白字符和其他预定义字符. 语法 trim(string,charlist)参数 描述 string 必需.规定要检查的字符串. charlist 可选.规定要转换的字符串.如果省略该参数,则删除以下所有字符: 复制代码 代码如下: "\0" - NULL "\t" - tab "\n" - new line "\x0B" - 纵向列表符 "\r" - 回车

  • 浅谈PHP语法(1)

    作者:华红狼 正文:   <谈谈HTML语法>一文,我已经介绍了基本的HTML语法.可以编出一个静态的Web页,可动态交互信息是很重要的.如一些网站的会员制崐的会员注册.登录都需后端程序的运行.很多网站所用的CGI程序主要用Perl.ASP.Java.PHP编写,而我们所要用的就是PHP.它是完全免崐费的,这就要感谢那些默默无闻的编程人员了.PHP的结构类似于C语言,这可是应证了C语言里提的"一处学习,到处编程".相信学过C崐语言的人可很容易上手PHP的.还是先介绍一些PH

  • PHP编程入门的基本语法知识点总结

    一.何为php PHP,即"PHP: Hypertext   Preprocessor",是一种被广泛应用的开源通用脚本语言,尤其适用于 Web 开发并可嵌入 HTML   中去.它的语法利用了 C.Java 和 Perl,易于学习.该语言的主要目标是允许 web 开发人员快速编写动态生成的 web   页面,但 PHP 的用途远不只于此. 简单来说,就是php是一种脚本语言,可以做很多事情.①服务器端脚本 ②命令行脚本 ③编写桌面程序 二.开始php (1)下载php解释器,其实wi

  • PHP语法速查表

    Abs: 取得绝对值.  Acos: 取得反余弦值.  ada_afetch: 取得资料库的传回列.  ada_autocommit: 开关自动更动功能.  ada_close: 关闭 Adabas D 连结.  ada_commit: 更动 Adabas D 资料库.  ada_connect: 连结至 Adabas D 资料库.  ada_exec: 执行 SQL 指令.  ada_fetchrow: 取得传回一列.  ada_fieldname: 取得栏位名称.  ada_fieldtyp

  • 配置php网页显示各种语法错误

    发现问题比解决问题重要,使用php集成开发环境Appserv网页会提示各种语法错误,但自己配置开发环境无法提示错误,特别当不是语法错误,比如com组件的调用,当不知道问题出现在何处,是不能忍受的,这时需要另行配置 这时自己配置的目录文件 pic 配置apache 这个文件D:\AppServ\apache\conf\httpd.conf 将 复制代码 代码如下: php_flag display_errors on php_value error_reporting 2039 放到最后两行 配置

  • PHP insert语法详解

    上次程序中有这么一句话: $exec="insert into info (ename,pcname) values ('".$_POST["ename"]."','".$_POST["pcname"]."')"; 解释一下这句话的意义.SQL插入记录的语法是: insert into 表名 (字段名1,字段名2, ...) values ("字段1的值","字段2的值&quo

  • PHP教程 基本语法

    PHP 的脚本块以 <?php 开始,以 ?> 结束.您可以把 PHP 的脚本块放置在文档中的任何位置. 当然,在支持简写的服务器上,您可以使用 <? 和 ?> 来开始和结束脚本块. 不过,为了达到最好的兼容性,我们推荐您使用标准形式 (<?php),而不是简写形式. 复制代码 代码如下: <?php ?> PHP 文件通常会包含 HTML 标签,就像一个 HTML 文件,以及一些 PHP 脚本代码. 在下面,我们提供了一段简单的 PHP 脚本,它可以向浏览器输出

  • PHP 基本语法格式

    标准代码如下: 复制代码 代码如下: <?php ... ?> 短标签模式(此模式需要修改PHP配置,让PHP支持短标签模式): 复制代码 代码如下: <? ... ?> 注释: 复制代码 代码如下: /* ...*/ // #

随机推荐