+<?php
+class FileSessionHandler {
+ private $savePath;
+
+ function open($savePath, $sessionName) {
+ $this->savePath = $savePath;
+ if (!is_dir($this->savePath)) {
+ mkdir($this->savePath, 0777);
+ }
+
+ return true;
+ }
+
+ function close() {
+ return true;
+ }
+
+ function read($id) {
+ return (string)@file_get_contents("$this->savePath/qt_sess_$id");
+ }
+
+ function write($id, $data) {
+ return file_put_contents("$this->savePath/qt_sess_$id", $data) === false ? false : true;
+ }
+
+ function destroy($id) {
+ $file = "$this->savePath/qt_sess_$id";
+ if (file_exists($file)) {
+ unlink($file);
+ }
+
+ return true;
+ }
+
+ function gc($maxlifetime) {
+ foreach (glob("$this->savePath/qt_sess_*") as $file) {
+ if (filemtime($file) + $maxlifetime < time() && file_exists($file)) {
+ unlink($file);
+ }
+ }
+
+ return true;
+ }
+}
+
+$handler = new FileSessionHandler();
+session_set_save_handler(
+ array($handler, 'open'),
+ array($handler, 'close'),
+ array($handler, 'read'),
+ array($handler, 'write'),
+ array($handler, 'destroy'),
+ array($handler, 'gc')
+);
+
+// the following prevents unexpected effects when using objects as save handlers
+register_shutdown_function('session_write_close');
+?>