怎样安装PHP的Redis扩展

2016年9月29日 | 分类: 【技术】

【介绍】

Redis是一个开源、支持网络、基于内存、键值对存储数据库,使用ANSI C编写。

Redis提供了持久化存储,重启了服务器后Redis依赖快照进行持久化,即使服务器刚开机启动也不会导致负载陡增。Redis缓存比较适合大流量的Wordpress。

Redis 由四个可执行文件:redis-benchmark、redis-cli、redis-server、redis-stat 这四个文件,加上一个redis.conf就构成了整个redis的最终可用包。

它们的作用如下:
1. redis-server:Redis服务器的daemon启动程序
2. redis-cli:Redis命令行操作工具
3. redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能
4. redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况

【安装:php-redis】

Ubuntu + PHP8:

参考:https://amon.org/ubuntu-php

sudo apt install php8.1-redis -y

CentOS + PHP7:

参考:https://amon.org/php73

dnf install php-redis

【安装:编译redis】

安装 tcl :

要求版本8.5或者更新。

Ubuntu:

sudo apt install php8.1-redis -y

CentOS:

参考:https://amon.org/tcl

yum install tcl -y

如果没有tcl,会导致编译redis时make test时报错:

make test
cd src && make test
make[1]: Entering directory `/root/redis-3.2.4/src'
You need tcl 8.5 or newer in order to run the Redis test
make[1]: *** [test] Error 1
make[1]: Leaving directory `/root/redis-3.2.4/src'
make: *** [test] Error 2

【安装:Redis (apt)】

参考:https://www.redis.com.cn/redis-installation-on-ubuntu.html

安装 Redis 服务器:

sudo apt-get install redis-server

启动 Redis 服务器:

您使用以下命令启动 redis 服务器:

redis-server

启动 Redis 客户端:

redis-cli

打开一个 redis 提示符:

redis 127.0.0.1:6379>

在上面的提示中,127.0.0.1 是机器的 IP 地址,6379 是 Redis 服务器运行的端口。
现在键入 ping 命令。返回 PONG 表示 Redis 已成功安装在您的系统上。

【安装:Redis (编译)】

参考:http://wiki.wooyun.org/server:redis
参考:http://www.runoob.com/redis/server-client-setname
参考:https://www.centos.bz/2017/11/linux-%E9%85%8D%E7%BD%AE-nginx%E3%80%81mysql%E3%80%81php-fpm%E3%80%81redis-%E5%BC%80%E6%9C%BA%E5%90%AF%E5%8A%A8/

下载:https://redis.io/download

最新版本:redis-7.0.5(实证通过)

wget https://github.com/redis/redis/archive/7.0.5.tar.gz && tar zxvf 7.0.5.tar.gz && cd redis-7.0.5 && make && make test && make install

注意:要求 GCC 5.3及以上版本,否则 make 不通过。
参考:https://amon.org/gcc

将可执行文件拷贝到到/usr/local/bin目录下面:

cd /root/redis-6.0.9
mkdir -p /usr/local/redis/{bin,etc,var}
cp -af src/{redis-benchmark,redis-check-aof,redis-cli,redis-sentinel,redis-server} /usr/local/redis/bin/
cp -a redis.conf /usr/local/redis/etc/
echo "export PATH=/usr/local/redis/bin:\$PATH" > /etc/profile.d/redis.sh
. /etc/profile.d/redis.sh
sed -i 's@pidfile.*@pidfile /var/run/redis.pid@' /usr/local/redis/etc/redis.conf
sed -i "s@logfile.*@logfile /usr/local/redis/var/redis.log@" /usr/local/redis/etc/redis.conf
sed -i "s@^dir.*@dir /usr/local/redis/var@" /usr/local/redis/etc/redis.conf
sed -i 's@daemonize no@daemonize yes@' /usr/local/redis/etc/redis.conf
[ -z "`grep ^maxmemory /usr/local/redis/etc/redis.conf`" ] && sed -i 's@maxmemory <bytes>@maxmemory <bytes>\nmaxmemory 360000000@' /usr/local/redis/etc/redis.conf
wget http://www.dwhd.org/script/Redis-server-init-CentOS -O /etc/init.d/redis-server
chmod +x /etc/init.d/redis-server
chkconfig --add redis-server
chkconfig redis-server on
chkconfig --list redis-server

启动redis:

redis-server /usr/local/redis/etc/redis.conf

查看redis端口占用情况:

ss -tnlp | grep 6379

输出:

LISTEN     0      511    127.0.0.1:6379                     *:*                   users:(("redis-server",pid=16275,fd=4))

如果有多个redis:

参考:https://github.com/echocat/puppet-redis/issues/12

we dont use the default init scripts. We want to be able to install multiple redis instances on one machine. So the init scripts are renamed to redis-server_${redis_name}

启动:

service server-redis_1 start

报错:

Redirecting to /bin/systemctl start  server-redis.service
Failed to start server-redis.service: Unit server-redis.service failed to load: No such file or directory.

关闭所有:

redis-cli shutdown

关闭某个端口上的redis:

redis-cli -p 6379 shutdown

说明:关闭以后缓存数据会自动dump到硬盘上,硬盘地址见redis.conf中的dbfilename dump.rdb

查看redis信息:

redis-cli

输出:

127.0.0.1:6379> info
# Server
redis_version:6.0.9
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:291fbcd02ebc3762
redis_mode:standalone
os:Linux 5.0.8-1.el7.elrepo.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:4.8.5
process_id:19980
run_id:e3ed8ffd3c5480695dcd89a2444795231113c559
tcp_port:6379
uptime_in_seconds:398
uptime_in_days:0
hz:10
configured_hz:10
lru_clock:12262435
executable:/root/redis-5.0.4/redis-server
config_file:/usr/local/redis/etc/redis.conf
...

Redis 配置文件说明:

配置文件路径:

/usr/local/redis/etc/redis.conf

注意,默认复制过去的redis.conf文件的daemonize参数为no,所以redis不会在后台运行,这时要测试,我们需要重新开一个终端。修改为yes则为后台运行redis。另外配置文件中规定了pid文件,log文件和数据文件的地址,如果有需要先修改,默认log信息定向到stdout。

下面是redis.conf的主要配置参数的意义:

daemonize:是否以后台daemon方式运行
pidfile:pid文件位置
port:监听的端口号
timeout:请求超时时间
loglevel:log信息级别
logfile:log文件位置
databases:开启数据库的数量
save * *:保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。
rdbcompression:是否使用压缩
dbfilename:数据快照文件名(只是文件名,不包括目录)
dir:数据快照的保存目录(这个是目录)
appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。
appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)
这时你可以打开一个终端进行测试了,配置文件中默认的监听端口是6379

参考:http://www.cnblogs.com/zhaoguihua/p/redis-003

我们说Redis是一个强大的Key-Value存储系统,在前面我们已遇到了两个问题:
1. redis server 启动后,独占进程,能不能修改为后台服务呢?
2. redis server 服务是单线程的,而机器是多核的,能不能在同一台机器上开启多个实例更充分的利用 cpu 资源呢?但6379端口已经被前一个实例绑定,肯定会有冲突,那能不能修改默认端口呢?
答案是肯定的,redis 提供了灵活的配置方式,一种可以通过配置文件来配置,另一种你可以在运行时通过 config set 命令来修改配置。
我们先来看看配置文件吧。
殊不知我们在前面启动 server 的时候敲的 ./redis-server 命令,如果后面不附加参数,它是按默认配置来启动 redis 服务的,其实它后面还可以附加一个配置文件路径的参数。这个配置文件在哪?在redis根目录下有一个redis.conf文件,这个文件为了提供了默认的配置和示例。你不要轻易去动这个文件,除非你非常牛逼。我们还是保险起见先复制一个副本吧。

Redis 配置文件示例:

参考:https://github.com/linli8/cnblogs/blob/master/redis%E5%89%AF%E6%9C%AC.conf

【安装:PHP的Redis扩展】

PHP Redis是Redis的PHP扩展。

参考:https://github.com/phpredis/phpredis/blob/develop/INSTALL.markdown
参考:https://github.com/phpredis/phpredis/issues/508
参考:https://www.80uncle.com/php7-make-make-install-phpredis-error

git clone https://github.com/phpredis/phpredis.git && cd phpredis
phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

PHP7专用分支:

参考:https://blog.csdn.net/jartins/article/details/80371257

git clone https://github.com/nicolasff/phpredis && cd phpredis
phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

PHP5使用较早版本:

参考:https://github.com/phpredis/phpredis/issues/1539

wget -O phpredis-4.3.0.tar.gz https://github.com/phpredis/phpredis/archive/4.3.0.tar.gz && tar xvfz phpredis-4.3.0.tar.gz && cd phpredis-4.3.0
phpize && ./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

输出:

Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-zts-20180731/

在php.ini中添加:

; [redis]
extension = "redis.so"

重启 Apache :

service httpd stop
service httpd start

检查是否成功安装到php扩展:

/usr/local/php/bin/php -m | grep redis

输出:

redis

查看 Redis版本:

查看 phpinfo:

redis
Redis Support	enabled
Redis Version 	4.2.0
Git revision 	$Id: abb79ccb8385da07aeb815acf8550c41171ce0c7 $
Available serializers 	php 

查看redis版本:

redis-cli --version

输出:

redis-cli 5.0.4

两处Redis版本不同的原因:
1. redis-cli –version 显示的是linux系统的redis版本
2. phpinfo里显示的是WEB Server中配置的版本。

安装完成。

在w3-total-cache中的测试:

参考:https://segmentfault.com/a/1190000011146150

主站用的 database 是默认的 0 ,查询:

redis-cli
127.0.0.1:6379> select 0
OK

使用 keys * 命令显示所有缓存数据:

 1) "w3tc__0_pgcache_333b8a1f0bc682ad42ebc1b62dc31015_ssl"
 2) "w3tc__0_pgcache_7817b5b1c36a7253c38a3be7e079bb0d_ssl"
 3) "w3tc__0_pgcache_da8d2f31ea161adee89615b58bd1919f"
...

可以看到 Redis 有 W3TC 的缓存数据了,Redis 缓存运行正常。