2012-05-30 2 views

ответ

1

Хороший пример объясняется в this PHP user note, скопированный здесь для потомков:


простой, но полезная упаковка внушения arr1 для продолжения обработки после того, как говорят браузер, что выход закончен.

Я всегда переадресовать, когда запрос требует обработки (поэтому мы не сделать это дважды на обновления), который делает вещи легко ...

<?php 
function redirect_and_continue($sURL) 
{ 
    header("Location: ".$sURL) ; 
    ob_end_clean(); //arr1s code 
    header("Connection: close"); 
    ignore_user_abort(); 
    ob_start(); 
    header("Content-Length: 0"); 
    ob_end_flush(); 
    flush(); // end arr1s code 
    session_write_close(); // as pointed out by Anonymous 
} 
?> 

Это полезно для задач которые занимают много времени, например, преобразование видео или масштабирование большого изображения.

+0

Будет реализовывать мой собственный перенаправление() таким же образом. – noober

+0

@noober: Хорошо, просто помните, что большую часть времени, * имеет смысл «die()» после «Location» *! Кроме того, я считаю, что 'session_write_close()' должен появиться перед заголовком 'Location', а не в конце. –

3

По моему личному мнению, вы должны позвонить die() в том месте, где вы не хотите, чтобы скрипт исполнялся больше. Если вы не хотите, чтобы скрипт выполнялся после вашего header("Location: ..."), вы должны поставить die() сразу после него.

В принципе, если вы этого не сделаете, ваш скрипт может сделать ненужные дополнительные вычисления, которые никогда не будут «видимыми» для пользователя, так как сервер перенаправляет его в любом случае.

+0

OK, тогда, когда вы хотите, чтобы скрипт выполнялся после заголовка ('Location:')? Любой пример? – noober

+2

Есть ситуации, когда вам захочется сделать некоторые дополнительные вычисления, сохранить некоторые вещи, очистить некоторые ресурсы, назовите их. Существует множество вариантов использования, но все зависит от ситуации. Если вам не нужно ничего делать после 'header (" Location: ... ")', вам не нужно будет беспокоиться об этом и просто поместить 'die' после него. – Styxxy

4

header('Location: ') сделает HTTP redirect, который сообщает браузеру, чтобы перейти на новое место:

HTTP/1.1 301 Moved Permanently 
Location: http://example.com/another_page.php 
Connection: close 

Он не нуждается в тело HTML, так как браузер не будет отображать его и просто следить за переназначение. Вот почему мы звоним die() или exit() после header('Location:'). Если вы не завершаете скрипт, HTTP-ответ выглядит следующим образом.

HTTP/1.1 301 Moved Permanently 
Location: http://example.com/another_page.php 
Connection: close 

<!doctype html> 
<html> 
<head> 
    <title>This is a useless page, won't displayed by the browser</title> 
</head> 
<body> 
    <!-- Why do I have to make SQL queries and other stuff 
     if the browser will discard this? --> 
</body> 
</html> 

почему не умирают() выполняется автоматически с помощью PHP интерпретатора?

Функция header() используется для отправки необработанного HTTP-заголовка, не ограничиваясь header('Location:'). Например:

header('Content-Type: image/png'); 
header('Content-Disposition: attachment; filename="downloaded.pdf"'); 
// ...more code... 

В тех ситуациях мы не называем die(), так как мы должны генерировать тело ответа HTTP. Поэтому не имеет смысла, если PHP автоматически вызовет die() после header().