使用phpbrew在mac和linux上管理多版本php

phpbrew簡介

phpbrew是一個php版本管理的命令行工具,用於在同一臺機子上同時管理幾個php版本,在linux和mac上均可以安裝這個工具,目前這個工具在github上維護php

github.com/phpbrew/php…html

爲何要用phpbrew

對我而言,我須要在MAC上運行多個php版本,因此phpbrew是一個不錯的選擇,其實使用普通的homebrew安裝或者經過編譯安裝也能夠安裝多個版本的php,可是步驟麻煩,並且管理php的一些庫例如GD庫、PDO庫等都不是很方便,phpbrew能夠快速地安裝管理這些庫。而且快速在多版本之間進行切換,使用起來很是方便。mysql

先說說我要解決的問題和一些原理

我常常用php+nginx開發網站,經常使用的版本是5.6,之前開發的時候有一些框架須要5.4版本,有一些須要5.6版本,而後php7的版本也已經發布許久了,下來確定有一些框架要求>7版本,在維護舊框架和搭建新框架的需求下,多版本php是避免不了的。對於我來講,有兩個辦法,一個是本身安裝多版本,而後經過不一樣命令區分多版本,另外一個辦法就是用phpbrew進行管理,兩個辦法我都試過,這裏我先簡單說一下原理,再對比一下兩個方法的優劣。linux

本身安裝多版本php:

本身安裝多版本的php,好比利用MAC的homebrew、利用Ubuntu和CentOS的apt和yum,均可以安裝php,自虐的猿能夠編譯安裝,安裝完第一個php後,在本身的系統目錄下通常都會有一個PHP命令(通常在/usr/local/bin下),命令行輸入:nginx

php -v
複製代碼

就會返回版本信息,假設我先安裝5.6版本,那麼返回的就是5.6版本的信息。關於利用apt或者homebrew安裝PHP的詳細方法這裏再也不累贅,網上有不少。git

接下來就是繼續安裝第二個版本,可是問題來了,安裝了兩個版本,輸入:php -v,會返回哪一個版本信息呢?這個取決於你的php命令是哪個?通常來講第一個安裝的版本會在bin目錄下建立一個軟鏈,而第二個版本因爲檢測到第一個版本建立的軟鏈,就不會再建立了,因此若是兩個版本都安裝後輸入php -v,應該會顯示第一個版本的信息。個人解決辦法是,以mac爲例,建立一個新的命令 php54 ,用來區分兩個版本的php命令,方法是在 ~/.bash_profile文件中添加一個命令別名github

alias php54 = '/path/to/php54/bin/php'
複製代碼

其中‘/path/to/php54/bin/php’是你安裝php5.4版本的目錄,而後記得source一下web

source ~/.bash_profile
複製代碼

這樣輸入sql

php54 -v
複製代碼

返回的就是php5.4的版本的信息了。數據庫

結合nginx服務器運行多版本php

直接在終端運行php命令仍是比較少,主要仍是結合nginx,nginx配合php的原理是運行一個叫作php-fpm的程序,將*.php頁面的請求交給php-fpm這個程序處理,那麼若是須要兩個版本的php,就讓兩個版本的php-fpm程序運行在不一樣的端口就好了,好比運行在9000和9001兩個端口,nginx分發請求到不一樣端口就是不一樣版本的php了。

php-fpm程序通常在安裝php的時候就會附帶在裏面,那麼一樣的,你運行sudo php-fpm的時候(記得php-fpm須要管理員權限運行),運行的確定是第一個php5.6版本的,能夠經過php-fpm -v查看版本,這時應該先修改php-fpm的運行端口,具體方法是找到php5.6的安裝目錄,而後找到php-fpm.conf配置文件,在配置文件中添加一行:

listen 127.0.0.1:9000
複製代碼

若是已經有listen這一行了,能夠先在前面加一個;分號註釋掉再添加上面那一句,以後重啓一下php-fpm的進程,這樣5.6版本的fpm就運行起來了,以後在~/.bash_profile文件中添加一個命令別名

alias php-fpm54 = '/path/to/php54/sbin/php-fpm'
複製代碼

其中‘/path/to/php54/sbin/php-fpm’是你安裝php5.4版本的目錄,一樣記得source一下,此舉的目的跟上面相同,作了一個區別於php-fpm的命令,以後修改php-fpm5.4版本的配置文件,在配置文件中添加

listen 127.0.0.1:9001
複製代碼

而後,運行命令: sudo php-fpm54,這樣就在9001端口啓動了5.4版本的fpm進程。

接下來要作的就簡單了,在寫nginx的網站配置文件時,若是須要php5.6版本的網站,配置文件就寫

server {
    listen       80;
    server_name  www.website1.com;
    root /path/to/web/folder1;
    index  index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        #fastcgi_index index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}   
複製代碼
server {
    listen       80;
    server_name  www.website2.com;
    root /path/to/web/folder2;
    index  index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9001;
        #fastcgi_index index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}   
複製代碼

兩個配置文件的惟一不一樣就是把9000修改爲9001。這樣就搞定了~,nginx會根據進來的請求,將請求分發到不一樣的端口從而決定不一樣的版本。其中website1用的是php5.6版本,website2用的是php5.4版本。

這個方法的一大特色就是:折騰>_<,但對於新手或者剛接觸linux的人來講,練練手,熟悉環境和一些原理,我以爲是不錯的,起碼走過一遍以後能夠掌握不少知識。而對於想要方便管理的人而言,就不須要了,直接上phpbrew。

phpbrew管理多php版本

說完本身安裝的方法,接下來就說說phpbrew。

安裝前的準備

安裝phpbrew有一些前置要求,官方文檔的Requirement在這裏

github.com/phpbrew/php…

不一樣系統的前置要求不太同樣,找到本身系統那一部分根據裏面的命令安裝就行了,這裏特別強調一下,使用phpbrew要求你的系統裏至少已經有一個php版本了,並且要5.3+,因此一個php版本都沒有的同窗,是用不了phpbrew的,必須先安裝一個php,安裝的方式見上面,用yum、apt、homebrew。

安裝phpbrew

安裝好前置要求以後,就安裝phpbrew,方法在官網這裏,

github.com/phpbrew/php…

我貼出來:

curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
chmod +x phpbrew
sudo mv phpbrew /usr/local/bin/phpbrew
複製代碼

安裝完成後,運行phpbrew -v應該也能看到版本信息,以後運行初始化命令

phpbrew init
複製代碼

初始化後,會在~文件夾中產生一下.phpbrew的文件夾和一些文件,在~/.bashrc文件中添加

echo "[[ -e ~/.phpbrew/bashrc ]] && source ~/.phpbrew/bashrc" >> ~/.bashrc
複製代碼

這一行,而後source一下:

source ~/.phpbrew/bashrc
複製代碼

這樣就算完成phpbrew的安裝了。

接下來就是要經過phpbrew來安裝不一樣的php版本。

首選運行一下:

phpbrew update
複製代碼

更新一下php版本庫的信息

而後運行

phpbrew known
複製代碼

查看能夠安裝的php版本

接下來就是選擇一個版本去安裝,假設以前我已經安裝過5.4版本了,那麼我繼續安裝5.6版本,

phpbrew install 5.6 +default +fpm +mysql +gd
複製代碼

這裏後面的+ xxx就是添加一些庫和功能,好比最基本的默認庫,還有鏈接數據庫用到mysql庫,鏈接nginx的php-fpm都是必須的,我就一次性加上去,等待幾分鐘後,就安裝完成了。

接下來運行:

phpbrew list
複製代碼

就會列出你已經安裝的版本,值得一提的是有一個(system)版本的,其實就是一開始安裝phpbrew須要先有的那個版本,運行:

phpbrew switch 5.6.40
複製代碼

切換到最新安裝的這個版本,運行php -v能夠看到,你已經切換成功了。

問題到這裏還沒完,如何切換回5.4版本呢?這時,其實你還要在phpbrew內再安裝一下php5.4的版本,雖然你一開始就有這個版本了,可是它並無歸入到phpbrew的管理,因此這個時候你能夠再安裝多一個5.4版本,不用懼怕重複,經過phpbrew安裝的版本都會在~/.phpbrew 文件夾中,不會互相影響並且很方便找到。運行:

phpbrew install 5.4 +default +fpm +mysql +gd
複製代碼

安裝完成後,運行:

phpbrew list
複製代碼

你會看到多了一個版本,利用switch命令進行切換,這樣你就能在不一樣版本的php之間進行切換了。

對於php-fpm,跟上面提到的原理是同樣,找到他們的配置文件(在~/.phpbrew文件夾中),而後修改運行的端口,一個在9000一個在9001,而後運行兩個fpm程序,官方文檔中有詳細的運行方法,

phpbrew switch 5.6
sudo phpbrew fpm start
phpbrew switch 5.4
sudo phpbrew fpm start
複製代碼

這裏注意fpm程序須要有管理員權限去運行,切換不一樣版本運行不一樣的fpm程序,這樣就能同時啓動兩個fpm程序在不一樣的端口,nginx的配置跟上文同樣。

至此,phpbrew的應用也就ok了。

關於phpbrew管理擴展庫

關於php擴展庫,在phpbrew中稱爲variants,運行:

phpbrew variants
複製代碼

能夠知道你安裝了哪些擴展庫,我碰到過一個問題就是運行:phpbrew install 5.6 +default +fpm +mysql +gd的時候,提示GD沒有安裝,在官方文檔中我也找到了,能夠經過運行:

phpbrew ext install gd -- --with-gd=shared \
    --with-png-dir=/usr/local/opt/lib \
    --with-jpeg-dir=/usr/local/opt/jpeg \
    --with-freetype-dir=/usr/local/opt/freetype  \
    --enable-gd-native-ttf
複製代碼

來添加GD擴展。

更多的操做,朋友們本身看官方文檔了,我一直認爲,一千一萬個教程,都不如直接看官方文檔來的實在。因此,英文能力呀(兩行淚T_T)

一些坑

安裝好phpbrew以後,利用phpbrew安裝第一個php版本,而後切換到這裏來,這樣子原先system裏面的那個php版本就能夠刪掉了。把全部的php版本都經過phpbrew來安裝,方便管理。

安裝的時候,建議加上 +default這個基礎的庫,這裏有一個教訓,爲了安裝GD庫,我從新安裝了一個php版本,運行的是:phpbrew install 5.6 +mysql +gd,結果出事了,報了一個錯,缺乏json庫,緣由就是我沒有+default,而我覺得第一次已經有加了第二次能夠不用+default,事實上,每次安裝都必須所有加上去,所有加上去,所有加上去,所有加上去!由於它是所有從新安裝的!

而後系統的版本又被我刪了,這個版本安裝錯誤等於廢了,就等於我係統裏一個php版本也沒有,phpbrew也就運行不了了(又是兩行淚T_T),如何解決,重走一遍上面那些步驟唄......

以上就是我對於多php版本管理和使用phpbrew的一些心得,若是有什麼改正意見的,歡迎給我留言指出。謝謝你的耐心觀看。

相關文章
相關標籤/搜索