#19326 [NEW]: Sessio data written twice
| From: | vlads at krediidiinfo dot ee | Date: | Tue, 10 Sep 2002 07:11:31 +0000 |
| Subject: | #19326 [NEW]: Sessio data written twice | ||
| Groups: | php.bugs | ||
| Request: | Send a blank email to php-bugs+get-18889@lists.php.net to get a copy of this message | ||
From: vlads@krediidiinfo.ee
Operating system: RH Linux 7.1, kernel 2.4.9-34smp
PHP version: 4.2.3
PHP Bug Type: Session related
Bug description: Sessio data written twice
Actually all MySQL database operations are made twice.
It doesn't matter (except for performance and load)
for select queries, but it has much todo with session data.
First time my function writes the right session data
and second time some of the session data gets lost (not always, but
randomly).
I tried to output written data to the screen in _write
function and it differs sometimes from the data being read
in _read function. It was very confusing, because the
second thread does not output anything to the screen.
So I started MySQL with --log parameter to see, what
commands are sent to the database and saw, that
2 threads are reading and writing to the database.
(thread 12 writes correct data and thread 11 wrong data,
Although I am the only user in the system)
Maybe it has something todo with 2 processor system?
My theory is also backed up by GET_LOCK function.
When I acquire lock in _write function, the second thread
probably fails to write to the database and all session data gets written
right.
I use session class:
<?php
class Session {
var $name;
var $id;
var $split_len;
var $table_name;
var $db_name;
var $ttl;
var $tmp_read;
function Session($_session_name = 'SESSID', $_ttl = 900, $_use_cookies =
0, $_gc_percent = 1){
$this->name = $_session_name;
$this->split_len = 256;
$this->ttl = $_ttl; //default session time to live is 15 min -> 900
seconds.
$this->table_name = 'session';
$this->db_name = 'user';
session_name($this->name);
ini_set('session.use_cookies', $_use_cookies);
ini_set('session.gc_probability', $_gc_percent);
ini_set('session.use_trans_sid',0);
@mysql_select_db($this->db_name);
session_set_save_handler(
array(&$this, "_sess_open"),
array(&$this, "_sess_close"),
array(&$this, "_sess_read"),
array(&$this, "_sess_write"),
array(&$this, "_sess_destroy"),
array(&$this, "_sess_gc")
);
session_start();
$this->id = session_id();
}
function set_db($_db, $_table){
$this->db_name = $_db;
$this->table_name = $_table;
}
function _sess_open($_spath, $_sname){
@mysql_select_db($this->db_name);
return true;
}
function _sess_read($_id){
@mysql_select_db($this->db_name);
$res = @mysql_query('SELECT data, UNIX_TIMESTAMP(changed) AS changed
FROM '.$this->table_name.' WHERE name="'.$this->name.'" AND
id="'.$_id.'"
AND (UNIX_TIMESTAMP(changed)+'.$this->ttl.') >= '.time().' ORDER BY
pos');
$ret_str = '';
while ($row = @mysql_fetch_object($res)) {
$ret_str .= $row->data;
}
$ret_str = (string)base64_decode($ret_str);
return (string)$ret_str;
}
function _sess_write($_id, $_data){
$_data = base64_encode($_data);
@mysql_select_db($this->db_name);
// mysql_query("SELECT GET_LOCK('".$_id."',120)");
@mysql_query('DELETE FROM '.$this->table_name.' WHERE
name="'.$this->name.'" AND id="'.$_id.'"');
$pos = 0;
while ($part = substr($_data, ($pos * $this->split_len),
$this->split_len)) {
mysql_query('INSERT INTO '.$this->table_name.'(id, name, pos, data)
VALUES("'.$_id.'","'.$this->name.'",'.($pos++).',"'.$part.'")');
} //while
return true;
}
function _sess_close(){
return true;
}
function _sess_destroy($_id){
@mysql_query('DELETE FROM '.$this->table_name.' WHERE
name="'.$this->name.'" AND id="'.$_id.'"');
return true;
}
function _sess_gc($_max_lifetime){
@mysql_query('DELETE FROM '.$this->table_name.' WHERE
name="'.$this->name.'" AND
(UNIX_TIMESTAMP(changed)+'.$this->ttl.') <
'.time());
return true;
}
} //class Session
$sess = new Session('MUMM', 900, 0, 1);
?>
MySQL log:
020907 22:04:02 11 Statistics
12 Connect suser@localhost on
11 Init DB user
11 Init DB user
11 Init DB user
11 Query SELECT data, UNIX_TIMESTAMP(changed) AS changed FROM
session WHERE name="MUMM" AND id="ecb7cbefe334e74f55de53d5875136ef" AND
(UNIX_TIMESTAMP(changed)+900) >= 1031429042 ORDER BY pos
11 Init DB user
11 Query SELECT md5 as md, txt_ee AS txt FROM i18n
12 Init DB user
12 Init DB user
12 Init DB user
12 Query SELECT data, UNIX_TIMESTAMP(changed) AS changed FROM
session WHERE name="MUMM" AND id="ecb7cbefe334e74f55de53d5875136ef" AND
(UNIX_TIMESTAMP(changed)+900) >= 1031429042 ORDER BY pos
12 Init DB user
12 Query SELECT md5 as md, txt_ee AS txt FROM i18n
12 Init DB user
12 Query DELETE FROM session WHERE name="MUMM" AND
id="ecb7cbefe334e74f55de53d5875136ef"
12 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",0,"c2J5fHM6MjoiMTYiO3N3fHM6MDoiIjtldnxhOjE5OntzOjM6ImtleSI7czoyOiI3NiI7czo0OiJuaW1pIjtzOjk6IkVTVElLTyBBUyI7czo2OiJlcmVnbnIiO3M6ODoiMTAwMDAzNTYiO3M6MToidCI7czoxOiJKIjtzOjQ6ImFkZHIiO3M6MjA6IlNvb2xhIDggNTAxMDcgIFRhcnR1IjtzOjM6InRlbCI7czo5OiIwNy8zNzEwMDAiO3M6Mzoi")
12 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",1,"ZmF4IjtzOjk6IjA3LzM3MTAxMCI7czo3OiJrYXBpdGFsIjtzOjE0OiI1OSA4NTAgNjYwIEVFSyI7czo0OiJtYWlsIjtzOjE2OiJlc3Rpa29AZXN0aWtvLmVlIjtzOjM6Ind3dyI7czoxMzoid3d3LmVzdGlrby5lZSI7czo2OiJhcmlyZWciO3M6Mjg6IjA5LjA0LjE5OTYgVGFydHUgxHJpcmVnaXN0ZXIiO3M6NDoidm9ybSI7czoxMToiQWt0")
12 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",2,"c2lhc2VsdHMiO3M6MzoidGVnIjthOjI6e2k6MDtzOjQ3OiJJc2lrdWxlIGt1dWx1dmF0ZSBtaXR0ZWVsdXJ1dW1pZGUgduRsamH8/HJpbWluZSI7aToxO3M6NDY6Iktpbm5pc3ZhcmEgaGFsZHVzIHRhc3UgZWVzdCB29WkgbGVwaW5ndSBhbHVzZWwiO31zOjM6InJhcCI7YToxOntzOjE6IkUiO2E6MTp7aTowO2E6Mjp7aTowO3M6MTU6IjEw")
12 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",3,"MDAwMzU2X0UuaHRtbCI7aToxO3M6MTA6IjI4LjA5LjIwMDAiO319fXM6MjoiYmsiO3M6MTA6IjI2LjA4LjIwMDIiO3M6MzoiYmlsIjthOjQ6e2k6MDtzOjM6IlMwMSI7aToxO3M6MzoiUzAwIjtpOjI7czozOiJTOTkiO2k6MztzOjM6IlM5OCI7fXM6NDoidmFsdiI7czowOiIiO3M6MjoibWgiO3M6MDoiIjtzOjM6Im1oYyI7aTowO31rbHxO")
12 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",4,"O3J0aW1lfE47cGdnfGk6MDtjdGltZXxpOjEwMzE0Mjg2MjY7bWFzc3xhOjIyOntpOjE0O2E6Mjp7czoxOiJlIjtzOjg6IjEwMDc0NTI1IjtzOjE6Im4iO3M6MjU6IkEgJiBMIE1BTkFHRU1FTlQgRUVTVEkgQVMiO31pOjIxO2E6Mjp7czoxOiJlIjtzOjg6IjEwNTU5NTMwIjtzOjE6Im4iO3M6OToiQUFCRUxJIE/cIjt9aToyNjthOjI6e3M6")
12 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",5,"MToiZSI7czo4OiIxMDA0NDAzMyI7czoxOiJuIjtzOjg6IkFMREVSIE/cIjt9aTozNzthOjI6e3M6MToiZSI7czo4OiIxMDQ1Nzg0MSI7czoxOiJuIjtzOjE1OiJBTUVSIFRPQkFDQ08gQVMiO31pOjQ4O2E6Mjp7czoxOiJlIjtzOjg6IjEwNzAxODczIjtzOjE6Im4iO3M6MjI6IkFVU1RSSUEgVEFCQUsgRUVTVEkgT9wiO31pOjYzO2E6Mjp7")
12 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",6,"czoxOiJlIjtzOjg6IjEwMzEyMDgzIjtzOjE6Im4iO3M6MTg6IkNPRkZJSyAmIFBVRkZFVCBP3CI7fWk6NzY7YToyOntzOjE6ImUiO3M6ODoiMTAwMDAzNTYiO3M6MToibiI7czo5OiJFU1RJS08gQVMiO31pOjg2O2E6Mjp7czoxOiJlIjtzOjg6IjEwMzc2OTMwIjtzOjE6Im4iO3M6MjQ6IkhPVVNFIE9GIFBSSU5DRSBFRVNUSSBBUyI7fWk6")
12 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",7,"OTQ7YToyOntzOjE6ImUiO3M6ODoiMTA4MTM5MDAiO3M6MToibiI7czoxMToiS0FSSVBMT04gT9wiO31pOjEwMTthOjI6e3M6MToiZSI7czo4OiIxMDI1NjEzNyI7czoxOiJuIjtzOjE1OiJLUkVESUlESUlORk8gQVMiO31pOjExMjthOjI6e3M6MToiZSI7czo4OiIxMDE5MzEwNiI7czoxOiJuIjtzOjE5OiJMT1NTSSBLSU5OSVNWQVJBIE/c")
12 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",8,"Ijt9aToxMjc7YToyOntzOjE6ImUiO3M6ODoiMTA2NzUyNTkiO3M6MToibiI7czoxOToiTUVSSURJQU5VUyBERUxUQSBP3CI7fWk6MTMyO2E6Mjp7czoxOiJlIjtzOjg6IjEwNDUzNjA3IjtzOjE6Im4iO3M6MTQ6Ik1VTFRJTElOR1VBIEFTIjt9aToxNDU7YToyOntzOjE6ImUiO3M6ODoiMTAzOTcxMjIiO3M6MToibiI7czo2OiJPUk0gT9wi")
12 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",9,"O31pOjE2MDthOjI6e3M6MToiZSI7czo4OiIxMDA3ODY4NyI7czoxOiJuIjtzOjg6IlJFTUVUIEFTIjt9aToxNzU7YToyOntzOjE6ImUiO3M6ODoiMTA1MjY3NzIiO3M6MToibiI7czoyNToiUkVWSVZBTCBTVk9SSVMgRVNUT05JQSBP3CI7fWk6MTg3O2E6Mjp7czoxOiJlIjtzOjg6IjEwNTg2ODczIjtzOjE6Im4iO3M6MTM6IlJFVklWQUxM")
12 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",10,"LVYgT9wiO31pOjIwMDthOjI6e3M6MToiZSI7czo4OiIxMDA2Njg0NSI7czoxOiJuIjtzOjExOiJTRVJFTkRBTCBBUyI7fWk6MjEyO2E6Mjp7czoxOiJlIjtzOjg6IjEwODcyNDk3IjtzOjE6Im4iO3M6MTM6IlNLVlMgR1JVUFAgT9wiO31pOjIyMzthOjI6e3M6MToiZSI7czo4OiIxMDEwMDI0MCI7czoxOiJuIjtzOjEyOiJTWUxWRVNURVIg")
12 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",11,"QVMiO31pOjIyOTthOjI6e3M6MToiZSI7czo4OiIxMDM4NzI3NiI7czoxOiJuIjtzOjE3OiJUUkFOU0ZFUiBHUlVQUCBP3CI7fWk6MjQyO2E6Mjp7czoxOiJlIjtzOjg6IjEwNzM1NDI5IjtzOjE6Im4iO3M6MTI6IlfVUk8gVkFSQSBP3CI7fX1hdXRofE86NDoiYXV0aCI6OTp7czo2OiJrbGllbnQiO2E6Nzp7czo0OiJuaW1pIjtzOjE0OiJW")
12 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",12,"bGFkaW1pciBS/G50/CI7czoxMToia2xpZW5kaWtvb2QiO3M6MToiMSI7czoxMDoib25saW5la29vZCI7czo0OiIxODM0IjtzOjU6ImVtYWlsIjtzOjIxOiJ2bGFkc0BrcmVkaWlkaWluZm8uZWUiO3M6NjoidHVubnVzIjtzOjE6IksiO3M6NzoiYnJvd3NlciI7czo2OiJpZS5naWYiO3M6NjoiZXJlZ25yIjtzOjg6IjEwMjU2MTM3Ijt9czo3")
12 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",13,"OiJrZXJlZ25yIjtOO3M6NToibG9naW4iO047czo3OiJpc19hdXRoIjtiOjE7czo0OiJfdHRsIjtpOjgwMDtzOjU6Il90aW1lIjtpOjEwMzE0MjkwNDI7czo4OiJpbmZvX3R4dCI7czowOiIiO3M6ODoibmV4dF9ybmQiO047czo4OiJsb2dpbl9pZCI7Tjt9aGlzdHxhOjU6e2k6MDthOjI6e3M6MToiZSI7czo4OiIxMDA3NDUyNSI7czoxOiJu")
12 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",14,"IjtzOjI1OiJBICYgTCBNQU5BR0VNRU5UIEVFU1RJIEFTIjt9aToxO2E6Mjp7czoxOiJlIjtzOjg6IjEwMDAwMzU2IjtzOjE6Im4iO3M6OToiRVNUSUtPIEFTIjt9aToyO2E6Mjp7czoxOiJlIjtzOjg6IjEwNDU3ODQxIjtzOjE6Im4iO3M6MTU6IkFNRVIgVE9CQUNDTyBBUyI7fWk6MzthOjI6e3M6MToiZSI7czo4OiIxMDMxMjA4MyI7czox")
12 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",15,"OiJuIjtzOjE4OiJDT0ZGSUsgJiBQVUZGRVQgT9wiO31pOjQ7YToyOntzOjE6ImUiO3M6ODoiMTA4MTM5MDAiO3M6MToibiI7czoxMToiS0FSSVBMT04gT9wiO319aXZ8YTowOnt9")
12 Query ROLLBACK
11 Init DB user
11 Query DELETE FROM session WHERE name="MUMM" AND
id="ecb7cbefe334e74f55de53d5875136ef"
11 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",0,"c2J5fGk6NTtzd3xzOjA6IiI7ZXZ8YToxOTp7czozOiJrZXkiO3M6MjoiNzYiO3M6NDoibmltaSI7czo5OiJFU1RJS08gQVMiO3M6NjoiZXJlZ25yIjtzOjg6IjEwMDAwMzU2IjtzOjE6InQiO3M6MToiSiI7czo0OiJhZGRyIjtzOjIwOiJTb29sYSA4IDUwMTA3ICBUYXJ0dSI7czozOiJ0ZWwiO3M6OToiMDcvMzcxMDAwIjtzOjM6ImZheCI7")
11 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",1,"czo5OiIwNy8zNzEwMTAiO3M6Nzoia2FwaXRhbCI7czoxNDoiNTkgODUwIDY2MCBFRUsiO3M6NDoibWFpbCI7czoxNjoiZXN0aWtvQGVzdGlrby5lZSI7czozOiJ3d3ciO3M6MTM6Ind3dy5lc3Rpa28uZWUiO3M6NjoiYXJpcmVnIjtzOjI4OiIwOS4wNC4xOTk2IFRhcnR1IMRyaXJlZ2lzdGVyIjtzOjQ6InZvcm0iO3M6MTE6IkFrdHNpYXNl")
11 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",2,"bHRzIjtzOjM6InRlZyI7YToyOntpOjA7czo0NzoiSXNpa3VsZSBrdXVsdXZhdGUgbWl0dGVlbHVydXVtaWRlIHbkbGph/PxyaW1pbmUiO2k6MTtzOjQ2OiJLaW5uaXN2YXJhIGhhbGR1cyB0YXN1IGVlc3QgdvVpIGxlcGluZ3UgYWx1c2VsIjt9czozOiJyYXAiO2E6MTp7czoxOiJFIjthOjE6e2k6MDthOjI6e2k6MDtzOjE1OiIxMDAwMDM1")
11 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",3,"Nl9FLmh0bWwiO2k6MTtzOjEwOiIyOC4wOS4yMDAwIjt9fX1zOjI6ImJrIjtzOjEwOiIyNi4wOC4yMDAyIjtzOjM6ImJpbCI7YTo0OntpOjA7czozOiJTMDEiO2k6MTtzOjM6IlMwMCI7aToyO3M6MzoiUzk5IjtpOjM7czozOiJTOTgiO31zOjQ6InZhbHYiO3M6MDoiIjtzOjI6Im1oIjtzOjA6IiI7czozOiJtaGMiO2k6MDt9a2x8TjtydGlt")
11 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",4,"ZXxOO3BnZ3xpOjA7Y3RpbWV8aToxMDMxNDI4NjI2O21hc3N8YTowOnt9YXV0aHxPOjQ6ImF1dGgiOjk6e3M6Njoia2xpZW50IjthOjc6e3M6NDoibmltaSI7czoxNDoiVmxhZGltaXIgUvxudPwiO3M6MTE6ImtsaWVuZGlrb29kIjtzOjE6IjEiO3M6MTA6Im9ubGluZWtvb2QiO3M6NDoiMTgzNCI7czo1OiJlbWFpbCI7czoyMToidmxhZHNA")
11 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",5,"a3JlZGlpZGlpbmZvLmVlIjtzOjY6InR1bm51cyI7czoxOiJLIjtzOjc6ImJyb3dzZXIiO3M6NjoiaWUuZ2lmIjtzOjY6ImVyZWduciI7czo4OiIxMDI1NjEzNyI7fXM6Nzoia2VyZWduciI7TjtzOjU6ImxvZ2luIjtOO3M6NzoiaXNfYXV0aCI7YjoxO3M6NDoiX3R0bCI7aTo4MDA7czo1OiJfdGltZSI7aToxMDMxNDI5MDQyO3M6ODoiaW5m")
11 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",6,"b190eHQiO3M6MDoiIjtzOjg6Im5leHRfcm5kIjtOO3M6ODoibG9naW5faWQiO047fWhpc3R8YTo1OntpOjA7YToyOntzOjE6ImUiO3M6ODoiMTAwNzQ1MjUiO3M6MToibiI7czoyNToiQSAmIEwgTUFOQUdFTUVOVCBFRVNUSSBBUyI7fWk6MTthOjI6e3M6MToiZSI7czo4OiIxMDAwMDM1NiI7czoxOiJuIjtzOjk6IkVTVElLTyBBUyI7fWk6")
11 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",7,"MjthOjI6e3M6MToiZSI7czo4OiIxMDQ1Nzg0MSI7czoxOiJuIjtzOjE1OiJBTUVSIFRPQkFDQ08gQVMiO31pOjM7YToyOntzOjE6ImUiO3M6ODoiMTAzMTIwODMiO3M6MToibiI7czoxODoiQ09GRklLICYgUFVGRkVUIE/cIjt9aTo0O2E6Mjp7czoxOiJlIjtzOjg6IjEwODEzOTAwIjtzOjE6Im4iO3M6MTE6IktBUklQTE9OIE/cIjt9fWl2")
11 Query INSERT INTO session(id, name, pos, data)
VALUES("ecb7cbefe334e74f55de53d5875136ef","MUMM",8,"fGE6MDp7fQ==")
11 Query ROLLBACK
11 Quit
--
Edit bug report at http://bugs.php.net/?id=19326&edit=1
--
Try a CVS snapshot: http://bugs.php.net/fix.php?id=19326&r=trysnapshot
Fixed in CVS: http://bugs.php.net/fix.php?id=19326&r=fixedcvs
Fixed in release: http://bugs.php.net/fix.php?id=19326&r=alreadyfixed
Need backtrace: http://bugs.php.net/fix.php?id=19326&r=needtrace
Try newer version: http://bugs.php.net/fix.php?id=19326&r=oldversion
Not developer issue: http://bugs.php.net/fix.php?id=19326&r=support
Expected behavior: http://bugs.php.net/fix.php?id=19326&r=notwrong
Not enough info: http://bugs.php.net/fix.php?id=19326&r=notenoughinfo
Submitted twice: http://bugs.php.net/fix.php?id=19326&r=submittedtwice
register_globals: http://bugs.php.net/fix.php?id=19326&r=globals