Heim  >  Artikel  >  Backend-Entwicklung  >  关于ob_start的疑问。

关于ob_start的疑问。

WBOY
WBOYOriginal
2016-07-06 13:53:241020Durchsuche

ob_start在手册里是这么描述的:

此函数将打开输出缓冲。当输出缓冲激活后,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在内部缓冲区中。

那么按照我的理解是这样的:

<code><?php ob_start();
    echo 'ob_start'; // 按理说ob_start不应该输出啊。但是确实输出了。</code></code>

为什么和手册里描述的不一样。

回复内容:

ob_start在手册里是这么描述的:

此函数将打开输出缓冲。当输出缓冲激活后,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在内部缓冲区中。

那么按照我的理解是这样的:

<code><?php ob_start();
    echo 'ob_start'; // 按理说ob_start不应该输出啊。但是确实输出了。</code></code>

为什么和手册里描述的不一样。

应当理解为,不会立刻输出到上级缓冲区,可以通过ob_*的相关操作进行缓冲区的获取、冲出、清除 等,此时可以将输出进行统一,比如正则处理,数据包装等。

页面静态化可以使用php提供的ob缓存技术手动将缓存内容提交的apche等服务器处理

<code>$id = isset($_GET['id'])?$_GET['id']-0:0;
$filename = "html/".date("Ymd")."/news-id".$id.".html";
if(!file_exists("html/".date("Ymd"))){
    mkdir("html/".date("Ymd"));
}
echo $filename;
if(!file_exists($filename) || filemtime($filename)+60<time ob_start require from news where id="$id">query($sql);
    $row = $res->fetch_assoc();
    if($row){
        echo "<table border="1">";
        echo "<tr>";
        echo "<td>ID</td>";
        echo "<td>标题</td>";
        echo "<td>内容</td>";
        echo "</tr>";
        echo "<tr>";
        echo "<td>".$row['id']."</td>";
        echo "<td>".$row['title']."</td>";
        echo "<td>".$row['content']."</td>";
        echo "</tr>";
        echo "</table>";
    }else{
        echo "没有数据";
    }
    $content = ob_get_contents();
    ob_end_clean();
    file_put_contents($filename,$content);
}

require $filename;</time></code>

那是因为你脚本执行完了
缓冲就输出来了
你可以在echo 后面加一句ob_end_clean();
缓冲就会清掉了

完了不输出那才怪呢。。。ob 只是让我们可以获取到php的渲染结果,做缓存之类用的。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn