Сесії PHP, які вже розпочато


82

У моєму PHP-коді, якщо сеанс уже розпочався, і я намагаюся запустити новий, я отримую таке повідомлення:

Примітка: Сеанс уже розпочато - ігноруючи session_start ()

Як я можу цього уникнути?


3
Не розпочинати новий сеанс, якщо працює старий?
Привид

можливий дублікат Як визначити, чи активний сеанс? - будь ласка, використовуйте пошук, перш ніж задавати питання.
hakre

Для мене це спрацювало, просто видаливши session_start (), якщо сеанс уже розпочато, то чому нам потрібно запускати його знову. У моєму випадку це був просто файл config.php, який ВКЛЮЧЕНО в код
Mangesh Sathe

Я помістив session_start()в одне зі своїх включень, і require_onceце у кожному потрібному файлі.
нурчі

Відповіді:


249

Спробуйте

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

Це полегшує впровадження безпеки, якщо ви використовуєте головну сторінку для обгортання всього свого вмісту.
Raymond Wachaga,

Це також рекомендується для випадків, коли ви можете чи не завантажувати файл, що містить session_start (), що є належною стандартною практикою
Стів Уітбі,

31

Якщо ви хочете новий, зробіть це, 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)


5

Тільки якщо ви хочете знищити попередній сеанс:

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

або ви можете використовувати

unset($_SESSION['variable_session _data'])

знищити певну змінну сеансу.



2

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

Його слід викликати дуже рано у вашому сценарії, можливо, навіть перший рядок, а потім не викликати знову.

Якщо у вас є більше, ніж в одному місці вашого коду, ви просите отримати цю помилку. Виріжте це так, щоб воно було лише в одному місці, і його можна викликати лише один раз.


1

Ви повинні вже викликати сеанс почати, можливо, вас знову викликають через включення?

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

1
Трохи пізно, але з якихось причин це не працює. Працює лише (! Isset ($ _ SESSION)).
Mave

2
Ризик звільнити цього: Notice: Undefined variable: _SESSION. Використовуйте issetзамість цього.
T30,

1

Я зіткнувся з цією проблемою під час спроби виправити поведінку блокування $ _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]);

Функція бере масив пар значень key =>, щоб зробити її ще більш ефективною.


0

спробуйте це

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

Я пропоную вам використовувати ob_start (); перед запуском будь-якої змінної sesson, це повинно замовити вам буфер браузера.

редагувати: Додано додаткову) після $ _SESSION


0

Жодне з наведеного не було придатним, без виклику session_start () у всіх php-файлах, які залежать від змінних $ Session, вони не будуть включені. Повідомлення настільки дратує і швидко заповнює журнал помилок. Єдине рішення, яке я можу знайти, яке працює, це це ....

    error_reporting(E_ALL ^ E_NOTICE);
    session_start();

Погане виправлення, але воно працює.


0

Це було б ефективніше:

@session_start();

Уникнення обробника помилок на екрані

Найкраще,


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

По суті, вам потрібно перевірити, чи не було розпочато сеанс, перш ніж створювати інший; ... більше читання .

З іншого боку, ви вирішили знищити існуючий сеанс перед тим, як створити інший за допомогою session_destroy().


0

Просто використовуйте оператор if

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

або

перевірити стан сеансу за допомогою session_status, який повертає поточний стан сеансу, і якщо поточний сеанс вже працює, поверніться нічим іншим, якщо сеанс не працює, запустіть сеанс


session_status() === PHP_SESSION_ACTIVE ?: session_start();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.