terça-feira, 20 de agosto de 2013

Usando Redis como session handler no PHP.

Usando Redis como session handler no PHP.

Em sistemas que façam uso excessivo de sessões, pode ocasionar lentidão, pois sendo necessário muitas leituras e escritas aos arquivos de sessões, tendo isso em mente podemos fazer uso de soluções de cache, como Memcache ou mesmo o Banco de dados NoSQL Redis, aqui faremos uso do Redis por ser mais rápido e não necessitar de tantas bibliotecas e configurações como é o caso do Memcache.

Instalando o Redis

Baixe a versão mais atual do Redis no Site: http://redis.io/
Para nossa instrução estaremos usando a versão mais recente disponível no site até este momento.
curl http://redis.googlecode.com/files/redis-2.6.14.tar.gz | tar xzvf -

cd redis-2.6.14/

make
O Redis é desenvolvido para ser executado em plataforma de 64bits, caso necessite executa-los em ambiente 32bits execute o make passando o parâmetro 32bits
make 32bit
Após a compilação é recomendado que faça o test, por se tratar de um banco de dados que trabalha principalmente com a memória ele fará testes com todas suas funções afim de detectar algum erro.
Talvez seja necessário proceder a instalação do pacote tcl, usado para os testes do redis.
apt-get install tcl
Execute os testes.
make test
Se tudo correu bem ao termino dos testes você terá uma mensagem como esta.
\o/ All tests passed without errors!
Proceda a instalação:
make install

mkdir /etc/redis

cp redis.conf /etc/redis
Neste ponto a instalação já esta funcional, necessitando agora apenas a criação de alguns diretórios de suporte, que serão usados para manter um log do Redis e um dump dos dados da memória.

Instalação do script de startup (init.d)

Passaremos aos passos finais de instalação do Redis, com a inclusão do script de inicialização. Salve o arquivo no diretório /etc/init.d/ com o nome redis-server.
Torne o inicializável.
chmod 755 /etc/init.d/redis-server

update-rc.d /etc/init.d/redis-server defaults
Finalizando crie o diretório abaixo e de as devidas permissões.
useradd redis
groupadd redis

mkdir /var/redis

chown redis:redis /var/redis
chmod 755 /var/redis
Edite o arquivo /etc/redis/redis.conf, localize a linha daemonize troque seu valor para yes
daemonize no

para 

daemonize yes
Localize a seguinte linha dir ./
dir ./

para

dir /var/redis
Por padrão o sistema operacional Linux não permite que uma aplicação tome muita memoria, da mesma forma que fazemos com o Oracle devemos fazer com o Redis, permitindo assim que ele use quanta memoria necessitar para satisfazer a aplicação, mais otimizações sobre quando de memória ele pode tomar pode ser visto diretamente no site, ou em seu arquivo de configuração que vem completamente comentado.
Adicione a seguinte linha ao final do arquivo de configuração /etc/sysctl.conf e reinicie o computador após a edição, ou execute a linha abaixo para usar imediatamente.
sysctl vm.overcommit_memory=1
vm.overcommit_memory = 1
Pronto o Redis está instalado e pode ser executado. /etc/init.d/redis-server start
### BEGIN INIT INFO
# Provides: redis-server
# Required-Start: $syslog
# Required-Stop: $syslog
# Should-Start: $local_fs
# Should-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: redis-server - Persistent key-value db
# Description: redis-server - Persistent key-value db
### END INIT INFO


PATH=/opt/redis/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/bin/redis-server
CONFIG_FILE=/etc/redis/redis.conf
DAEMON_ARGS="$CONFIG_FILE"
NAME=redis-server
DESC=redis-server
PIDFILE=/var/run/redis.pid
LOGFILE=/var/log/redis.log

test -x $DAEMON || exit 0
test -x $DAEMONBOOTSTRAP || exit 0

set -e

case "$1" in
start)
echo -n "Starting $DESC: "
touch $PIDFILE $LOGFILE
chown redis:redis $PIDFILE $LOGFILE
if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS
then
echo "$NAME."
else
echo "failed"
fi
;;
stop)
echo -n "Stopping $DESC: "
if [ ! -e "$PIDFILE" ]
then
echo "failed"
else
LISTENING_PORT=`grep -E "port +([0-9]+)" "$CONFIG_FILE" | grep -Eo "\d*[0-9]+$"`
if echo "SHUTDOWN\r\n" | nc localhost "$LISTENING_PORT"
then
echo "$NAME."
else
echo "failed"
fi
rm -f $PIDFILE
fi
;;

restart|force-reload)
${0} stop
${0} start
;;
*)
echo "Usage: /etc/init.d/$NAME {start|stop|restart|force-reload}" >&2
exit 1
;;
esac

exit 0

Instalando o predis extensão para o PHP

Vamos fazer uso do modulo predis que é o módulo do php que possui o melhor suporte ao Redis, o download pode ser feito a partir da Url do projeto em: Predis
Ou execute o clone do projeto.
git clone https://github.com/nicolasff/phpredis.git
Vamos passar agora para a compilação do módulo.
cd phpredis

phpize

./configure 

make 

make install 

echo "extension=redis.so" >> /etc/php5/fpm/conf.d/redis.ini
Após estes passos reinicie o php, caso esteja utilizando fpm ou reinicie o servidor web caso esteja utilizando o php como um módulo.
/etc/init.d/php5-fpm reload
Agora vamos a etapa final, fazer com o que o php reconheça o redis.
Localize a linha session.save_handler e a substitua por:
session.save_handler = redis
Localize a linha session.save_path e a substitua por:
session.save_path = "tcp://localhost:6379/"
Feito isso apenas reinicie o php, e diga adeus a msession do PHP.

Lembrando que o redis ainda podemos balancear as sessões em diversos servidores redis. 

Nenhum comentário:

Postar um comentário