Sesje PHP, które już się rozpoczęły


82

W moim kodzie PHP, jeśli sesja już się rozpoczęła i próbuję rozpocząć nową, pojawia się następujący komunikat:

Uwaga: sesja została już rozpoczęta - ignorowanie session_start ()

Jak mogę tego uniknąć?


3
Nie rozpoczynaj nowej sesji, jeśli działa stara?
Madara's Ghost

możliwy duplikat Jak sprawdzić, czy sesja jest aktywna? - skorzystaj z wyszukiwania przed zadaniem pytania.
hakre

Dla mnie to działało po prostu usuwając session_start (), jeśli sesja jest już zaczęli to dlaczego musimy zacząć go again.In moim przypadku to był tylko plik config.php która obejmowała w kodzie
Mangesh Sathe

Umieściłem session_start()w jednym z moich require_oncezałączników i to w każdym pliku, którego potrzebuję.
nurchi

Odpowiedzi:


249

Próbować

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

Ułatwia to wdrażanie zabezpieczeń, jeśli używasz strony wzorcowej do zawijania całej zawartości.
Raymond Wachaga,

Jest to również zalecane w sytuacjach, gdy możesz lub nie załadować pliku zawierającego session_start (), więc dobra standardowa praktyka
Steve Whitby

31

Jeśli chcesz nowy, zrób to session_destroy()przed uruchomieniem. Aby sprawdzić, czy jest ustawiony przed uruchomieniem, zadzwoń 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();
}

Chciałbym uniknąć sprawdzania globalny $_SESSIONzamiast z Wołam ten session_status()sposób od PHP wdrożone tej funkcji wyraźnie do:

Pokaż stan sesji za pomocą nowej funkcji, session_status To jest dla (PHP> = 5.4.0)


5

Tylko jeśli chcesz zniszczyć poprzednią sesję:

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

lub możesz użyć

unset($_SESSION['variable_session _data'])

aby zniszczyć określoną zmienną sesji.


4
session_status() === PHP_SESSION_ACTIVE ?: session_start();

Zamknięta gra


2

Tak, możesz sprawdzić, czy sesja już działa, zaznaczając isset($_SESSION). Jednak najlepszą odpowiedzią jest po prostu nie dzwonić session_start()więcej niż jeden raz.

Powinien zostać wywołany bardzo wcześnie w skrypcie, być może nawet w pierwszej linii, a następnie nie wywoływany ponownie.

Jeśli masz go w więcej niż jednym miejscu w swoim kodzie, prosisz o uzyskanie tego rodzaju błędu. Wytnij go, aby był tylko w jednym miejscu i można go było wywołać tylko raz.


1

Musisz być już wywołany początek sesji, może być wywoływany ponownie przez dołączenie?

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

1
Trochę późno, ale z jakiegoś powodu to nie działa. Działa tylko (! Isset ($ _ SESSION)).
Mave

2
Ryzyko pożaru to: Notice: Undefined variable: _SESSION. Użyj issetzamiast tego.
T30

1

Napotkałem ten problem, próbując naprawić zachowanie blokujące $ _SESSION.

http://konrness.com/php5/how-to-prevent-blocking-php-requests/

Plik sesji pozostaje zablokowany do czasu zakończenia wykonywania skryptu lub ręcznego zamknięcia sesji.

Zatem strona powinna domyślnie otwierać sesję w trybie tylko do odczytu. Ale gdy jest otwarty w trybie tylko do odczytu, musi zostać zamknięty i ponownie otwarty, aby przejść do trybu zapisu.

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

Następnie, kiedy idziesz napisać jakąś wartość:

WriteSessionValues(["username"=>$login_user]);

Funkcja pobiera tablicę par klucz => wartość, aby uczynić ją jeszcze bardziej wydajną.


0

Spróbuj tego

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

Sugeruję użycie ob_start (); przed uruchomieniem zmiennej sesson, powinno to ustawić bufor przeglądarki.

edycja: Dodano dodatkowy) po $ _SESSION


0

Żadne z powyższych nie było odpowiednie, bez wywołania session_start () we wszystkich plikach php, które zależą od zmiennych $ Session, nie zostaną one uwzględnione. Powiadomienie jest tak denerwujące i szybko wypełnia Error_log. Jedynym rozwiązaniem, które mogę znaleźć, jest to ....

    error_reporting(E_ALL ^ E_NOTICE);
    session_start();

Zła poprawka, ale działa.


0

Byłoby bardziej wydajne:

@session_start();

Unikanie obsługi błędów na ekranie

Najlepsza,


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

Zasadniczo musisz sprawdzić, czy sesja została uruchomiona przed utworzeniem kolejnej; ... więcej czytania .

Z drugiej strony zdecydowałeś się zniszczyć istniejącą sesję przed utworzeniem kolejnej za pomocą session_destroy().


0

Po prostu użyj instrukcji if

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

lub

sprawdź stan sesji za pomocą session_status, który zwraca aktualny stan sesji, a jeśli bieżąca sesja już działa, wróć z niczym innym, jeśli sesja nie działa, rozpocznij sesję


session_status() === PHP_SESSION_ACTIVE ?: session_start();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.