2012-05-18 3 views
53

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

Примечание: Сеанс был уже начато - игнорирование session_start()

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

+3

Не начинайте новый сеанс, если старый бежит? –

+0

Возможный дубликат [Как узнать, активен ли сеанс?] (Http://stackoverflow.com/questions/3788369/how-to-tell-if-a-session-is-active) - пожалуйста, используйте поиск до задавая вопрос. – hakre

ответ

167

Попробуйте

<?php 
    if(!isset($_SESSION)) 
    { 
     session_start(); 
    } 
?> 
+0

Простой и работает ... это все, что мне нужно @valeriyGorbatikov –

1

Вы должны уже называют началом сеанса, может быть, который вызывается снова через включаемый?

if(! $_SESSION) 
{ 
    session_start(); 
} 
+1

Немного поздно, но по какой-то причине это не сработает. Только (! Isset ($ _ SESSION)) работает. – Mave

+2

Опасность для этого: 'Примечание: неопределенная переменная: _SESSION'. Вместо этого используйте 'isset'. – T30

25

Если вы хотите новый, выполните 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 реализована эта функция явно:

Expose статус сеанса с помощью новой функции, session_status Это для (PHP> = 5.4.0)

0
<?php 
if (session_id() != "") { 
    session_start(); 
} 

В принципе, вам нужно проверить, был ли сеанс запущен до создания другого; ... more reading.

С другой стороны, вы решили уничтожить существующую сессию, прежде чем создавать другую, используя session_destroy().

2

Только если вы хотите уничтожить предыдущую сессию:

<?php 
    if(!isset($_SESSION)) 
    { 
     session_start(); 
    } 
    else 
    { 
     session_destroy(); 
     session_start(); 
    } 
?> 

или вы можете использовать

unset($_SESSION['variable_session _data']) 

уничтожить конкретную переменную сеанса.

2

Да, вы можете определить, работает ли сеанс, проверив isset($_SESSION). Однако лучший ответ - просто не звонить session_start() более одного раза.

Его следует называть очень рано в вашем скрипте, возможно, даже в первой строке, а затем не вызывать снова.

Если у вас есть это в более чем одном месте в вашем коде, тогда вы просите получить такую ​​ошибку. Сократите это, так что это только в одном месте и может быть вызвано только один раз.

0

попробовать это

if(!isset($_SESSION)){ 
    session_start(); 
} 

Я предлагаю вам использовать ob_start(); перед запуском любого sesson varriable, это должно заказывать буфер браузера.

изменения: Добавлен дополнительный) после того, как $ _SESSION

-3

заменить session_start(); к

if(!isset($a)) 
{ 

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

} 
+0

Это почти дубликат ответов, которые были вокруг в течение многих лет, за исключением вашего менее правильного. Что такое '$ a' - возможно, вы уже установили его где-то еще. Проверка на '$ _SESSION' имеет смысл. – moopet

0

Ни один из вышеперечисленных не подходит, без вызова session_start() во всех PHP файлов, которые зависят от переменных $ Session они не будут включены. Уведомление настолько раздражает и быстро заполняет Error_log. Единственным решением, которое я могу найти, является то, что это ...

error_reporting(E_ALL^E_NOTICE); 
    session_start(); 

Плохое исправление, но оно работает.

0

Я столкнулся с этой проблемой при попытке зафиксировать поведение блокировки $ _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]); 
0

Было бы более эффективным:

@session_start(); 

избежать обработчика ошибок в окне

Best,

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