2011-04-05 87 views
2

我有一个PHP脚本,我想在命令行上运行。除此之外,该脚本需要加载包含PHP和HTML内容的PHP文件,并从该文件获取渲染输出。在命令行输出缓冲

此代码不正是我需要的,但不是在命令行中运行时:

<?php 

// ... 
if(file_exists($content_file)) { 
    ob_start(); 
    include($content_file); 
    $content = ob_get_contents(); 
    ob_end_clean(); 
} 

?> 

当在浏览器中运行,我的脚本获取PHP文件的通过包括(渲染输出),以及将输出存储在$ content中。

但是,当我在命令行上执行此脚本时,PHP文件的内容会被回显出来,并且$ content永远不会被设置。

我搜索了文档,但似乎没有工作。调用ini_set('implicit_flush',false)不起作用,ob_implicit_flush(0)也不起作用。

有什么想法?

+0

试图通过添加@到surpress错误之前,包括: @include($ content_file); – Raisen 2011-04-05 18:32:08

+6

@Raisen,这里没有错误,使用'@'错误沉默运算符通常被认为是不好的做法。 – Charles 2011-04-05 18:34:32

+0

您能否包含您用来调用脚本的命令?我知道这是一个远射,但可能会影响你的输出。 – eykanal 2011-04-05 18:36:11

回答

1

我无法使用PHP 5.3复制此问题。

[[email protected] ~]$ cat includeme.php 
<?php 

echo "Oh hi!\n"; 
?> 
I am an include! 

[[email protected] ~]$ cat includehim.php 
<?php 

$content_file = './includeme.php'; 

if(file_exists($content_file)) { 
    ob_start(); 
    include($content_file); 
    $content = ob_get_contents(); 
    ob_end_clean(); 
} 
[[email protected] ~]$ php includehim.php 
[[email protected] ~]$ 

,并在互动提示:

[[email protected] ~]$ php -a 
Interactive shell 

php > $content_file = './includeme.php'; 
php > if(file_exists($content_file)) { 
php { ob_start(); 
php { include($content_file); 
php { $content = ob_get_contents(); 
php { ob_end_clean(); 
php { } 
php > 
php > echo $content; 
Oh hi! 
I am an include! 

php > exit; 
+0

我使用PHP5.3完全相同的问题 - CakePHP2.0和Shells似乎忽略了ob_start()等。也许是因为shell运行在CLI级别左右?在我的情况下,我想捕捉“system('dos2unix -h',$ x);”但它总是打印出来...... – mark 2011-11-04 20:12:46

+0

@mark,你可能想使用['exec'](http://php.net/exec)或['proc_open'](http://php.net/ proc_open)而不是['system'](http://php.net/system)。 '系统'*有意*与输出缓冲器相连。 – Charles 2011-11-04 20:59:45

+0

thx。我也使用exec而没有成功。奇怪的是:exec('svn/git')的作品。输出不刷新,但正确返回。 proc_open我从来没有听说过。会试试看! – mark 2011-11-05 03:58:57