]> granicus.if.org Git - php/commitdiff
Revert "Revert "Implement RFC Add session_gc() https://wiki.php.net/rfc/session-gc""
authorYasuo Ohgaki <yohgaki@php.net>
Thu, 1 Sep 2016 01:12:26 +0000 (10:12 +0900)
committerYasuo Ohgaki <yohgaki@php.net>
Thu, 1 Sep 2016 01:12:26 +0000 (10:12 +0900)
This reverts commit 355c7e7d1cdc180d368c6214ea7605443fc88c92.

ext/session/mod_files.c
ext/session/mod_mm.c
ext/session/mod_user.c
ext/session/mod_user_class.c
ext/session/php_session.h
ext/session/session.c

index 7cb99fabcc7738de6c29c7a7c62095d901f02560..24f70b6c4b78d45b26978f54348e8c50077b00b8 100644 (file)
@@ -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;
 }
 
 
index 3f698975562218d44cbb4e5892d4456c0fceed2a..3181e1641ccebbe041c94a8799935a593c342553 100644 (file)
@@ -468,7 +468,7 @@ PS_GC_FUNC(mm)
 
        mm_unlock(data->mm);
 
-       return SUCCESS;
+       return nrdels;
 }
 
 PS_CREATE_SID_FUNC(mm)
index beddce8883543183d0e32fd3fe540d7db4473b09..0cdbaf96f9d585a4b59626786b8db2b60ef3843f 100644 (file)
@@ -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)
index a774d4bf9c22caf852d844f791fd261d7873d28d..b132552fafab6d9a25b07e5b353380acfb7419de 100644 (file)
@@ -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);
 }
 /* }}} */
 
index b693fd4b87a61648be699f3a241f357cfbd9ea6e..da5e48515a43ed5a9a3da27b68c65cae40712cb2 100644 (file)
@@ -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)
index 633e6e4a3284a87c6456bc1fc24100576bfe3bb1..235e36b18378df909f46e2afef46ddeeac1b6dc4 100644 (file)
@@ -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));
@@ -2247,6 +2251,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)
@@ -2429,6 +2459,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)