2013-02-15 66 views
3

我有一个共享服务器Linux,基于此我正面临一个奇怪的问题。我试图通过PHP执行以下命令并且它运行正常;返回给我PHP安装路径/usr/bin/php在php中返回垃圾(HTTP响应)时执行exec('php -v')时出错

exec('which php');// This runs so exec is not disabled 

但我尝试与exec('php ...');执行任何命令失败返回箱98到114元件中随机地几乎具有垃圾遍布的阵列。我跑的命令的例子是...

exec('php -v'); 
exec('php -i'); 
exec('/usr/bin/php -v'); 

以上都没有返回的东西明智。任何想法为什么任何命令运行的PHP不执行?

以下是exec()返回给我的数据数组的var_dump()

EDIT(后一些更RND)

我能够执行

exec('php -h') 

和它reuturned我在可读的格式下面的数组。

string(9) "php -help" 
string(47) "Usage: php [-q] [-h] [-s] [-v] [-i] [-f ]" 
string(27) "  php [args...]" 
string(36) " -a    Run interactively" 
string(69) " -b | Bind Path for external FASTCGI Server mode" 
string(57) " -C    Do not chdir to the script's directory" 
string(58) " -c | Look for php.ini file in this directory" 
string(47) " -n    No php.ini file will be used" 
string(56) " -d foo[=bar]  Define INI entry foo with value 'bar'" 
string(70) " -e    Generate extended information for debugger/profiler" 
string(46) " -f   Parse . Implies `-q'" 
string(28) " -h    This help" 
string(34) " -i    PHP information" 
string(43) " -l    Syntax check only (lint)" 
string(43) " -m    Show compiled in modules" 
string(60) " -q    Quiet-mode. Suppress HTTP Header output." 
string(60) " -s    Display colour syntax highlighted source." 
string(33) " -v    Version number" 
string(72) " -w    Display source with stripped comments and whitespace." 
string(46) " -z   Load Zend extension ." 
string(75) " -T  Measure execution time of script repeated times." 
This page was created in 0.055487155914307 seconds 

哦,顺便说一句,我使用测试脚本如下...

<?php 
$mtime = microtime(); 
$mtime = explode(" ",$mtime); 
$mtime = $mtime[1] + $mtime[0]; 
$starttime = $mtime; 


if(!empty($_GET['p']) && $_GET['p'] == true){ 

    //$command = 'php -help'; //this works 
    //$command = 'cat ' . getcwd() . '/dummy1.txt'; //this works echo's a simple text file 

    //$command = 'php -q ' . getcwd() . '/dummy1.txt'; //NOT WORKING 
    $command = 'php -m'; //NOT WORKING 

    echo '<div><pre>'; 
    var_dump($command); 
    echo '</pre></div>'; 

    exec($command, $output, $return); 
    //passthru($command,$output); 

    echo '<div><pre>'; 
    foreach($output as $key => $value){ 
     var_dump($output[$key]); 
    } 
    echo '</pre></div>'; 
} 


$mtime = microtime(); 
$mtime = explode(" ",$mtime); 
$mtime = $mtime[1] + $mtime[0]; 
$endtime = $mtime; 
$totaltime = ($endtime - $starttime); 
echo "This page was created in ".$totaltime." seconds"; 
?> 

Pastebin.org Link

Image

+2

让我理解正确..你正在执行php从... php? – 2013-02-15 09:14:44

+0

不要添加屏幕截图..添加实际数据或将其放入pastebin – Baba 2013-02-15 09:18:57

+0

@AndrejsCainikovs Ya想通过这种方式运行独立的进程。这是不可能的? – LoneWOLFs 2013-02-15 09:22:13

回答

3

它的PHP CGI从环境中读取脚本名称,从而导致调用脚本运行多次或有时无限次。

解决方案是简单地使用命令php-cli而不是命令php。

替换了行$command = 'php -m';$command = 'php-cli -m';对你的代码,一切都会正常工作。

+0

非常感谢它的工作答案。 – LoneWOLFs 2014-03-07 05:09:23

+0

这是'php-cli'一些linux只有二进制文件吗?我无法在WAMP安装中找到它 – LoneWOLFs 2014-06-13 06:44:56

+0

@LoneWOLFs for Windows'php -m'中的WAMP默认配置将毫无问题地完成您的工作。 – agaggi 2014-06-14 18:42:44

3

鉴于该数据似乎是一个HTTP响应,你有Content-Encoding: gzip那里,我会使用gzdecode()字符串来解码“垃圾”。

+1

提出了一个有趣的问题:为什么'exec('php')'输出一个HTTP响应? – 2013-02-15 09:38:11

+0

我想这是来自名为'dummy.php'的脚本的输出。我猜pastebin包含'var_dump($ command,$ output)'的结果,所以脚本似乎回应一个HTTP响应(2个标题字段,一个空行,然后是gzip内容)。 – cmbuckley 2013-02-15 09:48:10

+0

@cbuckley dummy.php文件只包含<?php echo“hello world”; ?>。那么我应该怎么做才能得到'Hello World'而不是HTTP Response。是的,它从'var_dump($ command,$ output)' – LoneWOLFs 2013-02-15 10:31:19