php中ob函数缓冲机制深入理解

yizhihongxing

PHP中ob函数缓冲机制深入理解

什么是ob缓冲机制

在PHP中,当我们执行类似于输出到页面的操作时,会直接将输出内容发送到浏览器,然后继续执行后面的代码。这样会因为输出时的阻塞,导致页面的加载速度变慢。为了解决这个问题,PHP提供了缓冲机制来减少输出造成的阻塞,提高页面的加载速度。

摘自官方文档的说明:

输出缓冲控制函数用于控制 PHP 脚本执行时的输出缓冲。尤其是在产生大量内容以前,通过缓冲一定量的输出数据,可以减少等待传输的时间。

一般情况下,我们可以使用 ob_start() 函数开启缓冲区,然后通过 ob_flush() 函数将缓冲区的内容输出。当然,在开启缓冲区之后,我们也可以将缓冲区的内容写到指定的文件中(ob_get_contents() 与 file_put_contents() 实现)。

如何使用ob函数

ob_start()

ob_start() 函数的语法如下:

bool ob_start ([ callable $output_callback = NULL [, int $chunk_size = 0 [, int $flags = PHP_OUTPUT_HANDLER_STDFLAGS ]]] )

ob_start() 函数的作用是开启一个缓冲区,缓存后面产生的输出,缓存完毕后并不会立即将所有缓存输出到客户端,直到执行 ob_end_flush() 函数或 ob_flush() 函数时(记得要关闭缓存区再输出)。

代码示例:

ob_start();
echo 'Hello';
echo 'World';
$content = ob_get_contents(); // 通过ob_get_contents()可以获取缓冲区中的内容
ob_end_clean(); // 结束输出缓冲,不输出缓冲区内容
echo $content; // 输出缓冲区中的内容: HelloWorld
ob_flush() / flush()

ob_flush() 函数用于刷新输出缓冲区,并输出其中的内容。如果没有开启缓冲区,则该函数无效。

flush() 函数是 PHP 提供的与 ob_flush() 函数类似的函数,可以将未输出的缓冲内容强制刷新输出。与 ob_flush() 不同,flush() 函数并不需要开启缓冲区。

代码示例:

ob_start();
echo 'Hello';
echo 'World';
ob_flush(); // 刷新输出缓冲区
echo '!';
ob_end_flush();
ob_clean() / ob_end_clean()

ob_clean() 函数用于清空输出缓冲区,如果没有开启缓冲区,则该函数无效。

ob_end_clean() 函数用于关闭缓冲区,但并不输出其中的内容。

代码示例:

ob_start();
echo 'Hello';
echo 'World';
ob_clean(); // 清空输出缓冲区
echo 'Goodbye';
ob_end_clean();

注意事项

虽然输出缓冲会提高前端性能,但它也可能带来一些副作用,需要注意一些细节问题:

  • 嵌套使用的问题:在嵌套使用输出缓冲时,ob_start 函数最好指定缓冲区的名称,否则清空缓存的时候,会清空所有的缓冲区。如:ob_start("test")。
  • 不适用于长时间操作的代码:如果输出内容较长,开启输出缓冲后,PHP 服务器会占用较多内存,所以需要根据具体情况使用。
  • 可能会降低并发性能:开启输出缓冲后,可能会导致页面的响应时间变慢,这是因为使用输出缓冲时,客户端从服务器上请求数据的开始时间并不改变,但是实际数据的到达时间变晚了,从而使得页面的响应时间变慢。

示例说明

示例一

下面是一个示例代码,使用ob_start()函数实现页面的内容输出:

<?php ob_start(); ?>
<html>
<head>
    <title>PHP output buffer example</title>
</head>
<body>

<p>
    This is an example of the PHP output buffer in action.
</p>

<p>
    <?php
    // 在缓存中输出, 不直接输出到浏览器中.
    echo 'This string will be buffered. ';
    ?>

    <?php
    // 在缓存中输出, 不直接输出到浏览器中.
    echo 'So will this one.';
    ?>

    <?php
    // 输出缓存
    ob_end_flush();
    ?>
</p>

<p>
    This content comes after the flush.
</p>

</body>
</html>

在该示例代码中,我们使用 ob_start() 函数开启了一个缓冲区,然后在页面中使用 echo 输出了两个字符串。紧接着,我们调用 ob_end_flush() 函数输出缓冲区的内容。

示例二

下面是一个示例代码,使用ob_get_contents() 和 ob_end_clean() 函数实现将缓存中的数据存储到文件中:

<?php
ob_start();
echo "Hello World!";
$buffer = ob_get_contents(); //将缓存中的内容赋给变量$buffer
ob_end_clean(); //清空缓冲区
//将缓存的内容保存到文件中
$fp = fopen("temp.txt", "w");
fwrite($fp, $buffer);
fclose($fp);
?>

在该示例代码中,我们使用 ob_start() 函数开启了一个缓冲区,然后使用 echo 输出了 "Hello World!" 字符串并将其赋值给变量 $buffer。紧接着,我们使用 ob_end_clean() 函数清空缓冲区,并将变量 $buffer 中的数据写入到了指定的文件 temp.txt 中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php中ob函数缓冲机制深入理解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • php实现微信小程序授权登录功能(实现流程)

    下面是php实现微信小程序授权登录功能的攻略: 1. 注册小程序开发者账号并创建应用 首先,你需要有一个微信开放平台的开发者账号,并在平台上创建一个小程序应用。在创建应用的过程中,需要填写应用的基本信息,包括应用名称、应用ID等。 2. 获取小程序登录凭证code 小程序用户进行授权登录时,需要先向微信服务器发送请求获取登录凭证code。可以通过微信小程序提…

    PHP 2023年5月23日
    00
  • 十二个常见的PHP+MySql类免费CMS系统

    作为网站的作者,我将详细介绍“十二个常见的PHP+MySql类免费CMS系统”的攻略,下面将分为以下主要部分来介绍: 简介 安装步骤 常见问题 示例说明 简介 “十二个常见的PHP+MySql类免费CMS系统”是指在免费软件和开源软件中,广泛使用的12种基于 PHP + MySQL 技术构建的内容管理系统(CMS)。这些CMS系统结构简单、易于安装和维护,用…

    PHP 2023年5月23日
    00
  • php $_SERVER windows系统与linux系统下的区别说明

    当使用 PHP 时,$_SERVER 是一个超级全局变量,里面包含了诸如头信息、路径、及脚本位置等信息的数组。$_SERVER 数组在 Windows 和 Linux 系统下有一些差异,本文将对这些差异进行详细的讲解。 $_SERVER[‘DOCUMENT_ROOT’] 的区别 在 Windows 系统下,$_SERVER[‘DOCUMENT_ROOT’] …

    PHP 2023年5月30日
    00
  • 微信小程序登录入口在哪? 如何发现新的小程序?

    微信小程序是一种轻量级的应用程序,用户可以在微信里直接使用而不需要下载安装。而微信小程序的登录和发现入口呢?下面是具体的攻略。 微信小程序登录入口在哪? 微信小程序的登录入口不是像常规应用一样一定有登录入口的,而是有两种方式可以实现登录功能。 1. 通过小程序页面实现登录 可以在小程序某个页面上放置一个登录按钮,通过点击这个按钮跳转到登录页面进行用户的登录操…

    PHP 2023年5月30日
    00
  • 微信小程序中美图外卖怎么点餐?

    首先可以分为以下几个步骤: 步骤一:打开微信小程序 首先打开微信小程序,搜索并打开“美团外卖”小程序。 步骤二:浏览附近商家和菜单 在小程序首页,在搜索框中输入你的所在位置或者选择地理位置,并点击“搜索”按钮。这时候会出现距离你最近的外卖商家列表,点击其中一个商家进入商家详细页,在菜单中找到喜欢的食物并点击进入。 步骤三:加入购物车 在菜单页中,找到想要点的…

    PHP 2023年5月23日
    00
  • PHP对称加密算法(DES/AES)类的实现代码

    要实现PHP的对称加密算法,我们可以使用PHP内建的openssl扩展。具体来说,使用openssl_encrypt和openssl_decrypt函数可以实现DES和AES算法。 使用openssl_encrypt函数加密 function encrypt($data, $key, $cipher = "aes-128-cbc") { …

    PHP 2023年5月27日
    00
  • PHP 中英文混合排版中处理字符串常用的函数

    在 PHP 中,一段中英文混合的文本需要进行排版时,常常需要进行字符串的处理,这时可以使用以下几个常用的字符串处理函数: mb_strlen mb_strlen 函数可以获取一个字符串的长度,其中 mb 表示多字节编码,用于处理中文字符。使用该函数时需要指定编码方式,一般为 UTF-8。 示例代码: $text = "Hello, 你好"…

    PHP 2023年5月26日
    00
  • PHP合并两个数组的两种方式的异同

    PHP合并两个数组有两种方式,一种是使用array_merge()函数,另一种是使用“+”运算符。它们各有优缺点,下面我们进行详细讲解。 使用array_merge()函数合并数组 array_merge()函数是PHP内置的函数,可以合并两个或更多个数组。它将后面的数组追加到第一个数组的末尾,并将重复的键值覆盖。 下面是array_merge()函数的语法…

    PHP 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部