использование функции ob_start - PullRequest
       38

использование функции ob_start

0 голосов
/ 29 сентября 2019

Я следую этому уроку 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_ ...),поэтому мой вопрос почему?

1 Ответ

1 голос
/ 30 сентября 2019
Выходная буферизация

принимает то, что echo ed между ob_start() и ob_get_clean() (или другими окончаниями буферизации вывода), и предотвращает его "раннюю утечку" в ответ, который php обслуживает пользователю.

Если вы удалите буферизацию вывода, содержимое ответа просто выводится «условно», однако объект $response будет пустым, $reponse->send() завершится ошибкой, потому что вы уже выводите другие вещи, поэтому заголовки больше не могут быть отправлены.

Итак, это работает, потому что вы либо отправляете вывод напрямую (режим работы php по умолчанию), либо вы буферизуете вывод и отправляете этот вывод "косвенно" через объект ответа (или просто выводом возврата). значение ob_get_clean).

основное различие, на мой взгляд, состоит в том, что компоненты инфраструктуры, которые могут добавлять или не добавлять какую-либо полезность к ответу, больше не могут ничего делать, потому что среда незнаю, какой вывод вы отправите. например, полная структура Symfony отображает панель профилировщика внизу, что, безусловно, происходит, вставляя ее в ответ. Обойдя объект $response, вы также отрицаете инъекцию. однако в вашем конкретном случае это может вообще не иметь значения.

...