好的,这就是我所拥有的:
Apache中的普通.html文件
<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会在页面底部添加脚本结果而不是在include标记被调用的地方?
Apache是一个Apache / 2.2.22(Debian),PHP版本为5.4.4-14 + deb7u12
答案 0 :(得分:1)
在我的输出HTML中包含一个由PHP生成的PHP文件时,我也遇到了这个问题。在复制您的示例时,使用纯HTML文件,我没有任何问题。我可以说你的HTML文件是由PHP处理程序处理的吗?
我不知道您是否还在寻找解决方案,因为问题是旧问题,但您或其他任何人都可以尝试找到我能找到的解决方案。
解决方案:
将这些PHP函数添加到&#34; ssi_portlet.php&#34;文件:
ob_flush();
和ob_end_clean();
开头,ob_start();
到最后。
我已经使用PHP的输出控制功能php.net测试了许多其他组合,这是唯一一个与各种场景一致的方法。
在你的例子&#34; SSI / ssi_portlet.php&#34;可能看起来像这样:
<?php
ob_flush(); ob_end_clean();
echo "Content of SSI PHP Script Result";
ob_start();
我使用运行Apache / 2.4.12(Win32)PHP / 5.6.8的XAMPP在Windows上测试了此解决方案。
原因:
我为什么会出现这个问题的想法仍然有点模糊,所以请随时提供帮助。
PHP在include文件中生成的输出似乎会干扰现有输出。因为它们都使用缓冲区来输出数据。 (有关本文末尾的PHP输出缓冲的更多信息)
ob_flush();
将刷新任何现有输出,ob_end_clean();
将清除缓冲区,如果关闭则关闭。这将确保它不会干扰任何现有的输出/缓冲区。
ob_start();
是为了确保任何其他包含SSI的PHP文件都能正常工作,但它们也应包含与上述相同的解决方案。
话虽如此,SSI包括不应该用于包含大量数据或制作动态页面。由于输出缓冲是一种提高性能的机制,因此关闭输出缓冲不是最佳解决方案。当然不是在处理大量输出时。
最好将PHP include()
用于这些目的。
PHP output_buffering:
PHP可以使用一种称为输出缓冲的机制,它有一个名为&#34; output_buffering&#34;的设置,它可以有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