ob_start 函数的用法
usage of ob_start function
我正在学习本教程 https://symfony.com/doc/current/create_framework/front_controller.html
我有一个关于此 php 代码
的简单问题
// example.com/web/front.php
require_once __DIR__.'/../vendor/autoload.php';
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
$request = Request::createFromGlobals();
$response = new Response();
$map = [
'/hello' => __DIR__.'/../src/pages/hello.php',
'/bye' => __DIR__.'/../src/pages/bye.php',
];
$path = $request->getPathInfo();
if (isset($map[$path])) {
ob_start();
include $map[$path];
$response->setContent(ob_get_clean());
} else {
$response->setStatusCode(404);
$response->setContent('Not Found');
}
$response->send();
代码在没有缓冲输出的情况下工作(没有 ob_ calls ...),所以我的问题是为什么?
输出缓冲接受 echo
在 ob_start()
和 ob_get_clean()
之间(或其他输出缓冲结束)的内容,并防止它 "early leaking" 进入 php 服务于用户。
如果去掉输出缓冲,响应的内容只是输出"conventionally",但是$response
object会是空的,$reponse->send()
会失败,因为你已经输出了其他东西,所以headers不能再发送了。
所以,它有效,因为您要么直接发送输出(php 的默认操作模式),要么缓冲输出并通过响应 [=] 发送输出 "indirectly" 31=](或仅输出 ob_get_clean
的 return 值)。
在我看来,主要区别在于框架的东西,可能会或可能不会向响应添加一些实用程序,不能再做任何事情,因为框架不知道你发送了什么输出。例如,完整的 symfony 框架在底部显示一个分析器栏,它肯定是通过将其注入响应来实现的。通过绕过 $response
object,你也拒绝了注入。但是,在您的特定情况下,这可能根本无关紧要。
我正在学习本教程 https://symfony.com/doc/current/create_framework/front_controller.html 我有一个关于此 php 代码
的简单问题 // example.com/web/front.php
require_once __DIR__.'/../vendor/autoload.php';
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
$request = Request::createFromGlobals();
$response = new Response();
$map = [
'/hello' => __DIR__.'/../src/pages/hello.php',
'/bye' => __DIR__.'/../src/pages/bye.php',
];
$path = $request->getPathInfo();
if (isset($map[$path])) {
ob_start();
include $map[$path];
$response->setContent(ob_get_clean());
} else {
$response->setStatusCode(404);
$response->setContent('Not Found');
}
$response->send();
代码在没有缓冲输出的情况下工作(没有 ob_ calls ...),所以我的问题是为什么?
输出缓冲接受 echo
在 ob_start()
和 ob_get_clean()
之间(或其他输出缓冲结束)的内容,并防止它 "early leaking" 进入 php 服务于用户。
如果去掉输出缓冲,响应的内容只是输出"conventionally",但是$response
object会是空的,$reponse->send()
会失败,因为你已经输出了其他东西,所以headers不能再发送了。
所以,它有效,因为您要么直接发送输出(php 的默认操作模式),要么缓冲输出并通过响应 [=] 发送输出 "indirectly" 31=](或仅输出 ob_get_clean
的 return 值)。
在我看来,主要区别在于框架的东西,可能会或可能不会向响应添加一些实用程序,不能再做任何事情,因为框架不知道你发送了什么输出。例如,完整的 symfony 框架在底部显示一个分析器栏,它肯定是通过将其注入响应来实现的。通过绕过 $response
object,你也拒绝了注入。但是,在您的特定情况下,这可能根本无关紧要。