Szukaj…


Składnia

  • void session_abort (void)
  • int session_cache_expire ([ciąg $ new_cache_expire])
  • void session_commit (void)
  • string session_create_id ([string $ prefix])
  • bool session_decode (string $ data)
  • bool session_destroy (void)
  • ciąg session_encode (void)
  • int session_gc (void)
  • tablica session_get_cookie_params (void)
  • string session_id ([string $ id])
  • bool session_is_registered (string $ name)
  • ciąg nazwa_modułu sesji ([ciąg $ moduł])
  • ciąg nazwa_sesji ([ciąg $ nazwa])
  • bool session_regenerate_id ([bool $ delete_old_session = false])
  • void session_register_shutdown (void)
  • bool session_register (mieszane $ nazwa [, mieszane $ ...])
  • void session_reset (void)
  • string session_save_path ([string $ path])
  • void session_set_cookie_params (int $ lifetime [, string $ path [, string $ domain [, bool $ secure = false [, bool $ httponly = false]]]]
  • bool session_set_save_handler (wywoływalne $ open, wywoływalne $ close, wywoływalne $ read, wywoływalne $ write, wywoływalne $ destroy, wywoływalne $ gc [, wywoływalne $ create_sid [, wywoływalne $ validate_sid [, wywoływalne $ update_timestamp]]])
  • bool session_start ([array $ options = []])
  • int session_status (void)
  • bool session_unregister (string $ name)
  • void session_unset (void)
  • void session_write_close (void)

Uwagi

Zauważ, że wywołanie session_start() nawet jeśli sesja już się rozpoczęła, spowoduje ostrzeżenie PHP.

Manipulowanie danymi sesji

Zmienna $_SESSION jest tablicą i możesz ją pobierać lub manipulować jak normalną tablicę.

<?php
// Starting the session
session_start();

// Storing the value in session
$_SESSION['id'] = 342;

// conditional usage of session values that may have been set in a previous session
if(!isset($_SESSION["login"])) {
    echo "Please login first";
    exit;
}
// now you can use the login safely
$user = $_SESSION["login"];

// Getting a value from the session data, or with default value, 
//     using the Null Coalescing operator in PHP 7
$name = $_SESSION['name'] ?? 'Anonymous';

Zobacz także Manipulowanie tablicą, aby uzyskać więcej informacji na temat pracy z tablicą.

Zauważ, że jeśli przechowujesz obiekt w sesji, możesz go odzyskać z wdziękiem tylko wtedy, gdy masz autoloader klasy lub już załadowałeś klasę. W przeciwnym razie obiekt wyjdzie jako typ __PHP_Incomplete_Class , co może później doprowadzić do awarii . Zobacz temat Przestrzeń nazw i automatyczne ładowanie na temat automatycznego ładowania.

Ostrzeżenie:

Dane sesji można przejąć. Jest to opisane w: Pro PHP Security: od zasad bezpieczeństwa aplikacji do implementacji XSS Defense - Rozdział 7: Zapobieganie przejęciu sesji Tak więc zdecydowanie zaleca się, aby nigdy nie przechowywać żadnych danych osobowych w $_SESSION . Najbardziej krytycznie dotyczy to numerów kart kredytowych , identyfikatorów wydanych przez rząd i haseł ; ale obejmowałby również mniej zakładające dane, takie jak nazwiska , e-maile , numery telefonów itp., które pozwoliłyby hakerowi na podszywanie się pod inne osoby / narażanie ich na szwank. Zasadniczo w danych sesji należy używać bezwartościowych / nieosobowych wartości, takich jak identyfikatory numeryczne.

Zniszcz całą sesję

Jeśli masz sesję, którą chcesz zniszczyć, możesz to zrobić za pomocą session_destroy()

/*
    Let us assume that our session looks like this:
    Array([firstname] => Jon, [id] => 123)

    We first need to start our session:
*/
session_start();

/*
    We can now remove all the values from the `SESSION` superglobal:
    If you omitted this step all of the global variables stored in the 
    superglobal would still exist even though the session had been destroyed.
*/
$_SESSION = array();

// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

//Finally we can destroy the session:
session_destroy();

Użycie session_destroy() różni się od użycia czegoś takiego jak $_SESSION = array(); co usunie wszystkie wartości przechowywane w superglobalu SESSION ale nie zniszczy faktycznej zapisanej wersji sesji.


Uwaga : Używamy $_SESSION = array(); zamiast session_unset() ponieważ instrukcja stanowi:

Sesji_unset () należy używać tylko w przypadku starszego przestarzałego kodu, który nie używa $ _SESSION.

session_start () Opcje

Począwszy od sesji PHP możemy przekazać tablicę z opcjami php.ini opartymi na sesji do funkcji session_start .

Przykład

<?php
   if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
       // php >= 7 version
       session_start([
          'cache_limiter' => 'private',
          'read_and_close' => true,
       ]);
   } else {
       // php < 7 version
       session_start();
   }
?>

Ta funkcja wprowadza również nowe ustawienie php.ini nazwie session.lazy_write , które domyślnie ma wartość true i oznacza, że dane sesji są przepisywane tylko, jeśli się zmienią.

Odwołanie: https://wiki.php.net/rfc/session-lock-ini

Nazwa sesji

Nazwa sesji to nazwa pliku cookie używanego do przechowywania sesji. Możesz to wykorzystać do wykrycia, czy dla użytkownika utworzono pliki cookie dla sesji:

if(isset($_COOKIE[session_name()])) {
    session_start();
}

Pamiętaj, że ta metoda nie jest przydatna, chyba że naprawdę nie chcesz niepotrzebnie tworzyć plików cookie.

Zmiana nazwy sesji

Możesz zaktualizować nazwę sesji, wywołując session_name() .

//Set the session name
session_name('newname');
//Start the session
session_start();

Jeśli nie podano argumentu nazwa_sesji session_name() zwracana jest nazwa bieżącej sesji.

Powinien zawierać tylko znaki alfanumeryczne; powinien być krótki i opisowy (tj. dla użytkowników z włączonymi ostrzeżeniami dotyczącymi plików cookie). Nazwa sesji nie może składać się wyłącznie z cyfr, musi być obecna co najmniej jedna litera. W przeciwnym razie za każdym razem generowany jest nowy identyfikator sesji.

Blokowanie sesji

Jak wszyscy wiemy, PHP zapisuje dane sesji do pliku po stronie serwera. Gdy zostanie wysłane żądanie do skryptu php, który rozpoczyna sesję za pomocą session_start() , PHP blokuje ten plik sesji, co powoduje zablokowanie / oczekiwanie na inne przychodzące żądania na wykonanie tego samego session_id , przez co inne żądania utkną na session_start() do lub chyba że zablokowany plik sesji nie zostanie zwolniony

Plik sesji pozostaje zablokowany do momentu zakończenia skryptu lub ręcznego zamknięcia sesji. Aby uniknąć tej sytuacji, tj. Aby zapobiec blokowaniu wielu żądań , możemy rozpocząć sesję i zamknąć sesję, która zwolni blokadę z pliku sesji i pozwoli na kontynuowanie pozostałych żądań.

// php < 7.0 
// start session 
session_start();

// write data to session
$_SESSION['id'] = 123; // session file is locked, so other requests are blocked

// close the session, release lock
session_write_close();

Teraz można pomyśleć, że jeśli sesja zostanie zamknięta, w jaki sposób odczytamy wartości sesji, upiększymy nawet po zamknięciu sesji, sesja jest nadal dostępna. Tak więc nadal możemy odczytać dane sesji.

echo $_SESSION['id'];    // will output  123

W php> = 7.0 możemy mieć sesję read_only, sesję read_write i sesję lazy_write , więc użycie sesji session_write_close() może nie być wymagane

Rozpocznij bezpieczną sesję bez błędów

Wielu programistów ma ten problem, gdy pracują nad dużymi projektami, szczególnie jeśli pracują na modułowym CMS na wtyczkach, dodatkach, komponentach itp. Oto rozwiązanie dla bezpiecznego rozpoczęcia sesji, w którym najpierw sprawdza się wersję PHP obejmującą wszystkie wersje, a następnie sprawdza się jeśli sesja się rozpocznie. Jeśli sesja nie istnieje, rozpoczynam sesję bezpieczną. Jeśli sesja istnieje, nic się nie dzieje.

if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
    if(session_status() == PHP_SESSION_NONE) {
        session_start(array(
          'cache_limiter' => 'private',
          'read_and_close' => true,
       ));
    }
}
else if (version_compare(PHP_VERSION, '5.4.0') >= 0)
{
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
}
else
{
    if(session_id() == '') {
        session_start();
    }
}

To może ci bardzo pomóc w uniknięciu błędu session_start .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow