PHP-сессии, которые уже были запущены
в моем PHP коде, если сеанс уже начался, и я пытаюсь начать новый, я получаю следующее уведомление:
обратите внимание: сеанс уже запущен-игнорирование session_start ()
Как я могу избежать этого?
11 ответов:
если вы хотите новый, то сделать
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]);
<?php if ( session_id() != "" ) { session_start(); }
в принципе, вам нужно проверить, был ли запущен сеанс перед созданием другого;... больше читать.
С другой стороны, вы решили уничтожить существующий сеанс перед созданием другого с помощью
session_destroy()
.