# 環境:PHP 5.4.8 (編譯 API 20100525)
# 操作:pecl install memcache
# 結果:重啟 php-fpm 報錯
Gracefully shutting down php-fpm . done
Starting php-fpm [25-Oct-2012 12:04:02] NOTICE:
PHP Warning: PHP Startup: memcache: Unable to initialize module
Module compiled with module API=20090626
PHP compiled with module API=20100525
These options need to match
pecl install memcache 下載的是**預編譯二進制包** (若可用) 或下載源碼**在當前環境編譯**pecl 命令可能關聯到舊版 PHP 的 php-config/phpizesudo pecl uninstall memcache
# 並刪除殘留的 memcache.so (通常在 /usr/lib/php5/20090626/ 或 php.ini 指定的 extension_dir)
# 1. 獲取源碼 (任選一)
wget https://pecl.php.net/get/memcache-3.0.8.tgz # 穩定版
tar -zxf memcache-3.0.8.tgz
cd memcache-3.0.8
# 或直接 git clone 最新開發版
# git clone https://github.com/websupport-sk/pecl-memcache.git
# 2. 關鍵:使用目標 PHP 版本的 phpize 和 php-config
/usr/local/php/bin/phpize # 必須是目標 PHP 的 phpize
./configure --enable-memcache \
--with-php-config=/usr/local/php/bin/php-config # 綁定目標 PHP
# 3. 編譯安裝
make
sudo make install
# 輸出提示安裝路徑,如 /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/memcache.so
# 確認 extension_dir 指向上述安裝目錄
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525"
extension = memcache.so
sudo systemctl restart php-fpm
php -m | grep memcache
# 輸出 memcache 表示成功
<?php
$mem = new Memcache;
$mem->connect('127.0.0.1', 11211);
$mem->set('feiyan', 'blog');
var_dump($mem->get('feiyan')); // string(4) "blog"
?>
# 基礎啟動
memcached -d -m 256 -p 11211 -u nobody -l 127.0.0.1
# 生產建議
memcached -d -m 1024 -p 11211 -u memcached -l 10.0.0.50 -c 2048 -P /var/run/memcached.pid
# -m 1024: 1GB 記憶體
# -u memcached: 專用低權限用戶
# -l 10.0.0.50: 僅綁定內網 IP
# -c 2048: 最大並發連線
# -P: PID 檔便於管理
| 場景 | 正確做法 |
|---|---|
| 系統多 PHP 版本 | 始終使用完整路徑調用 /usr/local/php/bin/pecl、/usr/local/php/bin/phpize、/usr/local/php/bin/php-config |
| 安裝擴展失敗 | 優先源碼編譯指定 --with-php-config,而非依賴 pecl 自動判斷 |
| 升級 PHP 版本 | 所有 PECL 擴展**必須重新編譯**,API ID 已變更 |
| 生產環境 | 編譯好 .so 納入構建產物 (Docker image/Ansible/RPM),禁止線上 pecl install |
| 特性 | memcache (較舊) | memcached (較新,推薦) |
|---|---|---|
| PECL 包名 | memcache | memcached |
| 依賴庫 | 無 (自帶客戶端) | libmemcached (C 庫) |
| 功能豐富度 | 基礎 get/set/delete | 支援 CAS、觸發器、二進制協議、SASL 認證 |
| PHP 7/8 支援 | 非官方分支維護 | 官方積極維護 (v3.x+) |
| 類名 | Memcache | Memcached |
建議: 新專案優先使用 memcached 擴展 (libmemcached-based),功能更完整、效能更優、社區活躍。遷移時注意類名與方法差異 (如
getResultCode()、getAllKeys()等)。
PHP 版本升級導致 PECL 擴展 API 不匹配是經典問題。核心解法:**源碼編譯 + 顯式指定 --with-php-config 綁定目標 PHP**。建立標準化構建流程,將擴展編譯納入 CI/CD,從源頭杜絕環境不一致導致的生產故障。