代码之家  ›  专栏  ›  技术社区  ›  Tom Bartel

通过exec()从php调用php不会产生任何结果

  •  3
  • Tom Bartel  · 技术社区  · 14 年前

    我有一个基于用户输入创建其他PHP文件的PHP脚本。基本上,有些文件包含特定于语言的常量( define )用户可以翻译。为了避免运行时错误,我想测试新编写的文件是否存在解析错误(由于“异常”字符序列)。我在这读了好几篇文章 PHP include files with parse errors )尝试了一个函数

    $output = exec("php -l $filename");
    

    以确定文件是否正确解析。这在我的本地计算机上非常有效,但在提供程序的计算机上,调用的输出 exec("php ...") 似乎总是空的。我试过打电话给 ls 它给了我输出,导致我假设PHP在某种程度上配置为不响应命令行调用。有人知道怎么解决这个问题吗?

    编辑: 我忘了提,我已经试过了 shell_exec 也没有结果。作为对斯加尼斯回答的回应:我也试过,对不起,我忘了提。但是,输出(第二个参数)始终是空数组,返回值始终是127,无论要测试的PHP文件是否有语法错误。

    6 回复  |  直到 10 年前
        1
  •  9
  •   Community Mike Causer    7 年前

    我也有同样的问题。对我有用的解决方案在 running-at-from-php-gives-no-output . 我需要添加输出重定向。

    $output = exec("php -l $filename 2>&1");
    
        2
  •  6
  •   Stephane Grenier    14 年前

    您可以尝试使用exec第二个和第三个参数。 第二个参数将具有命令的输出。 第三个参数将具有返回值。

    exec将只返回命令的最后一行。

    $filename = "a.php";
    $output = exec("php -l $filename",$op,$ret_val);
    print $output."\n";
    print $ret_val."\n";
    var_dump($op);
    
        3
  •  1
  •   Sean Fisher    14 年前

    通过执行shell exec(),您可以看到输出,就像通过命令行执行该文件一样。你只需看看这里是否有错误。

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

    主机也可能禁用shell exec()或exec()。

        4
  •  1
  •   pinaki    14 年前

    检查文件有效性的好主意:—)!

    现在,从用于exec()的PHP手册中:

    注意:启用安全模式时,只能在safe_mode_exec_目录中执行文件。出于实际原因,目前不允许在可执行文件的路径中包含组件。

    你能查查这不是你的情况吗?

    此外,可以通过在exec()中提供PHP解释器的完整路径而不是仅提供PHP来进行检查。告诉我你的情况。

    皮纳基

        5
  •  0
  •   CSchulz cL83    10 年前

    正确的方法是添加 >2&1 在使用ImageMagick的Windows系统上测试!

        6
  •  -1
  •   Tom Bartel    14 年前

    我用另一种方法解决了我原来的问题。我现在要做的是:

    1. 编写包含内容的临时文件 <?php include "< File to test >"; echo "OK"; ?>
    2. 为临时文件生成正确的URL
    3. 使用此URL执行HTTP请求
    4. 检查结果是否等于“OK”。如果是,则要测试的文件将无错误地进行分析。
    5. 删除临时文件

    也许可以在没有临时文件的情况下,通过向文件发出HTTP请求来直接进行测试。但是,如果存在分析错误并且错误被抑制,那么在没有给出分析错误的文件的情况下,输出将是空的,并且无法与输出区分。这个方法是有风险的,因为文件是实际执行的,而不是刚刚检查过的。在我的例子中,最初只有有限数量的用户可以访问此功能。不过,我自然不太满意。

    为什么 exec() 方法不起作用,我还是不太清楚。通过建议提供PHP可执行文件的完整路径,Pinaki可能是对的,但我找不到完整路径。

    谢谢大家的回答,我对你们都投了赞成票。但是,我不能接受你的任何回答,因为你的任何建议都没有真正解决我的问题。