2009-09-06 4 views
0

Мне пришлось сломать слишком сложный проект, около 100 файлов, для небольших файлов. Проблема в том, что она до сих пор трудно понять логику, получить хорошую кучу ошибок сессии:PHP: правила для сессий

`Cannot send session cookie - headers already sent by` 

Как вам управлять сессии команды, такие как «сессия-старт» и «акушером-отслуживших заподлицо» ? Вы добавляете их в начало и конец вашего index.php или имеете какой-то централизованный файл для управления ими?

Пожалуйста, имейте одно правило большого пальца в ответ.

ответ

3

Это не может быть то, что вы просите, но так же, как маленький намек:

Я всегда оставляйте <?php тег открытым, как это:

<?php 
class foo { 
    //... 
} 

//EOF 

Таким образом, вы не можете иметь любой (непреднамеренный вывод до начала сеанса) после ?>, который будет очень трудно проследить.

Данное соглашение также используется в Zend Framework.

1

Возможно, вы могли бы просто использовать автозапуск сеанса, чтобы обеспечить запуск сеанса перед любым выходом?

http://us.php.net/manual/en/session.configuration.php#ini.session.auto-start

+0

Я не знал, что это возможно, спасибо! – Fiarr

+0

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

+1

Возможно, вам захочется увидеть этот сайт, который f.e. указывает, что во время начатого сеанса кеш браузера не работает: http://www.mikebrittain.com/blog/2008/03/10/improve-php-performance-by-limiting-session-cookies/ –

0

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

0
  • Используйте какой-то объект ответа для агрегирования данных/заголовков.

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

    Pros

    • Упрощает обработка ответа.
    • Позволяет агрегировать контент, а также отправлять различные результаты, если исключение, так как клиент еще не получил каких-либо данных

    Против

    • Вы не сможете отправить порции данных для клиента как можно раньше
1

Я вообще поставил их в начале/конце index.php и затем включать() страницы содержимого. Это похоже на надежное решение, так как вы можете гарантировать, что ваш сеанс запущен и будет очищен после содержимого.

0

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

Лично я предпочитаю рассматривать сеансы и обмениваться с разными библиотеками (созданными мной в php для обработки моего пути) и думаю, что это лучшее решение. Но это зависит от того, чего вы хотите достичь.

2

Перед любым и всем кодом, который выполняет какой-либо вывод (включая, но не ограничиваясь, отправку заголовков, куки), необходимо использовать session_start(), чтобы верхняя часть первого файла, который запускалась во время загрузки, была безопасным местом ,

2

Вы можете использовать custom session handler, реализованный как singleton, который вызывает session_start, когда он изначально создан. Затем все остальные сеансовые операции выполняются над этим объектом сеанса.

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

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