php *.php和/usr/local/php/bin/php *.php的區別

來源:互聯網
上載者:User

說一個基本概念,很多人可能會遇到過這種情況,有些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檔案。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.