note 37995 added to function.session-set-save-handler

From: Date: Thu, 04 Dec 2003 03:30:19 +0000
Subject: note 37995 added to function.session-set-save-handler
Groups: php.notes 
Request: Send a blank email to php-notes+get-61373@lists.php.net to get a copy of this message
I found the need to have a garbage collection function run with my sessions so I had to write my own session handler. I took the example code above but found that it had a problem, it does not open the session file exclusively. This means that if you have a frameset where 2 pages are accessing the session at the same time and both modify the session only the last page to finish processing will have its session data saved. The first page will have all of its session data overwritten. So here is a modified version of a file session handler in PHP that has file locking. (Not supported on FAT or NFS apparently) $sess_save_path = $sess_session_name = $fp=null; function open ($save_path, $session_name) { global $sess_save_path, $sess_session_name; $sess_save_path = $save_path; $sess_session_name = $session_name; return(true); } function close() { global $fp; flock($fp, LOCK_UN); fclose($fp); $fp=null; return(true); } function read ($id) { global $sess_save_path, $sess_session_name, $fp; $sess_file = "$sess_save_path/sess_$id"; if ($fp = @fopen($sess_file, "r+")) { flock($fp, LOCK_EX); $sess_data = fread($fp, filesize($sess_file)); return($sess_data); } else { return(""); // Must return "" here. } } function write ($id, $sess_data) { global $sess_save_path, $sess_session_name, $fp; $sess_file = "$sess_save_path/sess_$id"; if (!empty($fp)) { fseek($fp,0); return(fwrite($fp, $sess_data)); } elseif ($fp = @fopen($sess_file, "w")) { flock($fp, LOCK_EX); return(fwrite($fp, $sess_data)); } else { return(false); } } function destroy ($id) { global $sess_save_path, $sess_session_name; $sess_file = "$sess_save_path/sess_$id"; return(@unlink($sess_file)); } function gc ($maxlifetime) { global $sess_save_path, $sess_session_name; $sess_file = "$sess_save_path/sess_$id"; return true; } session_set_save_handler ("open", "close", "read", "write", "destroy", "gc"); enjoy ---- Manual Page -- http://www.php.net/manual/en/function.session-set-save-handler.php Edit -- http://master.php.net/manage/user-notes.php?action=edit+37995 Delete -- http://master.php.net/manage/user-notes.php?action=delete+37995&report=yes Reject -- http://master.php.net/manage/user-notes.php?action=reject+37995&report=yes Search -- http://master.php.net/manage/user-notes.php

« previous php.notes (#61373) next »