This guide will walk you through installing memcache and memcached on a dedicated or vps server.
For the wiki version of this guide visit: http://wiki.beyondhosting.net/Memcached_and_PHP_with_cPanel
root# yum install libevent libevent-devel -y
Head over to http://memcached.org/ and grab the latest version.
root# yum install libevent-devel libevent gcc make -y root# wget http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz root# tar xvf memcached-1.4.5.tar.gz root # cd memcached-1.4.5 root# ./configure && make && make install
Open /etc/memcached.conf with your favorite editor and paste in:
#Memory a usar -m 16 # default port -p 11211 # user to run daemon nobody/apache/www-data -u nobody # only listen locally -l 127.0.0.1
touch /etc/init.d/memcached chmod +x /etc/init.d/memcached
Open /etc/init.d/memcached with your favorite editor and paste in:
#!/bin/bash # # memcached This shell script takes care of starting and stopping # standalone memcached. # # chkconfig: - 80 12 # description: memcached is a high-performance, distributed memory # object caching system, generic in nature, but # intended for use in speeding up dynamic web # applications by alleviating database load. # processname: memcached # config: /etc/memcached.conf # Source function library. . /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
touch /usr/local/bin/start-memcached chmod +x /usr/local/bin/start-memcached
Open /usr/local/bin/start-memcached with your favorite editor and paste in:
#!/usr/bin/perl -w # start-memcached # 2003/2004 - Jay Bonci <[email protected]> # This script handles the parsing of the /etc/memcached.conf file # and was originally created for the Debian distribution. # Anyone may use this little script under the same terms as # memcached itself. 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"; }
Now we start the memcached daemon. (it is ok if “shutting down memcached” says fail.)
[root@ ~]# /etc/init.d/memcached restart Shutting down memcached: [ OK ] Starting memcached: [ OK ]
Make sure its running by:
[root@srv01 init.d]# ps aux | grep memcached
nobody 5966 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
Now we will set memcached to run at startup:
[root@ ~]# /sbin/chkconfig memcached on [root@ ~]# /sbin/chkconfig --list | grep memcached memcached 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Now we will install the memcache plugin for PHP.
Download the latest stable version of memcache from http://pecl.php.net/package/memcache
root# wget http://pecl.php.net/get/memcache-2.2.5.tgz root# tar xvf memcache-2.2.5.tgz root# cd memcache-2.2.5 root# phpize root# ./configure && make && make install
Now open /usr/local/lib/php.ini with your favorite text editor and find the dynamic extension section.
Add this
extension=memcache.so
Now restart apache with:
service httpd restart
We will now check to make sure memcached is running.
Create an empty file called test.php and place this in it:
<? phpinfo(); ?>
root# php -f test.php | grep "memcache support" memcache support => enabled
If this command does not return any thing the memcache plugin did not load correctly.
You can now delete test.php, your memcache installation should be functional.
References:
http://www.vbseo.com/blogs/danny-bembibre/daemon-scripts-memcached-44/
http://bloke.org/linux/installing-memcached-on-centos-cpanel/
Very good tutorial about installing memcached on centos. I am running centos on AWS and had no idea about these commands, which I find very useful.
Thank you.
Thanks for this great guide! Saved me a lot of effort – keep up the great work!
Good one..THanks a lot..SAved a lot of time 🙂
Hi,
Please help me, How to migrate memcache from one machine to another. I mean I need the data in memcached migrated. I am using slackware13.1 linux
Mike
Thanks the guide worked flawlessly…
Hi,
I think you have something wrong on /etc/init.d/memcached STATUS command…I replace status $prog with status $NAME and works fine now…
@Mike
I’m aware your question is over a year old, but I wanted to post this for future readers. Memcached is a non-persistent cache, which means it isn’t designed to store data long-term. A restart of the memcached process (or a crash of the server) is enough to wipe the cache. Don’t depend on memcached as the only source of your data. You apps should be able to start with an empty cache and rebuild it as it goes.
In other words, I’m not sure why you would want to migrate the cache to another machine. If your apps can’t handle the load of starting with an empty cache, you’d be better off creating a way to pre-heat the cache before you open the server for the public. Depending on a non-persistent cache to persist is not wise.
If you still want to migrate your cache to another host, here’s a detailed article that describes the process (with code): http://corporate.tuenti.com/es/dev/blog/memcache-migration
Other solutions (that you may want to look into for the future) are Repcached (a replicated memcached) http://repcached.lab.klab.org/ or a cache that supports persistence to disk, such as Redis. http://redis.io/
Thanks for that information @Martijn Heemels