PHP-сессии, которые уже были запущены


в моем PHP коде, если сеанс уже начался, и я пытаюсь начать новый, я получаю следующее уведомление:

обратите внимание: сеанс уже запущен-игнорирование session_start ()

Как я могу избежать этого?

11 59

11 ответов:

попробовать

<?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().

заменить если же нет(); к

if(!isset($a))
{

$a = False;
if($a == TRUE)
{
    session_start();
    $a=TRUE;
}

}