php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #19326 Session data written twice
Submitted: 2002-09-10 02:11 UTC Modified: 2002-09-12 11:09 UTC
From: vlads at krediidiinfo dot ee Assigned:
Status: Not a bug Package: Session related
PHP Version: 4.2.3 OS: RH Linux 7.1, kernel 2.4.9-34smp
Private report: No CVE-ID: None
View Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
If you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: vlads at krediidiinfo dot ee
New email:
PHP Version: OS:

 

 [2002-09-10 02:11 UTC] vlads at krediidiinfo dot ee
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       

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2002-09-12 06:47 UTC] vlads at krediidiinfo dot ee
Problem is not in php, but in IE (6 and 6SP1)
It makes two requests in a row and first request (the bogus one) will be aborted.

Solution:
I check the connection state first and when it is active I write the session data, otherwise I don't.

My page contains <meta http-equiv="refrech"...
Maybe thats why IE makes bogus request...don't know..
 [2002-09-12 11:09 UTC] sniper@php.net
Some people have had similar problems (duplicate inserts) which were caused by faulty HTML..iirc, using background=some_image.gid in wrong place. Maybe same thing for you too? :)


 
PHP Copyright © 2001-2026 The PHP Group
All rights reserved.
Last updated: Wed Oct 07 20:00:02 2026 UTC