MemCached is a
generic purpose distributed high performance memory object caching system to use in
speeding up dynamic database driven website hostings by caching data and objects in memory to reduce the amount the database needs to be read. It runs on
port 11211 by default, so make sure to
open it up in the server's firewall.
Memcached’s APIs provide a giant hash table distributed across multiple machines. When the table is full, subsequent inserts cause older data to be purged in least recently used order.
Applications using memcached typically layer memcached requests and additions into code before falling back on a slower backing store, such as a database.
It uses
libevent to scale to any number of open connections, uses non-blocking network I/O, refcounts internal objects (so objects can be in multiple states to multiple clients), & uses its own slab allocator and hash table
so virtual memory never gets externally fragmented and allocations are guaranteed.
Selecting
MemCache fom the Apache Built-in Modules when recompiling Apache [
/scripts/easyapache in case of cPanel servers] it recompiles the module, but how it is used or rather how to make it work properly
Once the recompilation process has completed successfully, follow these steps to confirm that the compiled Apache module is working in full action
Create a phpinfo.php file as usual but with the following code within it..
PHP Code:
<?php
error_reporting(E_ALL);
$memcache = memcache_connect('localhost', 11211);
if ($memcache) {
$memcache->set("str_key", "String to store in memcached");
$memcache->set("num_key", 123);
$object = new StdClass;
$object->attribute = 'test';
$memcache->set("obj_key", $object);
$array = Array('assoc'=>123, 345, 567);
$memcache->set("arr_key", $array);
var_dump($memcache->get('str_key'));
var_dump($memcache->get('num_key'));
var_dump($memcache->get('obj_key'));
}
else {
echo "Connection to memcached failed";
}
?>
<?php phpinfo(); ?>
Create the configuration file for the mem_cache daemon :
PHP Code:
touch /etc/memcached.conf
Edit the above created file and paste the following code within it :
PHP Code:
#Memory a user can use
-m 16
# default port
-p 11211
# user to run daemon nobody/apache/www-data
-u nobody
# only listen locally
-l 127.0.0.1
Create the startups files :
PHP Code:
touch /etc/init.d/memcached
chmod +x /etc/init.d/memcached
Edit the above created file and paste the following code within it :
PHP Code:
#!/bin/bash
#
# memcached This shell script takes care of starting and stopping
# standalone memcached.
#
. /etc/rc.d/init.d/functions
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/bin/memcached
DAEMONBOOTSTRAP=/usr/local/bin/start-memcached
DAEMONCONF=/etc/memcached.conf
NAME=memcached
DESC=memcached
PIDFILE=/var/run/$NAME.pid
[ -x $DAEMON ] || exit 0
[ -x $DAEMONBOOTSTRAP ] || exit 0
RETVAL=0
start() {
echo -n $"Starting $DESC: "
daemon $DAEMONBOOTSTRAP $DAEMONCONF
RETVAL=$?
[ $RETVAL -eq 0 ] && touch $PIDFILE
echo
return $RETVAL
}
stop() {
echo -n $"Shutting down $DESC: "
killproc $NAME
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f $PIDFILE
return $RETVAL
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
RETVAL=$?
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
exit 1
esac
exit $RETVAL
Create the startup script :
PHP Code:
touch /usr/local/bin/start-memcached
chmod +x /usr/local/bin/start-memcached
Edit the above created file and paste the following code within it :
PHP Code:
#!/usr/bin/perl -w
# start-memcached
use strict;
if ($> != 0 and $< != 0) {
print STDERR "Only root wants to run start-memcached.\n";
exit;
}
my $etcfile = shift || "/etc/memcached.conf";
my $params = [];
my $etchandle;
# This script assumes that memcached is located at /usr/bin/memcached, and
# that the pidfile is writable at /var/run/memcached.pid
my $memcached = "/usr/local/bin/memcached";
my $pidfile = "/var/run/memcached.pid";
# If we don't get a valid logfile parameter in the /etc/memcached.conf file,
# we'll just throw away all of our in-daemon output. We need to re-tie it so
# that non-bash shells will not hang on logout. Thanks to Michael Renner for
# the tip
my $fd_reopened = "/dev/null";
sub handle_logfile {
my ($logfile) = @_;
$fd_reopened = $logfile;
}
sub reopen_logfile {
my ($logfile) = @_;
open *STDERR, ">>$logfile";
open *STDOUT, ">>$logfile";
open *STDIN, ">>/dev/null";
$fd_reopened = $logfile;
}
# This is set up in place here to support other non -[a-z] directives
my $conf_directives = {
"logfile" => &handle_logfile
};
if (open $etchandle, $etcfile) {
foreach my $line (<$etchandle>) {
$line =~ s/#.*//go;
$line = join ' ', split ' ', $line;
next unless $line;
next if $line =~ /^-[dh]/o;
if ($line =~ /^[^-]/o) {
my ($directive, $arg) = $line =~ /^(.*?)s+(.*)/;
$conf_directives->{$directive}->($arg);
next;
}
push @$params, $line;
}
}
unshift @$params, "-u root" unless (grep $_ eq '-u', @$params);
$params = join " ", @$params;
if (-e $pidfile) {
open PIDHANDLE, "$pidfile";
my $localpid = <PIDHANDLE>;
close PIDHANDLE;
chomp $localpid;
if (-d "/proc/$localpid") {
print STDERR "memcached is already running.\n";
exit;
} else {
`rm -f $localpid`;
}
}
my $pid = fork();
if ($pid == 0) {
reopen_logfile($fd_reopened);
exec "$memcached $params";
exit(0);
} elsif (open PIDHANDLE,">$pidfile") {
print PIDHANDLE $pid;
close PIDHANDLE;
} else {
print STDERR "Can't write pidfile to $pidfile.\n";
}
Test the scripts :
PHP Code:
[root@test init.d]# /etc/init.d/memcached restart
Shutting down memcached: [ OK ]
Starting memcached: [ OK ]
Review if the conf file is parsed/running correctly :
PHP Code:
[root@test init.d]# ps aux | grep memcached
nobody 8906 0.5 0.3 18248 16444 pts/0 S 13:55 0:00 /usr/local/bin/memcached -u root -m 16 -p 11211 -u nobody -l 127.0.0.1
Add memcached as autostart daemon :
PHP Code:
[root@test init.d]# /sbin/chkconfig memcached on
[root@test init.d]# /sbin/chkconfig --list | grep memcached
memcached 0: off 1: off 2: on 3: on 4: on 5: on 6: off
Enjoy..
