如何使php5.4 , php 5.6, php7 環境 在一台伺服器上共存?

運維很渣的PHP新手, 請問, 現公司伺服器lnmp環境, php版本還是5.4的, 太老了, composer一些包有的都跑不起來, 想升級到5.6或者PHP7 ! 但是很多老項目運行在上面, 不敢, 輕易升級! 有沒有什麼辦法? 老項目依舊在5.4下運行, 以後開發的新項目運行在5.6下或者7下, 他們能在一台伺服器上 和諧共存? 最近, 關注到docker, 是不是一個很好的解決方案?


把不同版本的PHP編譯安裝到不同目錄就行,比如:

./configure --prefix=/opt/php/5.6
./configure --prefix=/opt/php/7.1

configure生成的PHP-FPM服務管理腳本php-src/sapi/fpm/init.d.php-fpm會去用prefix里的配置去運行PHP-FPM:

prefix=/opt/php/7.1
exec_prefix=${prefix}

php_fpm_BIN=${exec_prefix}/sbin/php-fpm
php_fpm_CONF=${prefix}/etc/php-fpm.conf
php_fpm_PID=${prefix}/var/run/php-fpm.pid

可以給不同版本的PHP-FPM進行不同的配置,比如配置使用不同的埠.

Debian/Ubuntu/Deepin上編譯PHP可以參考如下步驟:

# 安裝編譯PHP依賴的開發包
sudo apt-get install
build-essential
autoconf
libtool
bison
re2c
zlib1g-dev
libbz2-dev
libwebp-dev
libjpeg-dev
libpng12-dev
libxpm-dev
libfreetype6-dev
libxml2-dev
libxslt1-dev
libpcre3-dev
libenchant-dev
libpspell-dev
libaspell-dev
libssl-dev
libmcrypt-dev
libgmp-dev
libcurl4-openssl-dev
libldap2-dev
libsasl2-dev
libc-client2007e-dev
libkrb5-dev
libgettextpo-dev
libtidy-dev
libreadline6-dev
libicu-dev
libpq-dev
firebird-dev
librecode-dev
libsnmp-dev
libt1-dev
libxt-dev
libmysqlclient-dev

# 軟鏈接一些庫和頭文件到指定目錄,否則PHP的configure會提示找不到
sudo ln -s /usr/lib/x86_64-linux-gnu/libldap.so /usr/lib/
sudo ln -s /usr/lib/x86_64-linux-gnu/liblber.so /usr/lib/
sudo ln -s /usr/lib/x86_64-linux-gnu/libXpm.so /usr/lib/
sudo ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/

# 執行configure腳本
./configure
--prefix=/opt/php/7.1
--with-sqlite3=shared
--with-pdo-sqlite=shared
--with-mysql=mysqlnd
--with-mysqli=mysqlnd
--with-pdo-mysql=mysqlnd
--with-pgsql=shared,/usr/bin/pg_config
--with-pdo-pgsql=shared,/usr/bin/pg_config
--enable-posix
--enable-pcntl
--enable-shmop
--enable-sysvshm
--enable-sysvsem
--enable-sysvmsg
--enable-phar
--enable-zip
--with-zlib
--with-zlib-dir=/usr
--with-bz2=shared
--with-gd=shared
--enable-gd-native-ttf
--enable-gd-jis-conv
--with-webp-dir=/usr
--with-jpeg-dir=/usr
--with-png-dir=/usr
--with-xpm-dir=/usr
--with-freetype-dir=/usr
--enable-exif=shared
--enable-json
--enable-libxml
--with-libxml-dir=/usr
--enable-xml
--enable-xmlreader
--enable-xmlwriter
--enable-simplexml
--with-pear
--with-xsl=shared
--enable-dom
--enable-soap=shared
--enable-wddx=shared
--with-xmlrpc=shared
--enable-ctype
--enable-filter
--with-pcre-regex
--with-pcre-jit
--with-enchant=shared
--with-pspell=shared
--enable-fileinfo=shared
--enable-intl=shared
--with-icu-dir=/usr
--enable-mbstring=shared
--with-iconv
--enable-hash
--with-openssl=shared
--with-mcrypt=shared
--enable-bcmath
--with-gmp=shared
--enable-session
--enable-sockets
--enable-ftp
--with-curl=shared
--with-snmp=shared
--with-ldap=shared
--with-ldap-sasl
--with-imap=shared
--with-kerberos
--with-imap-ssl
--enable-calendar
--with-gettext=shared
--with-tidy=shared
--with-readline
--enable-tokenizer
--enable-opcache
--enable-cli
--enable-cgi
--enable-fpm
--enable-phpdbg
--enable-phpdbg-webhelper

# 開啟2個任務進行編譯
time make -j2

# 安裝PHP到/opt/php/7.1
sudo make install


我剛整了一台機器,為了兼容老程序,原本想裝兩個PHP版本。

因為我用FreeBSD,不想搞亂ports,所以研究了下bhyve虛擬機,最終上了bhyve,用pf防火牆做nat轉發到虛擬機特定埠,還不錯,bhyve很穩定很爽,準備以後做個雲主機系統…


推薦新手一個最簡單的辦法。改上 kvm ,三個虛擬機三個 php 版本。


如需要實現環境隔離,最好方案是用docker,能避免很多環境問題。


1.下載各編譯版本

2.配置安裝路徑和模塊,編譯之

3.配置各php fpm啟動埠


docker


這個簡單啊,監聽不同埠就行。修改php.ini


你可能需要Slackware(


在伺服器上部署docker


推薦閱讀:

Linux中console、terminal、tty、pty、pts區別?
linux上,C代碼被編譯鏈接成可執行文件後,被載入運行的過程具體是怎樣的?
如何學習使用桌面 Linux 發行版?
Linux不是開源的嗎,為什麼RedHat的伺服器版那麼貴?
Linux 桌面應用最大的問題是什麼?

TAG:PHP | Linux | 運維 | LNMP | Docker |