В моем PHP-коде, если сеанс уже запущен, и я пытаюсь запустить новый, я получаю следующее уведомление:
Примечание: сеанс уже запущен – игнорирование session_start ()
- $ _SERVER возвращает два PHPSESSID
- Symfony 2 и пользовательские переменные сеанса из унаследованного приложения
- удалять переменные сеанса, когда идентификатор сеанса известен, но не может запускать сеанс
- Данные PHP SESSION, потерянные между загрузками страниц с WAMPserver 2.0 на localhost
- ОшибкаException в Filesystem.php
Как я могу избежать этого?
Пытаться
<?php if(!isset($_SESSION)) { session_start(); } ?>
Если вы хотите новый, выполните session_destroy()
перед его запуском. Чтобы проверить, установлен ли его набор перед его запуском, вызовите session_status()
:
$status = session_status(); if($status == PHP_SESSION_NONE){ //There is no active session session_start(); }else if($status == PHP_SESSION_DISABLED){ //Sessions are not available }else if($status == PHP_SESSION_ACTIVE){ //Destroy current and start new one session_destroy(); session_start(); }
Я бы не стал проверять глобальную $_SESSION
вместо вызова метода session_status()
поскольку PHP явно реализовал эту функцию:
Открыть статус сеанса с помощью новой функции session_status Это для (PHP> = 5.4.0)
Только если вы хотите уничтожить предыдущую сессию:
<?php if(!isset($_SESSION)) { session_start(); } else { session_destroy(); session_start(); } ?>
или вы можете использовать
unset($_SESSION['variable_session _data'])
для уничтожения определенной переменной сеанса.
Да, вы можете определить, запущен ли сеанс, проверив isset($_SESSION)
. Однако лучшим ответом является не просто вызов session_start()
более одного раза.
Его следует называть очень рано в вашем скрипте, возможно, даже в первой строке, а затем не вызывать снова.
Если у вас это в более чем одном месте в вашем коде, тогда вы просите получить такую ошибку. Сократите это, так что это только в одном месте и может быть вызвано только один раз.
Вы должны уже назвать начало сеанса, может быть, снова вызваны через include?
if( ! $_SESSION) { session_start(); }
попробуй это
if(!isset($_SESSION)){ session_start(); }
Я предлагаю вам использовать ob_start (); перед запуском любого sesson varriable, это должно заказывать буфер браузера.
edit: Добавлено дополнительно) после $ _SESSION
Ни одно из указанных выше не было подходящим, не вызывая session_start () во всех php-файлах, которые зависят от переменных $ Session, которые они не будут включены. Уведомление настолько раздражает и быстро заполняет Error_log. Единственное решение, которое я могу найти, это то, что …
error_reporting(E_ALL ^ E_NOTICE); session_start();
Плохое исправление, но оно работает.
Я столкнулся с этой проблемой, пытаясь исправить поведение блокировки $ _SESSION.
http://konrness.com/php5/how-to-prevent-blocking-php-requests/
Файл сеанса остается заблокированным до завершения скрипта или сеанса вручную закрывается.
Таким образом, по умолчанию страница должна открывать сеанс в режиме только для чтения. Но как только он открыт только для чтения, он должен быть закрыт и снова открыт в режиме записи.
const SESSION_DEFAULT_COOKIE_LIFETIME = 86400; /** * Open _SESSION read-only */ function OpenSessionReadOnly() { session_start([ 'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME, 'read_and_close' => true, // READ ACCESS FAST ]); // $_SESSION is now defined. Call WriteSessionValues() to write out values } /** * _SESSION is read-only by default. Call this function to save a new value * call this function like `WriteSessionValues(["username"=>$login_user]);` * to set $_SESSION["username"] * * @param array $values_assoc_array */ function WriteSessionValues($values_assoc_array) { // this is required to close the read-only session and // not get a warning on the next line. session_abort(); // now open the session with write access session_start([ 'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME ]); foreach ($values_assoc_array as $key => $value) { $_SESSION[ $key ] = $value; } session_write_close(); // Write session data and end session OpenSessionReadOnly(); // now reopen the session in read-only mode. } OpenSessionReadOnly(); // start the session for this page
Затем, когда вы идете написать какое-то значение:
WriteSessionValues(["username"=>$login_user]);
Это было бы более эффективно:
@session_start();
Избегание обработчика ошибок на экране
Лучший,
<?php if ( session_id() != "" ) { session_start(); }
В принципе, вам нужно проверить, был ли сеанс запущен до создания другого; … больше чтение .
С другой стороны, вы решили уничтожить существующий сеанс перед созданием другого с помощью session_destroy()
.
замените session_start (); в
if(!isset($a)) { $a = False; if($a == TRUE) { session_start(); $a=TRUE; } }