最近有個案子會需要頻繁讀取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
設定 redis 密碼
一般情況下,資料庫都是預設無密碼的,redis也不例外。但這個時代,資料還挺有價值的,所以還是設個密碼吧!
(一) 找到 redis.conf
假如redis是使用yum安裝的,通常可在 /etc/redis.conf
找到它
(二)在redis.conf 找到 # requirepass foobared
打開 redis.conf 搜尋 # requirepass foobared 並將 # 拿掉,以及將 foobared 改成你想要的密碼,設置完畢後保存
紅色的部分就是密碼,請改成自己的...
(三)重新啟動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'); //讀取 ?>
輸出結果
執行時間約為 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
若有業務合作需求,可寫信至: opweb666@gmail.com
創業、網站經營相關內容未來將發布在 小易創業筆記