我有一个PHP脚本,可以根据用户输入创建其他PHP文件。基本上,有些文件包含可由用户翻译的特定语言常量(define
)。为了避免运行时错误,我想测试新写入的文件是否存在解析错误(由于“异常”字符序列)。我在SO上阅读了几篇帖子(如PHP include files with parse errors),并尝试了一个使用
$output = exec("php -l $filename");
确定文件是否正确解析。这在我的本地机器上完美运行,但在提供商的机器上,对exec("php ...")
的调用输出似乎总是空的。我尝试了对ls
的调用,它给了我输出,让我假设PHP以某种方式被配置为不对命令行调用做出反应。有没有人知道解决这个问题?
编辑:我忘了提及,我已经尝试shell_exec
并且它也没有给出任何结果。回应sganesh的回答:我也试过了,对不起我忘了提。但是,输出(第二个参数)将始终为空数组,并且返回值将始终为127,无论要测试的PHP文件是否存在语法错误。
答案 0 :(得分:9)
我遇到了同样的问题。适用于我的解决方案可在running-at-from-php-gives-no-output中找到。我需要添加输出重定向。
$output = exec("php -l $filename 2>&1");
答案 1 :(得分:6)
您可以尝试使用exec第二个和第三个参数。 第二个参数将具有该命令的输出。 第三个参数将具有返回值。
exec将只返回命令的最后一行。
$filename = "a.php";
$output = exec("php -l $filename",$op,$ret_val);
print $output."\n";
print $ret_val."\n";
var_dump($op);
答案 2 :(得分:1)
通过执行shell_exec(),您可以看到输出,就像通过命令行执行该文件一样。你可以在这里查看是否有错误。
<?php
if (strpos(shell_exec('php -l file.php'), 'Syntax Error')) {
die('An error!');
}
您的主机可能也可能禁用shell_exec()或exec()。
答案 3 :(得分:1)
检查文件有效性的好主意: - )!
现在,从exec()的PHP手册:
注意:启用安全模式后,您只能执行safe_mode_exec_dir中的文件。出于实际原因,目前不允许在可执行文件的路径中包含组件。
你能检查一下你的情况吗?
另外,您可以通过在exec()中提供PHP解释器的完整路径来检查,而不仅仅是php。让我知道你的表现。
皮纳基环礁
答案 4 :(得分:0)
正确的方法是使用imagemagick在Windows系统上添加>2&1
测试版!
答案 5 :(得分:-1)
我通过使用不同的方法解决了我原来的问题。以下是我现在所做的事情:
<?php include "< File to test >"; echo "OK"; ?>
也许这可以在没有临时文件的情况下通过向文件发出HTTP请求来直接测试来完成。但是,如果存在解析错误并且错误被抑制,则输出将为空,并且在没有解析错误的文件的情况下输出将无法识别。此方法存在风险,因为文件实际上是执行而不是仅检查。就我而言,首先只有有限数量的用户可以访问此功能。不过,我自然并不完全满意。
为什么exec()
方法不起作用,我仍然不确切知道。 pinaki可能是正确的,建议提供PHP可执行文件的完整路径,但我找不到完整的路径。
谢谢大家的回答,我向你们所有人投了赞成票。但是,我不能接受你的任何答案,因为你的建议都没有真正解决我的问题。