summaryrefslogtreecommitdiff
path: root/ext/session/session.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/session/session.c')
-rw-r--r--ext/session/session.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/ext/session/session.c b/ext/session/session.c
index d0bafa2bee..7a4e601e10 100644
--- a/ext/session/session.c
+++ b/ext/session/session.c
@@ -2068,6 +2068,39 @@ static PHP_FUNCTION(session_status)
}
/* }}} */
+/* {{{ proto int session_gc([int maxlifetime])
+ Execute garbage collection returns number of deleted data */
+static PHP_FUNCTION(session_gc)
+{
+ int nrdels = -1;
+ long maxlifetime = PS(gc_maxlifetime);
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &maxlifetime) == FAILURE) {
+ return;
+ }
+
+ /* Session must be active to have PS(mod) */
+ if (PS(session_status) != php_session_active) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Trying to garbage collect without active session");
+ RETURN_FALSE;
+ }
+
+ if (!PS(mod) || !PS(mod)->s_gc) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Session save handler does not have gc()");
+ RETURN_FALSE;
+ }
+ PS(mod)->s_gc(&PS(mod_data), maxlifetime, &nrdels TSRMLS_CC);
+
+ if (nrdels < 0) {
+ /* Files save handler return -1 if there is not a permission to remove.
+ Save handlder should return negative nrdels when something wrong. */
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Session gc failed. Check permission or session storage");
+ RETURN_FALSE;
+ }
+ RETURN_LONG((long)nrdels);
+}
+/* }}} */
+
/* {{{ proto void session_register_shutdown(void)
Registers session_write_close() as a shutdown function */
static PHP_FUNCTION(session_register_shutdown)
@@ -2163,6 +2196,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_session_set_cookie_params, 0, 0, 1)
ZEND_ARG_INFO(0, httponly)
ZEND_END_ARG_INFO()
+ZEND_BEGIN_ARG_INFO(arginfo_session_gc, 0)
+ ZEND_ARG_INFO(0, maxlifetime)
+ZEND_END_ARG_INFO()
+
ZEND_BEGIN_ARG_INFO(arginfo_session_class_open, 0)
ZEND_ARG_INFO(0, save_path)
ZEND_ARG_INFO(0, session_name)
@@ -2213,6 +2250,7 @@ static const zend_function_entry session_functions[] = {
PHP_FE(session_get_cookie_params, arginfo_session_void)
PHP_FE(session_write_close, arginfo_session_void)
PHP_FE(session_status, arginfo_session_void)
+ PHP_FE(session_gc, arginfo_session_gc)
PHP_FE(session_register_shutdown, arginfo_session_void)
PHP_FALIAS(session_commit, session_write_close, arginfo_session_void)
PHP_FE_END