【问题标题】:usage of ob_start functionob_start函数的使用
【发布时间】:2019-09-29 20:56:14
【问题描述】:

我正在关注本教程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_ 调用 ...),所以我的问题是为什么?

【问题讨论】:

    标签: php symfony ob-start


    【解决方案1】:

    输出缓冲在ob_start()ob_get_clean()(或其他输出缓冲结束)之间获取echoed,并防止它“提前泄漏”到 php 为用户提供的响应中。

    如果您删除输出缓冲,则响应的内容只是“常规”输出,但是 $response 对象将为空,$reponse->send() 将失败,因为您已经输出了其他内容,所以标题不能不再发送了。

    所以,它可以工作,因为您要么直接发送输出(php 的默认操作模式),要么缓冲输出并通过响应对象“间接”发送该输出(或仅输出 @987654326 的返回值@)。

    在我看来,主要区别在于框架的东西,可能会或可能不会向响应添加一些实用程序,不能再做任何事情,因为框架不知道您发送了什么输出。例如,完整的 symfony 框架在底部显示一个分析器栏,它肯定会通过在响应中注入它来做到这一点。通过绕过$response 对象,您也可以拒绝注入。但是,在您的特定情况下,这可能根本不重要。

    【讨论】:

      猜你喜欢
      • 2022-09-23
      • 2019-06-10
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多