mirror of
https://github.com/php/php-src.git
synced 2024-09-25 11:57:26 +00:00
Implement RFC Add session_gc() https://wiki.php.net/rfc/session-gc
This commit is contained in:
parent
be0958d291
commit
1cf179e415
@ -643,9 +643,11 @@ PS_GC_FUNC(files)
|
||||
|
||||
if (data->dirdepth == 0) {
|
||||
*nrdels = ps_files_cleanup_dir(data->basedir, maxlifetime);
|
||||
} else {
|
||||
*nrdels = -1; // Cannot process multiple depth save dir
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
return *nrdels;
|
||||
}
|
||||
|
||||
|
||||
|
@ -468,7 +468,7 @@ PS_GC_FUNC(mm)
|
||||
|
||||
mm_unlock(data->mm);
|
||||
|
||||
return SUCCESS;
|
||||
return nrdels;
|
||||
}
|
||||
|
||||
PS_CREATE_SID_FUNC(mm)
|
||||
|
@ -176,13 +176,22 @@ PS_DESTROY_FUNC(user)
|
||||
PS_GC_FUNC(user)
|
||||
{
|
||||
zval args[1];
|
||||
STDVARS;
|
||||
zval retval;
|
||||
|
||||
ZVAL_LONG(&args[0], maxlifetime);
|
||||
|
||||
ps_call_handler(&PSF(gc), 1, args, &retval);
|
||||
|
||||
FINISH;
|
||||
if (Z_TYPE(retval) == IS_LONG) {
|
||||
convert_to_long(&retval);
|
||||
return Z_LVAL(retval);
|
||||
}
|
||||
/* This is for older API compatibility */
|
||||
if (Z_TYPE(retval) == IS_TRUE) {
|
||||
return 1;
|
||||
}
|
||||
/* Anything else is some kind of error */
|
||||
return -1; // Error
|
||||
}
|
||||
|
||||
PS_CREATE_SID_FUNC(user)
|
||||
|
@ -148,7 +148,7 @@ PHP_METHOD(SessionHandler, destroy)
|
||||
PHP_METHOD(SessionHandler, gc)
|
||||
{
|
||||
zend_long maxlifetime;
|
||||
int nrdels;
|
||||
zend_long nrdels = -1;
|
||||
|
||||
PS_SANITY_CHECK_IS_OPEN;
|
||||
|
||||
@ -156,7 +156,10 @@ PHP_METHOD(SessionHandler, gc)
|
||||
return;
|
||||
}
|
||||
|
||||
RETURN_BOOL(SUCCESS == PS(default_mod)->s_gc(&PS(mod_data), maxlifetime, &nrdels));
|
||||
if (PS(default_mod)->s_gc(&PS(mod_data), maxlifetime, &nrdels) == FAILURE) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
RETURN_LONG(nrdels);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
@ -39,7 +39,7 @@
|
||||
#define PS_READ_ARGS void **mod_data, zend_string *key, zend_string **val, zend_long maxlifetime
|
||||
#define PS_WRITE_ARGS void **mod_data, zend_string *key, zend_string *val, zend_long maxlifetime
|
||||
#define PS_DESTROY_ARGS void **mod_data, zend_string *key
|
||||
#define PS_GC_ARGS void **mod_data, zend_long maxlifetime, int *nrdels
|
||||
#define PS_GC_ARGS void **mod_data, zend_long maxlifetime, zend_long *nrdels
|
||||
#define PS_CREATE_SID_ARGS void **mod_data
|
||||
#define PS_VALIDATE_SID_ARGS void **mod_data, zend_string *key
|
||||
#define PS_UPDATE_TIMESTAMP_ARGS void **mod_data, zend_string *key, zend_string *val, zend_long maxlifetime
|
||||
@ -51,7 +51,7 @@ typedef struct ps_module_struct {
|
||||
int (*s_read)(PS_READ_ARGS);
|
||||
int (*s_write)(PS_WRITE_ARGS);
|
||||
int (*s_destroy)(PS_DESTROY_ARGS);
|
||||
int (*s_gc)(PS_GC_ARGS);
|
||||
zend_long (*s_gc)(PS_GC_ARGS);
|
||||
zend_string *(*s_create_sid)(PS_CREATE_SID_ARGS);
|
||||
int (*s_validate_sid)(PS_VALIDATE_SID_ARGS);
|
||||
int (*s_update_timestamp)(PS_UPDATE_TIMESTAMP_ARGS);
|
||||
@ -65,7 +65,7 @@ typedef struct ps_module_struct {
|
||||
#define PS_READ_FUNC(x) int ps_read_##x(PS_READ_ARGS)
|
||||
#define PS_WRITE_FUNC(x) int ps_write_##x(PS_WRITE_ARGS)
|
||||
#define PS_DESTROY_FUNC(x) int ps_delete_##x(PS_DESTROY_ARGS)
|
||||
#define PS_GC_FUNC(x) int ps_gc_##x(PS_GC_ARGS)
|
||||
#define PS_GC_FUNC(x) zend_long ps_gc_##x(PS_GC_ARGS)
|
||||
#define PS_CREATE_SID_FUNC(x) zend_string *ps_create_sid_##x(PS_CREATE_SID_ARGS)
|
||||
#define PS_VALIDATE_SID_FUNC(x) int ps_validate_sid_##x(PS_VALIDATE_SID_ARGS)
|
||||
#define PS_UPDATE_TIMESTAMP_FUNC(x) int ps_update_timestamp_##x(PS_UPDATE_TIMESTAMP_ARGS)
|
||||
|
@ -353,19 +353,23 @@ PHPAPI int php_session_valid_key(const char *key) /* {{{ */
|
||||
/* }}} */
|
||||
|
||||
|
||||
static void php_session_gc(void) /* {{{ */
|
||||
static zend_long php_session_gc(zend_bool immediate) /* {{{ */
|
||||
{
|
||||
int nrand;
|
||||
zend_long num = -1;
|
||||
|
||||
/* GC must be done before reading session data. */
|
||||
if ((PS(mod_data) || PS(mod_user_implemented)) && PS(gc_probability) > 0) {
|
||||
int nrdels = -1;
|
||||
|
||||
nrand = (int) ((float) PS(gc_divisor) * php_combined_lcg());
|
||||
if (nrand < PS(gc_probability)) {
|
||||
PS(mod)->s_gc(&PS(mod_data), PS(gc_maxlifetime), &nrdels);
|
||||
if ((PS(mod_data) || PS(mod_user_implemented))) {
|
||||
if (immediate) {
|
||||
PS(mod)->s_gc(&PS(mod_data), PS(gc_maxlifetime), &num);
|
||||
return num;
|
||||
}
|
||||
nrand = (zend_long) ((float) PS(gc_divisor) * php_combined_lcg());
|
||||
if (PS(gc_probability) > 0 && nrand < PS(gc_probability)) {
|
||||
PS(mod)->s_gc(&PS(mod_data), PS(gc_maxlifetime), &num);
|
||||
}
|
||||
}
|
||||
return num;
|
||||
} /* }}} */
|
||||
|
||||
static void php_session_initialize(void) /* {{{ */
|
||||
@ -430,7 +434,7 @@ static void php_session_initialize(void) /* {{{ */
|
||||
}
|
||||
|
||||
/* GC must be done after read */
|
||||
php_session_gc();
|
||||
php_session_gc(0);
|
||||
|
||||
if (PS(session_vars)) {
|
||||
zend_string_release(PS(session_vars));
|
||||
@ -2239,6 +2243,32 @@ static PHP_FUNCTION(session_unset)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto int session_gc(void)
|
||||
Perform GC and return number of deleted sessions */
|
||||
static PHP_FUNCTION(session_gc)
|
||||
{
|
||||
zend_long num;
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (PS(session_status) != php_session_active) {
|
||||
php_error_docref(NULL, E_WARNING, "Session is not active");
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
num = php_session_gc(1);
|
||||
if (num < 0) {
|
||||
php_error_docref(NULL, E_WARNING, "Failed to perfom session GC");
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
RETURN_LONG(num);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ proto void session_write_close(void)
|
||||
Write session data and end session */
|
||||
static PHP_FUNCTION(session_write_close)
|
||||
@ -2416,6 +2446,7 @@ static const zend_function_entry session_functions[] = {
|
||||
PHP_FE(session_start, arginfo_session_void)
|
||||
PHP_FE(session_destroy, arginfo_session_void)
|
||||
PHP_FE(session_unset, arginfo_session_void)
|
||||
PHP_FE(session_gc, arginfo_session_void)
|
||||
PHP_FE(session_set_save_handler, arginfo_session_set_save_handler)
|
||||
PHP_FE(session_cache_limiter, arginfo_session_cache_limiter)
|
||||
PHP_FE(session_cache_expire, arginfo_session_cache_expire)
|
||||
|
Loading…
Reference in New Issue
Block a user