在浏览器上运行php脚本,通过shell执行hadoop命令


Running php script to execute hadoop command via shell on browser

我一直试图通过php中的shell_exec()在终端上执行hadoop命令,并试图通过浏览器中的url运行该脚本。我一直面临一个大问题:

当我尝试在终端中运行以下脚本时:

<?php
    echo "Begin";
    echo shell_exec('hadoop fs -ls /');
    echo "End";
?>

它显示了所需的结果,即HDFS根上所有可用项目的列表。但当尝试通过url运行以下脚本时,会显示以下结果:

url: localhost/myscript.php
BeginEnd

没有别的!脚本在终端中工作,但在浏览器中不工作。

当我将脚本更改为:

<?php
    echo "Begin";
    echo shell_exec('ls /');
    echo "End";
?>

它显示了在终端和浏览器中本地文件系统根目录中可用的所有项目。

我试图更改命令以检查脚本是否正在运行。

<?php
    echo "Begin";
    echo shell_exec('hadoop fs -mkdir /test');
    echo "End";
?>

当我使用php-myscript.php通过终端运行它时,它会工作并在HDFS根目录中创建一个目录。但当我尝试通过脚本中不同目录名的url通过浏览器运行它时,它只打印BeginEnd,而不在HDFS根目录下创建目录。

[更新]

当我访问apache日志文件时,它在我加载urllocalhost/myscript.php后显示以下行:

[Thu Apr 07 10:04:07.187673 2016] [core:notice] [pid 1540] AH00094: Command line: '/usr/sbin/apache2'
sh: 1: hadoop: not found

当我尝试使用Flask通过Python执行相同的脚本时。"mkdir"answers"ls"这两个命令都能完美地工作,并在浏览器中显示所需的结果。

注意:当我为所需的工作执行python脚本时,我不使用apache,而是使用Flask来托管它自己的服务器。

应该是什么问题?

查看您的apache日志文件(error.log/access.log)。用于apache的php.ini与用于phpcli的php.ini不同。也许您有open_basedir限制,并且不能在此目录之外运行可执行文件。

http://phpsec.org/projects/phpsecinfo/tests/open_basedir.html

您也可以通过制作一个带有phpinfo函数的test.php文件来验证这些信息,并浏览它:

<? phpinfo() ; ?>