【问题标题】:Calling php from php through exec() gives no result通过 exec() 从 php 调用 php 没有结果
【发布时间】:2011-01-25 18:11:48
【问题描述】:

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

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

确定文件是否正确解析。这在我的本地机器上完美运行,但在提供者的机器上,对exec("php ...") 的调用输出似乎总是空的。我尝试调用ls,它给了我输出,让我假设PHP 以某种方式配置为不对命令行调用左右做出反应。有谁知道解决这个问题的方法吗?

编辑:我忘了提,我已经尝试过shell_exec,它也没有给出任何结果。回应 sganesh 的回答:我也试过了,抱歉我忘了提。但是,无论要测试的 PHP 文件是否有语法错误,输出(第二个参数)始终为空数组,返回值始终为 127。

【问题讨论】:

  • 执行那些 PHP 文件将是一个坏主意(我知道您在这里使用 exec 进行语法检查,但如果您的程序中的任何地方实际包含/执行它......)
  • 我知道安全隐患,谢谢。
  • 我知道这是一篇旧帖子,但只是为了提供信息,我在互联网上找到了关于代码 127 的信息:127 "command not found" illegal_command Possible problem with $PATH or a typo。这是来源:tldp.org/LDP/abs/html/exitcodes.html

标签: php command-line exec


【解决方案1】:

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

$output = exec("php -l $filename 2>&1");

【讨论】:

    【解决方案2】:

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

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

    $filename = "a.php";
    $output = exec("php -l $filename",$op,$ret_val);
    print $output."\n";
    print $ret_val."\n";
    var_dump($op);
    

    【讨论】:

    • 什么是$p,你是说$op吗?
    • 是的。我错过了'o'。它只是 $op。
    【解决方案3】:

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

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

    shell_exec() 或 exec() 也有可能被您的主机禁用。

    【讨论】:

    • 如果shell_exec()exec() 被禁用,我将无法成功执行exec("ls /")
    【解决方案4】:

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

    现在,来自 exec() 的 PHP 手册:

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

    你能检查一下这是否不适合你吗?

    另外,您能否通过在 exec() 中提供 PHP 解释器的完整路径来检查,而不仅仅是 php.ini 文件。让我知道你的情况。

    皮纳基

    【讨论】:

    • 您好 pinaki,感谢您的回答。有问题的站点的phpinfo() 给了我safe_mode = Off(本地和主值)和safe_mode_exec_dir = no value(再次,本地和主值)。那很奇怪。不过,检查一下是个好主意,我应该更仔细地阅读手册。至于 PHP 的完整路径,我试图找到 exec("which php"),但没有返回任何内容。
    • 嗨,汤姆,只是怀疑文件名在此处可能是相对的,从而导致了问题。您可以尝试使用完整系统路径的静态文件名(例如 /var/www/index.php)并检查输出吗? --皮纳基
    • 你的意思是要检查的PHP文件?哦,是的,我试过了。事实上,我现在用绝对路径名运行它,它没有任何区别。谢谢。
    • 您好 pinaki,如果您有兴趣,我找到了一种完成解析测试的不同方法。
    • 嗨,汤姆,看到了您的解决方案。不能说我喜欢它(安全问题)。如果文件格式是固定的(仅用于定义常量),那么我建议使用 red-ex 进行验证。如果您需要这方面的帮助,请告诉我。
    【解决方案5】:

    正确的方法是添加&gt;2&amp;1 在windows 系统上使用imagemagick 测试!

    【讨论】:

      【解决方案6】:

      我使用不同的方法解决了我原来的问题。这是我现在要做的:

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

      也许这可以在没有临时文件的情况下通过向文件发出 HTTP 请求来直接测试来完成。但是,如果存在解析错误并且错误被抑制,则输出将为空并且在文件没有给出解析错误的情况下无法从输出中辨别出来。这种方法是有风险的,因为文件实际上是被执行的,而不是仅仅被检查的。就我而言,一开始只有少数用户可以访问此功能。不过,我自然对此并不完全满意。

      为什么exec() 方法不起作用,我仍然不知道究竟。 pinaki 建议提供 PHP 可执行文件的完整路径可能是正确的,但我找不到完整路径。

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

      【讨论】:

      • @Bartel 你检查过你是否在服务器上安装了 php-cli(php 命令行模块)。这可能是无法从命令行运行 php 的原因之一。因此 exec() 调用。
      猜你喜欢
      • 1970-01-01
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多