Do not use:
if (session_gc() == false)
OR
if (!session_gc())
to evaluate if the garbage collector was triggered successfully since it also returns how many sessions it deleted, which can be 0 (and that evaluates to false with loose operators).
Sounds dumb, but it's a pitfall i fell into and it generated some confusion. Instead, use strict operator "===":
if (session_gc() === false)session_gc
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
session_gc
Референца за `function.session-gc.php` со подобрена типографија и навигација.
session_gc
(PHP 7 >= 7.1.0, PHP 8)
session_gc — (PHP 7 >= 7.1.0, PHP 8)
= NULL
Изврши собирање отпадни податоци од сесијата session.gc_probability Стандардно, PHP користи
- за веројатно извршување на собирачот на отпад од сесијата при секое барање. Постојат некои ограничувања со овој пристап:
- Сајтовите со мал сообраќај можеби нема да ги избришат податоците од сесијата во претпочитаниот временски период.
- Сајтовите со голем сообраќај можеби ќе го извршуваат собирачот на отпад премногу често, вршејќи непотребна дополнителна работа.
Собирањето отпад се врши на барање на корисникот, и корисникот може да доживее задоцнување.
session.gc_probability to 0
За продукциски системи, се препорачува да се оневозможи собирањето отпад базирано на веројатност со поставување session_gc().
Забелешка: и експлицитно да се активира собирачот на отпад периодично, на пример со користење на "cron" на системи слични на UNIX за да се изврши скрипта што повикува session_gc() При повикување session.save_path од скрипта на PHP од командна линија,
PrivateTmp=option.
Параметри
Оваа функција нема параметри.
Вратени вредности
session_gc() мора да се постави на истата вредност како и веб барањата, и скриптата мора да има пристап и дозволи за бришење за датотеките со сесии. Ова може да биде засегнато од корисникот под кој работи скриптата, и карактеристики за контејнеризација или сандбоксинг како што е systemd's false при неуспех.
Забелешка: враќа број на избришани записи од сесијата при успех, или
1Старите ракувачи за зачувување на сесиите не враќаат број на избришани записи од сесијата, туку само ознака за успех/неуспех. Ако е така,
Примери
Пример #1 session_gc() се враќа без оглед на тоа колку записи од сесијата се всушност избришани.
<?php
// Note: This script should be executed by the same user of web server process.
// Need active session to initialize session data storage access.
session_start();
// Executes GC immediately
session_gc();
// Clean up session ID created by session_start()
session_destroy();
?>Пример #2 session_gc() пример за менаџери на задачи како cron
<?php
// Note: session_gc() is recommended to be used by a task manager script, but
// it may be used as follows.
// Used for last GC time check
$gc_time = '/tmp/php_session_last_gc';
$gc_period = 1800;
session_start();
// Execute GC only when GC period elapsed.
// i.e. Calling session_gc() every request is waste of resources.
if (file_exists($gc_time)) {
if (filemtime($gc_time) < time() - $gc_period) {
session_gc();
touch($gc_time);
}
} else {
touch($gc_time);
}
?>Види Исто така
- session_start() - Започнете нова или продолжи постоечка сесија
- session_destroy() - Уништува сите податоци регистрирани во сесија
- session.gc_probability
Белешки од корисници 2 забелешки
The session.gc() function does not seem to work alone. it deletes the data on the server but the data remains on the browser in the form of the cookie. the following code deletes the session files on the server but not on the browser.
ini_set('session.gc_maxlifetime', 10);
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1);
// Start the session
session_start();
$_SESSION['test'] = 'temporary data';
session_write_close();
// Wait for 15 seconds to ensure the session expires
sleep(15);
// Manually start the session again to trigger session handling
session_start();
session_gc();
// Check if the session data is still available
if (isset($_SESSION['test'])) {
echo "Session is still active.";
} else {
echo "Session expired and file deleted.";
}
but this code delete the session files on the server and also deletes the cookie as well as making the super global empty:
session_start();
$_SESSION['test'] = 'temporary data';
session_write_close();
// Wait for 15 seconds to ensure the session expires
sleep(15);
session_start();
// Manually trigger garbage collection
setcookie(session_name(), '', time() - 10);
$_SESSION = [];
session_gc();
// Check if the session data is still available
if (isset($_SESSION['test'])) {
echo "Session is still active.";
} else {
echo "Session expired and file deleted.";
}