最近有個案子會需要頻繁讀取mysql資料庫,為了降低資料庫的負載所以考慮使用memcached或redis來做緩存。最終決定使用redis !

但沒想到在php7上安裝redis竟然如此讓人折騰,於是決定將操作步驟紀錄下來,以免以後忘記....

環境說明

作業系統 : centos 7

PHP版本 : 7.0

伺服器位置: Linode 

如果尚未安裝LAMP 可以參考此篇文章: 在CentOS7下安裝LAMP(Apache+PHP7+MariaDB ) 

任務目標

(一) 安裝redis server

(二) 安裝php redis擴展

(三) 設定 redis 密碼

(四) 測試php使用redis

安裝redis server

要使用redis之前要先安裝redis服務器(廢話),由於yum裡面就有提供,所以這邊就不再自行編譯安裝。

安裝redis

yum install redis

它會自行去找redis然後問你是否要安裝,點[Y]進行安裝,等一段時間(很快)就安裝完畢了。

開機時自動啟動

systemctl enable redis

啟動redis server

systemctl start redis

到此階段我們就已經成功地安裝redis,但要注意防火牆有可能阻擋redis的port [ redis預設port=>6379 ]

開放 redis port 

預設是6379若有更改過port,請將它改成對應port

firewall-cmd --permanent --zone=public --add-port=6379/tcp 

重新啟動防火牆

firewall-cmd --reload

安裝php redis 擴展

接下來這階段才是重頭戲,在這個地方卡了好幾個鐘頭才搞定!

下載 phpredis

我們需要安裝它才有辦法讓php與redis溝通,有點像mysql需要安裝pdo或mysqi之類的...(大概)

phpredis 來源 : https://github.com/phpredis/phpredis

如果尚未安裝git

 yum install git

透過git去下載phpredis

git clone https://github.com/phpredis/phpredis.gitcd phpredis

下載完畢後,進入phpredis目錄

cd phpredis

接著,我們要進行編譯模組

/usr/bin/phpize 或 phpize

但在這邊有可能會出現錯誤,無法執行phpize (我就在這邊卡了好久)

如果出現 can`t find PHP headers in .... 之類的表示沒安裝 php-devel 擴展包

你可以使用yum install php-devel 安裝擴展,但有很高的機率還是會出現錯誤,原因在於它裝的版本與我們的有衝突

因為我們的php版本為7,所以要改使用下面指令,才不會出現錯誤

yum install php70w-devel 

接著,重回剛剛那個步驟再次編譯模組,有四個操作 依照順序輸入讓系統自動跑

直到可輸入指令後再換下一個

#1

/usr/bin/phpize 或 phpize

#2

./configure

#3

make

#4

make install

最後出現類似這樣的訊息 Installing shared extensions: /usr/lib64/php/modules/ 

其中 /usr/lib64/php/modules/ 表示擴展安裝的位置(每個人不太一樣)

補充:

    如果出現:configure: error: Cannot find OpenSSL's <evp.h>

 yum install openssl-devel

    如果出現:configure: error: no acceptable C compiler found in $PATH

yum install gcc

添加擴展

恭喜 ~ 在上面的階段,我們已經成功編譯 php redis 擴展了,剩下只需到 php.ini 添加擴展

就能在php中使用 redis。

如果使用yum安裝php通常php.ini都放在 /etc/php.ini

打開 php.ini 將 extension=redis.so 添加到文件裡面 (記得要保存)

重新啟動 apache

systemctl restart httpd

重新啟動後,我們可以透過 phpinfo() 來看是否載入redis

php-redis.png

設定 redis 密碼

一般情況下,資料庫都是預設無密碼的,redis也不例外。但這個時代,資料還挺有價值的,所以還是設個密碼吧!

(一) 找到 redis.conf

假如redis是使用yum安裝的,通常可在 /etc/redis.conf 找到它

(二)在redis.conf 找到 # requirepass foobared

打開 redis.conf 搜尋 # requirepass foobared 並將 # 拿掉,以及將 foobared 改成你想要的密碼,設置完畢後保存

redis_pass.png

紅色的部分就是密碼,請改成自己的...

(三)重新啟動redis

systemctl restart redis

據說,redis速度快,可被快速嘗試,所以密碼要盡量設難一點,以免被破解。

測試php使用redis

<?php 
 $redis = new Redis();
 $redis->connect('127.0.0.1', 6379); //連線
 $redis->auth('aidectw#jieog93@#$jeoic546!jiowcnurg034nf#blogaidectw'); //改成自己的密碼
 $redis->set('site_url', 'https://blog.aidec.tw'); //設定 
 echo $redis->get('site_url'); //讀取
?>

輸出結果

redis_output.png

執行時間約為 0.0004 秒



#2019.02.23 更新

 

要使用redis 必須先安裝擴展
需要先安裝這幾項
yum install php70w-devel

yum install gcc

yum install openssl-devel

sudo yum -y install libzstd-devel

sudo pecl install lzf

sudo pecl install zstd

安裝方式

pecl install redis 

然後會出現

enable igbinary serializer support? [no] :

enable lzf compression support? [no] :

都輸入[yes]按[enter]就好

在php.ini 加入

extension=redis.so

之後重啟 

systemctl stop nginx 

systemctl start nginx 

systemctl stop php-fpm

systemctl start php-fpm


然後phpinfo() 搜尋看看redis是否有出現了 



如果出現 PHP Fatal error:  Uncaught RedisException: Permission denied 

是selinux的问题,selinux禁止了httpd对外访问的权限


在終端輸入以下指令便能解決

/usr/sbin/setsebool httpd_can_network_connect=1

上面的指令,只要主機重啟便會失效,若要永久有效輸入以下指令

setsebool -P httpd_can_network_connect 1


#2019.06.09 補充

最近突然發現當初漏寫了一點,假如redis要開放遠端使用的話

需要在 redis.conf 找到 #bind 127.0.0.1 (大約在61行)

將它改為 bind 0.0.0.0 保存後,重新啟動redis就能夠遠端連線了

systemctl restart redis


#2019.07.05補充

若發現加入 redis.so 擴展並重啟php-fpm後,在phpinfo() 仍未出現redis

輸入 php -m | grep redis  或 php-fpm -v 後,出現以下錯誤訊息

PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/redis.so' - /usr/lib64/php/modules/redis.so: undefined symbol: json_globals in Unknown on line 0

這表示redis擴展找不到 json 擴展,會發生這情況有兩種可能性,一個是你沒裝json.so 另一個是 redis.so 載入在 json.so 之前,第二個可能性比較高。

解決方法:

在php.ini最下方加載 redis.so 之前加入載入json.so,例如:

extension=json.so

extension=redis.so

然後再重啟php這樣就可以了。

但是這麼做可能會出現另一個錯誤

NOTICE: PHP message: PHP Warning:  Module 'json' already loaded in Unknown on line 0

這個表示json.so 重複載入了,我們可以etc/php.d/json.ini 將檔案內的

extension=json.so 改成

;extension=json.so 




文章轉載或引用,請先告知並保留原文出處與連結!!(單純分享或非營利的只需保留原文出處,不用告知)

原文連結:
https://blog.aidec.tw/post/php7-centos7-redis-install-use