2016-05-13 4 views
1

Я читал везде, что для правильной работы сессий необходимо вызывать session_start перед выводом любого html.PHP session_start после вывода html

Например, этот вопрос: "Cannot send session cache limiter - headers already sent"

Однако этот пример не делает этого, и она работает:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 

<head> 
    <title>Counting with the SESSION array</title> 
</head> 
<body> 
<FORM action="counter-session.php" method="GET"> 
<INPUT type="submit" name="Count" value="Count"> 
<?php 
    session_start(); 
    if (! isset($_SESSION['counter'])) 
     $count = 0; 
    else 
     $count = $_SESSION['counter']; 
    $count = $count + 1; 
    $_SESSION['counter'] = $count; 
    echo "count is $count"; 
?> 
</FORM> 

</body> 
</html> 

То есть, значение счетчика, как и ожидалось. Как так?

Сложение вопрос: верно ли, что когда-то session_destroy называется, любые дополнительные данные, хранящиеся в $_SESSION не будут сохранены (т.е. дополнительные изменения в $_SESSION не будут отражены в следующий раз, когда мы используем переменную $_SESSION с другой страницы.)?

+0

Проверьте свое [output_buffering] (http://php.net/manual/en/outcontrol.configuration.php#ini.output-buffering) ini. Если он установлен на что-то вроде 'on' или значение int, то вы можете делать такие ошибки ... – Zimmi

+0

По ошибкам, я полагаю, вы имеете в виду, что это не ожидаемое поведение? –

+0

Должен был процитировать это слово;). Под «ошибками» я подразумеваю эффективное создание вывода и отправку заголовков. Заголовки следует отправлять перед выходом html. Буферизация вывода - это параметр, который может быть совершенно другим (установленным или не установленным и изменяющимся в размере буфера) в зависимости от сервера или хостинга, и вы не должны полагаться на него или явно устанавливать его. – Zimmi

ответ

1

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

Если вы хотите его проверить, просто добавьте ob_end_flush(); перед началом сеанса.

+0

Что может вызвать буферизацию вывода? Я думал, что вы должны явно включить его с помощью 'ob_start()'? –

+0

Nevermind, я увидел комментарий Zimmi и проверил мои настройки, и буферизация вывода включена. –

Смежные вопросы