環境準備
- OS:CentOS 7 / Ubuntu 20.04+
- PHP:7.4+ (路徑
/usr/local/php)
- 工具:
gcc、make、wget
一、Redis 服務端編譯安裝
1. 下載穩定版
cd /usr/local/src
wget https://download.redis.io/releases/redis-7.2.4.tar.gz
tar xzf redis-7.2.4.tar.gz
cd redis-7.2.4
2. 編譯 (解決 32 位原子操作錯誤)
# 64 位系統直接 make
make
# 若報錯:undefined reference to `__sync_add_and_fetch_4'
# 原因:GCC 預設架構不支援 32 位原子內建函數
# 解決:指定架構
make CFLAGS="-march=x86-64" # 或 -march=native
# 測試 (可選)
# make test
3. 安裝
make install PREFIX=/usr/local/redis
# 實際複製:
# cp src/redis-server src/redis-cli src/redis-benchmark src/redis-check-* /usr/local/redis/bin/
4. 配置文件 (redis.conf)
mkdir -p /usr/local/redis/etc
cp redis.conf /usr/local/redis/etc/
# 關鍵修改
vim /usr/local/redis/etc/redis.conf
# bind 0.0.0.0 # 允許外部連線 (生產請限制 IP)
# protected-mode no # 關閉保護模式 (若無密碼且 bind 0.0.0.0 必須關閉)
# daemonize yes # 後台運行
# pidfile /var/run/redis.pid
# logfile /var/log/redis.log
# dir /usr/local/redis/data # 資料目錄
# maxmemory 256mb # 限制記憶體
# maxmemory-policy allkeys-lru
# requirepass YourStrongPass # 生產必須設定密碼
5. 系統優化 (解決啟動警告)
# 1. 關閉透明大頁面
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local
# 2. 允許記憶體過量使用
sysctl vm.overcommit_memory=1
echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
sysctl -p
# 3. 增加 somaxconn
sysctl net.core.somaxconn=1024
echo 'net.core.somaxconn = 1024' >> /etc/sysctl.conf
6. 建立 systemd 服務
cat > /etc/systemd/system/redis.service <<'EOF'
[Unit]
Description=Redis In-Memory Store
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
ExecStop=/usr/local/redis/bin/redis-cli -p 6379 shutdown
PIDFile=/var/run/redis.pid
Restart=always
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now redis
systemctl status redis
7. 驗證
/usr/local/redis/bin/redis-cli ping
# PONG
netstat -tnlp | grep 6379
二、PHPRedis 擴展安裝
1. 下載對應 PHP 版本源碼
cd /usr/local/src
# PHP 7.4+ 使用 5.x 分支
wget https://github.com/phpredis/phpredis/archive/5.3.7.tar.gz -O phpredis-5.3.7.tar.gz
tar xzf phpredis-5.3.7.tar.gz
cd phpredis-5.3.7
2. 編譯安裝
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --enable-redis
make && make install
3. 啟用擴展
echo "extension=redis.so" >> /usr/local/php/etc/php.ini
# 或建立獨立 ini
echo "extension=redis.so" > /usr/local/php/etc/php.d/redis.ini
4. 重啟 PHP-FPM
systemctl restart php-fpm
# 或
service php-fpm restart
5. 驗證
/usr/local/php/bin/php -m | grep redis
# redis
/usr/local/php/bin/php -r '$r=new Redis(); $r->connect("127.0.0.1",6379); var_dump($r->ping());'
# bool(true)
常見問題排查
| 現象 | 原因與解決 |
| make 報錯 atomic | 加 CFLAGS="-march=native" 或升級 GCC |
| phpize 找不到 | 安裝 php-devel (CentOS) / php7.4-dev (Ubuntu) |
| Redis 啟動即退出 | 檢查 /var/log/redis.log,常見:端口衝突、權限、配置語法錯誤 |
| PHP 無法載入 redis.so | 確認 extension_dir、php.ini 生效、PHP 版本匹配 (TS/NTS) |
生產環境建議
- 使用 Redis Sentinel 或 Redis Cluster 實現高可用。
- 配置
maxmemory 與淘汰策略,防止 OOM。
- 啟用
slowlog 監控慢指令。
- 定期
BGREWRITEAOF、備份 RDB。
- PHP 端使用連線池 (如
predis/predis 或 phpredis 持久連線 pconnect)。