2014-09-03 80 views
0

確定這裏就是我:阿帕奇SSI虛擬包括在錯誤的位置

平原的.html在Apache的文件,

<html> 
<...> 
<!--#include virtual="/SSI/ssi_portlet.php" --> 
<...> 
</html> 

但結果是:

<html> 
<...> 
</html> 
Content of SSI PHP Script Result 

,而不是:

<html> 
<...> 
Content of SSI PHP Script Result 
<...> 
</html> 

那麼,爲什麼Apache添加該腳本結果在頁面的底部,而不是在包含標籤被調用的地方?

的Apache是​​一個Apache/2.2.22(Debian的)與PHP版本5.4.4-14 + deb7u12

+0

你爲什麼首先使用SSI對於這一點,如果你的服務器似乎支持PHP?混合這兩者通常會導致併發症。我建議使用PHP來包含文件。 – CBroe 2014-09-03 09:17:01

+0

我可以詳細解釋,但可悲的是,這無助於解決問題。客戶希望擁有這個功能,並且正在開發環境中工作,但生產服務器看起來像配置不同。 – Kaffee 2014-09-03 10:20:50

回答

0

我也遇到了這個問題,包括在我的輸出HTML的PHP​​文件,它是由時產生PHP。在使用純HTML文件再現您的示例時,我沒有任何問題。我能否認爲你的HTML文件是由PHP處理程序處理的?

我不知道您是否仍在尋找解決方案,因爲問題是舊的,但您或其他人可以嘗試我找到的可能解決方案。

解決方案:

添加這些PHP函數你 「ssi_portlet.php」 文件:
ob_flush();ob_end_clean();的開頭和ob_start();到最後。

我測試了許多其他組合使用PHP的輸出控制功能,php.net,這是唯一一個與各種場景一致的工作。

在你的榜樣 「SSI/ssi_portlet.php」 看起來是這樣的:

<?php 
ob_flush(); ob_end_clean(); 
echo "Content of SSI PHP Script Result"; 
ob_start(); 

我測試過使用XAMPP在Windows這個解決方案運行Apache/2.4.12(的Win32)PHP/5.6.8 。

原因:

我的想法,爲什麼會出現這個問題還是有點模糊,所以隨時提供幫助。

PHP在包含文件中生成的輸出似乎會干擾現有的輸出。因爲它們都使用緩衝區來輸出數據。 (有關PHP輸出緩衝的更多信息,請參閱本文末尾)

ob_flush();將刷新任何現有的輸出,並且ob_end_clean();將清除緩衝區並關閉。這將確保它不會干擾任何現有的輸出/緩衝區。

ob_start();是爲了確保包含任何其他SSI的PHP文件都能正常工作,但它們也應該包含與上述相同的解決方案。

這就是說,SSI包括不應該用於包括大量的數據或製作一個動態頁面。由於輸出緩衝是一種提高性能的機制,關閉輸出緩衝並不是最佳解決方案。當然不是在處理大量輸出時。 爲了這些目的,最好使用PHP include()

PHP output_buffering:

PHP可以使用一種機制稱爲輸出緩衝,它有一個被稱爲「output_buffering」設置,其可具有3個可能的值。從我的php.ini文件 報價:

; Output buffering is a mechanism for controlling how much output data 
; (excluding headers and cookies) PHP should keep internally before pushing that 
; data to the client. If your application's output exceeds this setting, PHP 
; will send that data in chunks of roughly the size you specify. 
; On = Enabled and buffer is unlimited. (Use with caution) 
; Off = Disabled 
; Integer = Enables the buffer and sets its maximum size in bytes. 
output_buffering=4096