CGI-Session-Driver-memcache

 view release on metacpan or  search on metacpan

example/memc_example.pl  view on Meta::CPAN

$Data::Dumper::Indent = 1;
$Data::Dumper::Terse = 1;
$Data::Dumper::Sortkeys = 1;
use strict;
#use warnings;
use CGI::Carp qw(fatalsToBrowser);
# OLD:Pre-load memcache and TWEAK %INC to make CGI::Session and require think
# its loaded from proper location !!!
#use lib ('..');
#require('memcache.pm');
# %INC entry 'memcache.pm' => '../memcache.pm' is not enough
#$INC{'CGI/Session/Driver/memcache.pm'} = $INC{'memcache.pm'};
our $cgi;
our $sess;
our $memd;
#######################################################
# Detect web context, instantiate CGI request
if ($ENV{'HTTP_HOST'}) {$cgi = CGI->new();}
# Use pretty much any Perl memcache client API and connect to
# Memcached Server std. port: 11211
# See README for other perl clients (Such as Cache::Memcached::Fast)
$memd = $memd || new Cache::Memcached({
#$memd = $memd || new Cache::Memcached::Fast({
  servers => ['localhost:11211'],
  # 'serialize_methods' => [\&Storable::freeze, \&Storable::thaw],
});
if (!$memd) {die("No Connection to Memcached !");}


# NON-CGI Context (Command line)
if (!$cgi) {
  my $key = 'E1';
  #my $initval =  "Hello"; # {'foo' => 1}
  if (my ($val) = @ARGV) {my $ok = $memd->set($key, [$val]);} # $initval
  #if (!$ok) {die("Failed to set value !\n");}
  my $val = $memd->get($key);
  print("Value ('$key'): ".(ref($val) ? Dumper($val) : $val)."\n");
}
# CGI Running under Webserver
else {
  my $sid;
  #local 
  $CGI::Session::Driver::memcache::trace = 1;
  if (!$memd) {print("No memd connection\n");}
  # Execute store/retrieve/remove operations through memcached connection handle
  # passed at session construction (Never initiate memcache connections in driver).
  eval {
    $sess = CGI::Session->new("driver:memcache", $cgi, {'Handle' => $memd});
    
  };
  if (!$sess || $@) {
     #print CGI::header('text/html');
     die("Failed to create CGI::Session with memcache backend
     (CGI: $cgi, sess:$sess):\n$@");
  }
  my $mimeworkaround = 0;
  if ($mimeworkaround) {
    my ($name, $id, $time_s) = ($sess->name(), $sess->id(), $sess->expire(),);
    my $cookie = $cgi->cookie(
      -name=>$name, -value=>$id, -expires=> '+' . $time_s . 's',);
    print("Set-Cookie: ".$cookie->as_string()."\r\n");
    print("Content-type: text/html\r\n\r\n");
  }
  else {
    print $sess->header(); # Override for type: -type => 'text/plain'
  }
  $sid = $sess->id();
  #print CGI::header('text/html');
  
  my $runtime = $ENV{'MOD_PERL'} ? $ENV{'MOD_PERL'} : 'CGI';
  # Set
  $sess->param('K1', "Hi from PID $$ ($runtime) !");
  # Get
  my $v = $sess->param('K1');
  print("<p>Value of key K1 from Session: '$sid' is $v</p>");
  print("<p style=\"font-size: 11px;\">Enter ?debug=1 into URL to dump session,</p>");
  #DEBUG:print("Sample: $CGI::Session::Driver::memcache::memd_connerror\n\n");
  #DEBUG:print("<pre>".Dumper($sess)."</pre>");
  # MUST do flush(), the session is not persisted otherwise and a new session
  # is always created in absense of old session
  $sess->flush();
  # Dump all of $sess. Note only '_DATA' branch will be stored in
  # memcached backend side
  if ($cgi->param('debug')) {print("<pre>".Dumper($sess)."</pre>");}
}



( run in 0.570 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )