說一個基本概念,很多人可能會遇到過這種情況,有些PHP程式因為部署原因會在linux命令列下執行,這樣就會用到php命令執行,例如:
php index.php
很方便,但也會出現一些問題,例如:
PHP Fatal error: Class 'PDO' not found in
PHP Fatal error: Class 'Curl' not found in
PHP Fatal error: Class 'Redis' not found in
...等等,我們統稱為Class not found in問題,其實原因看來就是沒有加入擴充,但是疑問也就從這裡出來了,
怎麼加入這些擴充?
為什麼有時候在瀏覽器訪問web程式的時候同樣的環境怎麼沒有出現這些問題,而且還能正常調用這些擴充類呢?
對於問題1,網上很多教程大家可以輸入google.com然後輸入Linux php加入某某擴充來查看解決,我們重點說下問題2。
確定問題現象,我們以lnmp環境為例,一步步分析,
首先這些擴充類和php是有關係的,載入的是否成功通過php.ini來查看,我們初期判斷兩邊是不是用了不同的php.ini?
下來我們就在不同的地方輸出phpinfo()查看php的基本資料,果然,
linux環境下:
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini
web環境下:
Configuration File (php.ini) Path => /usr/local/php/etc
Loaded Configuration File => /usr/local/php/etc/php.ini
通過上面的資訊可以看出,兩邊用的php完全是不一樣的,為了確定,我們驗證了下通過/usr/local/php/bin/php來執行先前的報錯的php程式,發現一切正常PDO,Curl,Redis都正常調用。
為什麼會出先這樣的情況呢?
那是因為,你在安裝完PHP後,“不經意”的操作中又進行了一遍php的安裝編譯操作,導致存放了兩分不同的php.ini檔案,lnmp環境下的php.ini是放置在/usr/local/php/etc/php.ini,特殊操作會預設放置在/etc/php.ini,而且如果不配置php *.php的環境變數,他會預設讀取/etc/php.ini下的配置資訊。從而導致在linux下使用php命令與web下不一致的結果。
問題找到了,改怎麼解決的?
刪除“不經意”的操作中安裝編譯的php
配置php環境變數,讓php命令指向/usr/local/php/bin/php,我們以centOS為例配置環境變數進行說明:
[root@CentOS ~]# vi /etc/profile
編輯profile檔案,注,以下操作為永久有效。
在檔案末尾加上如下兩行代碼
PATH=/usr/local/php/bin:$PATH
export PATH
# /etc/profile
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
pathmunge () {
case ":${PATH}:" in
*:"$1":*)
;;
*)
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
esac
}
if [ -x /usr/bin/id ]; then
if [ -z "$EUID" ]; then
# ksh workaround
EUID=`id -u`
UID=`id -ru`
fi
USER="`id -un`"
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
fi
# Path manipulation
if [ "$EUID" = "0" ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
else
pathmunge /usr/local/sbin after
pathmunge /usr/sbin after
pathmunge /sbin after
fi
HOSTNAME=`/bin/hostname 2>/dev/null`
HISTSIZE=1000
if [ "$HISTCONTROL" = "ignorespace" ] ; then
export HISTCONTROL=ignoreboth
else
export HISTCONTROL=ignoredups
fi
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
umask 002
else
umask 022
fi
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null 2>&1
fi
fi
done
unset i
unset pathmunge
PATH=/usr/local/php/bin:$PATH
export PATH
要是剛才的修改馬上生效,需要執行以下代碼
[root@CentOS ~]# source /etc/profile
這時再查看系統內容變數,就能看見剛才加的東西已經生效了
[root@CentOS ~]# echo $PATH
/usr/local/php/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
現在使用php命令和/usr/local/php/bin/php是一個效果了,指向了同樣的php.ini檔案。