2011-04-05 58 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