PHP - Проверьте, было ли что-то напечатано в браузере - PullRequest
0 голосов
/ 13 октября 2010

Как я могу проверить, было ли что-то напечатано в браузере?Я пробовал headers_sent, но это для заголовков ... Если ничего не было напечатано, я хочу загрузить файл:

public function download() {
    $file = null;
    $line = null;

    if(headers_sent($file, $line)) {
        /* generic exception... change that... */
        throw new Exception('Headers was sent before in file ' . $file . ', line #' . $line);
    }

    header('Content-Description: File Transfer');
    header('Content-Type: ' . $this->mime);
    header('Content-Disposition: attachment; filename=' . $this->name);
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . $this->size);
    readfile($this->path);

Спасибо.

Ответы [ 3 ]

1 голос
/ 13 октября 2010

Вы можете использовать Функции контроля вывода PHP , чтобы проверить, был ли какой-либо вывод в браузер.

Пример:

<?php

ob_start();

echo 'something';

$output = ob_get_contents();

if (!empty($output))
{
    die('something was printed');
}
else
{
    readfile();
}
0 голосов
/ 13 октября 2010

Я не знаю ни одного способа обнаружения, если выход уже запущен. Я полагаю, что headers_sent - это способ обнаружить это, поскольку PHP отправит заголовки, когда попадет в первый вывод в исполняемом скрипте.

Если вам нужно контролировать, когда начинается выход, вам, вероятно, следует рассмотреть управление буферизацией вывода .

0 голосов
/ 13 октября 2010

Короткий ответ: ты не можешь. После того, как вы отправили данные клиенту, у вас нет шансов узнать, что делается с этими данными.

В этом вопросе есть несколько обходных идей, но ни одна из них не является надежной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...