Skip to content

Commit 39d0bee

Browse files
committed
Fix [github issue#7] expiration via session gc_maxlifetime.
INI lookup used ZEND_STRL which does not include the terminating null. Changed code to use PS(gc_maxlifetime) instead. Also changed getting of max_execution_time to use ZEND_STRS.
1 parent f9f40bf commit 39d0bee

File tree

2 files changed

+49
-8
lines changed

2 files changed

+49
-8
lines changed

php_memcached.c

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2781,7 +2781,7 @@ static int php_memc_sess_lock(memcached_st *memc, const char *key TSRMLS_DC)
27812781
memcached_return status;
27822782
/* set max timeout for session_start = max_execution_time. (c) Andrei Darashenka, Richter & Poweleit GmbH */
27832783

2784-
lock_maxwait = zend_ini_long(ZEND_STRL("max_execution_time"), 0);
2784+
lock_maxwait = zend_ini_long(ZEND_STRS("max_execution_time"), 0);
27852785
if (lock_maxwait <= 0) {
27862786
lock_maxwait = MEMC_SESS_LOCK_EXPIRATION;
27872787
}
@@ -2906,17 +2906,13 @@ PS_WRITE_FUNC(memcached)
29062906
{
29072907
char *sess_key = NULL;
29082908
int sess_key_len = 0;
2909-
time_t expiration;
2910-
int sess_lifetime;
2909+
time_t expiration = 0;
29112910
memcached_return status;
29122911
memcached_st *memc_sess = PS_GET_MOD_DATA();
29132912

29142913
sess_key_len = spprintf(&sess_key, 0, "%s", key);
2915-
sess_lifetime = zend_ini_long(ZEND_STRL("session.gc_maxlifetime"), 0);
2916-
if (sess_lifetime > 0) {
2917-
expiration = time(NULL) + sess_lifetime;
2918-
} else {
2919-
expiration = 0;
2914+
if (PS(gc_maxlifetime) > 0) {
2915+
expiration = PS(gc_maxlifetime);
29202916
}
29212917
status = memcached_set(memc_sess, sess_key, sess_key_len, val, vallen, expiration, 0);
29222918
efree(sess_key);

tests/experimental/session_gc.phpt

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
--TEST--
2+
Session expiration
3+
--SKIPIF--
4+
<?php if (!extension_loaded("memcached")) print "skip"; ?>
5+
--INI--
6+
memcached.sess_prefix = "memc.sess.key."
7+
session.save_path="127.0.0.1:11211"
8+
session.save_handler = memcached
9+
session.gc_maxlifetime = 2
10+
11+
--FILE--
12+
<?php
13+
error_reporting(0);
14+
15+
session_start();
16+
$_SESSION['foo'] = 1;
17+
var_dump($_SESSION);
18+
session_write_close();
19+
20+
$_SESSION = NULL;
21+
var_dump($_SESSION);
22+
23+
session_start();
24+
var_dump($_SESSION);
25+
session_write_close();
26+
27+
sleep(3);
28+
29+
session_start();
30+
var_dump($_SESSION);
31+
session_write_close();
32+
33+
34+
--EXPECT--
35+
array(1) {
36+
["foo"]=>
37+
int(1)
38+
}
39+
NULL
40+
array(1) {
41+
["foo"]=>
42+
int(1)
43+
}
44+
array(0) {
45+
}

0 commit comments

Comments
 (0)