首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP CLI 模式配置文件加載差異排查:多版本共存導致的擴展失效案例

     編輯:PHP 相關知識

PHP CLI 模式配置文件加載差異排查:多版本共存導致的擴展失效案例

生產環境常見多 PHP 版本共存,CLI 模式下不同用戶加載不同配置文件導致擴展加載失效。本文記錄一次 protobuf 擴展在 root 與普通用戶下表現不一致的完整排查過程。

現象描述

  • 普通用戶執行 php protoc-php.php ... 正常
  • root 用戶執行報錯:Unable to load dynamic library 'protobuf.so' - undefined symbol: zend_new_interned_string
  • 加上 sudo 後更多擴展報錯(curl、gd、json、redis 等均報 undefined symbol 或 cannot open shared object file)

排查關鍵步驟

  1. 對比 php.ini 路徑:
    $ php -i | grep 'php.ini'
    # 普通用戶:/usr/local/php/lib/php.ini
    
    $ sudo php -i | grep 'php.ini'
    # root 用戶:/etc/php.ini
  2. 對比 PHP 版本:
    $ which php
    # /usr/local/bin/php
    
    $ sudo which php
    # /usr/bin/php

根因分析

  • 系統預裝 PHP 5.3.3 於 /usr/bin/php,/etc/php.ini 配置
  • 編譯安裝 PHP 5.4.6 於 /usr/local/bin/php,/usr/local/php/lib/php.ini 配置
  • 普通用戶 PATH 優先 /usr/local/bin,使用新版本
  • root 用戶 secure_path 或環境變量導致優先 /usr/bin,使用舊版本
  • 舊版本 php.ini 嘗試加載新版本編譯的擴展(protobuf.so 等),API 版本不匹配(20090626 vs 20100525)導致符號缺失

解決方案

  1. 統一可執行文件(推薦):
    mv /usr/bin/php /usr/bin/php.bak
    cp /usr/local/bin/php /usr/bin/php
    驗證:sudo php -v 顯示 5.4.6,擴展正常加載。
  2. 修正 root 環境 PATH: 編輯 /etc/sudoers(visudo),確保 Defaults secure_path 包含 /usr/local/bin 且優先級高。
  3. 顯式指定 PHP 路徑: 腳本中使用 /usr/local/bin/php 絕對路徑,或設置別名 alias php=/usr/local/bin/php。

最佳實踐建議

核心教訓

「配置文件不一致」往往是「可執行文件版本不一致」的表象。 遇到 CLI 行為差異,首要動作永遠是對比 which php 和 php -v,而非盯著 php.ini 改參數。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景建議
生產部署使用版本管理工具(phpenv、phpbrew、Docker)統一版本
定時任務Crontab 中使用絕對路徑 /usr/local/php/bin/php
多項目共存每項目獨立 Docker 容器,避免版本衝突
排查命令統一使用 php -i | grep 'php.ini' 和 php -v 驗證
擴展編譯嚴格匹配目標 PHP 版本的 phpize、php-config