Skip to content

Instantly share code, notes, and snippets.

@vicb
Created July 2, 2012 07:31
Show Gist options
  • Save vicb/3031689 to your computer and use it in GitHub Desktop.
Save vicb/3031689 to your computer and use it in GitHub Desktop.
Session concurrency
<?php
// Native handlers
//ini_set('session.save_path', 'tcp://127.0.0.1:11211');
//ini_set('session.save_handler', 'memcache');
//ini_set('session.save_path', '127.0.0.1:11211');
//ini_set('session.save_handler', 'memcached');
// Custom handler
class FileSessionHandler
{
private $savePath;
function open($savePath, $sessionName)
{
$this->savePath = __DIR__.'/session';
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/sess_$id");
}
function write($id, $data)
{
var_dump('write() start '.date('His'));
sleep(2);
$ret = file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;
sleep(2);
var_dump('write() end '.date('His'));
return $ret;
}
function destroy($id)
{
$file = "$this->savePath/sess_$id";
if (file_exists($file)) {
unlink($file);
}
return true;
}
function gc($maxlifetime)
{
foreach (glob("$this->savePath/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')
);
register_shutdown_function('session_write_close');
$start = session_start();
var_dump('started '.date('His'));
var_dump(array(
'start' => $start,
'session' => $_SESSION,
));
$key = isset($_GET['key']) ? $_GET['key'] : 'key';
$data = isset($_GET['data']) ? $_GET['data'] : 'data';
var_dump('set '.date('His'));
$_SESSION[$key] = $data;
var_dump('sleep '.date('His'));
sleep(5);
var_dump('sleep end '.date('His'));
var_dump($_SESSION);
var_dump('end of script '.date('His'));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment