【问题标题】:PHP include files with parse errorsPHP 包含具有解析错误的文件
【发布时间】:2009-08-10 14:29:22
【问题描述】:

我有一个动态生成的 PHP 文件,它包含(通过包含)在其他 PHP 脚本中。当第一个(由于某种模糊的原因)生成带有解析错误时,会导致主脚本解析错误并停止执行。

在包含文件时有什么方法可以检测解析错误,以便我可以动态地重新生成该文件?

【问题讨论】:

  • 听起来您需要解决在包含的脚本中导致解析错误的问题。我不确定是否检测到它们,但是如果它出错一次,如果用相同的方法重新生成它似乎又会出错。
  • 还有其他情况会导致文件不正确,例如断电或服务器故障

标签: php include


【解决方案1】:

你可以运行命令行版本的PHP来检查语法:

php -l filename

如果您需要从 PHP 脚本中检查语法,请使用 exec() 函数调用命令行程序。

另请参阅已弃用的函数php_check_syntax()

【讨论】:

  • 这在 5.0.4 之后被弃用
  • 刚刚注意到...改变了我的答案。
  • 我想像php_check_syntax() 这样的函数调用会比产生一个新进程快得多.. 太糟糕了它现在消失了:(
【解决方案2】:

语法.php?文件名.php

SYNTAX.php 在哪里:

<?php 
error_reporting(E_ALL);
ini_set('display_errors','On');

include($_SERVER['QUERY_STRING']);
?>

【讨论】:

    【解决方案3】:

    您可以执行(使用exec() 或类似方法)php -l file.php 并查看结果。我认为在每个包含上都这样做会很慢。

    修复导致您生成有时无效的 PHP 文件的问题不是更好吗?

    【讨论】:

      【解决方案4】:

      我有一个脚本可以遍历我的代码树并查找语法错误。它不是很高级,但它的基础是

       $cmd="php -l " . $basedir . $dir . "/" . $file;
       $s=exec($cmd,$k);
       if( strstr($s,"No syntax errors detected") ) { include($basedir.$dir."/".$file); }
      

      这会在您要包含的脚本上运行 php -l,如果没有错误则加载它。

      【讨论】:

        【解决方案5】:

        通过执行 shell_exec(),您可以看到输出,就像您通过命令行执行该文件一样。您可以在这里查看是否有错误。

        <?php
        if (strpos(shell_exec('php -l file.php'), 'Syntax Error')) {
            die('An error!');
        }
        

        【讨论】:

          【解决方案6】:

          如果您可以保证始终生成正确可解析的代码(通过适当的转义等应该很容易实现),那么出错的唯一方法是在写入文件的过程被中断时(例如电源中断、内存不足、进程被杀死等)。在这种情况下,您最终会得到一个部分文件。

          您可以通过在文件末尾添加签名并在调用 include() 之前检查其是否存在来防止这些部分写入。

          例如,如果您在末尾写&lt;?php $complete=1; ?&gt;,您可以稍后检查它是否存在:

          $contents = file_get_contents($path);
          if (strpos($contents, '<?php $complete=1; ?>')) {
              include($path);
          }
          

          【讨论】:

            【解决方案7】:

            你可以做一个file_get_contents 然后扫描它看看是否有任何解析错误。

            $contents = file_get_contents($path);
            if (stripos($contents, 'Parse error:') !== 0)
            {
              // There was a parse error.
            } else {
              // There were no parse errors.
            }
            

            【讨论】:

            • 如果 $path 是文件名,file_get_contents() 不会只给你 php 代码吗?
            猜你喜欢
            • 2019-05-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-05
            • 2015-10-18
            • 2010-11-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多