web-dev-qa-db-ja.com

PHPの2つのバージョンをインストールし、それらを簡単に切り替える方法は?

UbuntuマシンにPHP 5.2.17とPHP 5.3.5の両方をインストールし、必要に応じて切り替えたいです。どうすればこれを達成できますか?

76
Debiprasad

これを実現するには、PHPバージョンマネージャーを使用できます。次のようなさまざまなバージョンマネージャが利用可能です。

私のお気に入りはphpbrewです。お役に立てれば。

61
aneeshep

あなたはcan2つの異なるPHPバージョンを一度に実行できますが、apt-getを取得するほど簡単ではありません。個別にインストールされた1つのバージョンを実行し、Apache configの設定に従って提供する必要があります。

たとえば、fastcgiを使用してこれを行うことができます。基本的に、探しているのは このページ に表示される設定です。必要なシチュエーション/ポート/ドメインに基づいて、構成に異なるハンドラーを追加します。両方のバージョンをインストールした後のトリックは、次のステップです。

===そのページから==

  1. 最後のステップは、仮想ホストを作成することでした。最後に、/ etc/Apache2/sites-enabledに3つのファイルがあります:000-default、php5.3.17およびphp5.4.7次の内容

デフォルト:

    <VirtualHost *:80>
      ServerName localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php5317.fcgi
      </Directory>
    </VirtualHost>

php5.3.17:

    <VirtualHost *:80>
      ServerName 5317.localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php5317.fcgi
      </Directory>
    </VirtualHost>

php5.4.7:

    <VirtualHost *:80>
      ServerName 547.localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php547.fcgi
      </Directory>
    </VirtualHost>

完全なインストールについては リンクされた質問 をご覧ください。ヘッダー内の2つのリンクも忘れずに見てください。これらはニースのチュートリアルのように見えます(ただし圧縮率は低くなっています)。 これ および その

(リンクされた質問が回答を受け入れられない大きな質問であるという事実に終止符を打たないでください。メソッドは正常に機能するはずです(実際に機能します)が、ユーザーは<?phpを使用し忘れ、<?ショートタグをオフにして、コメントを参照)

20
Nanne

私はPHP 5.6と7.0をインストールしましたが、すべてのヒントに加えて5.6を実行し続けたので、このコマンドは時間を節約します(私の場合、オプション1を選択してApacheを再起動します):

Sudo update-alternatives --config php
13
Marcelo Ágil

これは私のために働く: https://lornajane.net/posts/2016/php-7-0-and-5-6-on-ubunt

「Growling Flea」のスクリプトと同じですが、新しいバージョンを使用しています。

PPAを追加します

PHP 5.6およびPHP 7.0パッケージはサードパーティのPPAからのものであり、Canonicalの公式Ubuntuリポジトリでは提供されていません。ここでお勧めするPPAは、Debian用にPHPをパッケージ化するOndřejSurýによるものです(その後Ubuntuで使用されます)。公式リポジトリではありませんが、彼は完全にランダムではありません! PPA自体は ここ です

PPAをセットアップに追加するには:

Sudo add-apt-repository ppa:ondrej/php  

次に、この新しいPPAから何が提供されているかについての情報も取得したいので、次を実行します。

Sudo apt-get update   

新しいPHPバージョンをインストールします

私はすでにいくつかのphp5パッケージをインストールしていましたが、何もアンインストールしませんでした。新しいバージョンをインストールするように依頼したときに、aptが何をしたいかを考えさせました。

Sudo apt-get install php5.6 php7.0

これにより、適切な競合や多くの競合から多くの苦情が寄せられました。最初に提案された解決策は、PHP 5.6をインストールできるように、すべての在庫のphp5パッケージを削除することでした-最初の提案を受け入れました。

私はApacheを使用しているので、このセットアップではApacheにphp5.6とphp7.0の両方のモジュールが利用可能で、php5.6モジュールが実際にロードされています。

PHPだけでなく、PHPで期待されるすべての拡張機能やその他のツールがPHPの両方のバージョンに存在するため、非常に簡単です必要なモジュールを追加します。私はこれがいかにうまく行われているかに非常に感銘を受けました。

バージョンの設定と切り替え

システムにPHPの2つの完全に別個のバージョンがインストールされたので、すべてのピースがどこに行ったのか見てみましょう。

構成ファイルはすべて/etc/php/5.6および/etc/php/7.0にあります-ここでは、どの拡張機能をロードするか、ini設定を設定する、および各バージョンのその他すべてを個別に設定できます。

私はApacheユーザーであり、前述のように両方のモジュールが利用可能です。だから、一方から他方に切り替えるには、私がする必要があります:

Sudo a2dismod php5.6
Sudo a2enmod php7.0
Sudo service Apache2 restart

Nginxユーザーの場合、変更はほぼ同じくらい簡単です。DigitalOceanにはこれに関する優れたドキュメントがあり(素晴らしいドキュメントがあります!)、ガイドをチェックしてください: https://www.digitalocean.com/community/tutorials/ how-to-upgrade-to-php-7-on-ubuntu-14-04 PHPの別のバージョンを使用するためにnginxを再構成するセクションが含まれているため。

コマンドラインから、php5.6とphp7.0の両方をコマンドとして使用できます。また、まだphpコマンドがあります。/etc/alternativesを見て、PHP cli *の特定のバージョンにシンボリックリンクされていることを確認してください。 php -vを実行して、使用しているものをすばやく確認することもできます。

*より具体的には、どのphpを実行してPHPのどのバージョンが使用されているかを確認します-しかし、これはおそらく/usr/bin/phpを指します。これは私にとっては/etc/alternatives/phpコマンドへのシンボリックリンクです。

拡張機能の使用

このPPAには、PHPの両方のバージョンにpeclコマンドを提供する通常のphp-pearパッケージが付属しているため、PECLを介して利用できる拡張機能は通常の方法でインストールできます。関連するヘッダーも必要になるため、php5.6-devまたはphp7.0-devのいずれかをインストールする必要があります。

Peclのインストールが完了すると、php.iniに* .soファイルを追加するためのメモが表示されます。実際、ここで行うのに最適なことは、/etc/php/mods-availableの内容を確認することです。ここには既にいくつかのモジュールがあり、それぞれが拡張子にちなんで名付けられ、.iniで終わる独自のファイルにあります。 1つをコピーしてテンプレートとして使用するか、独自のテンプレートを作成して、拡張機能に関連するすべての構成をその中に配置できます(少なくとも、extension=[extensionName].soが必要です)。

新しい拡張機能が利用可能なMODになったら、有効にしてから次のようにして確認します。

Sudo phpenmod extension  
php -m  

これにより、現在のバージョンのPHPに適切な場所にシンボリックリンクが作成され、このモジュールがロードされます。php -mによって出力されるモジュールのリストに表示されます。プロのヒント:出力に表示されない場合は、出力の一番上までスクロールして、有用なエラーメッセージがあるかどうかを確認します。

6
Daniel Pineda

この投稿から 、私はコマンドを順番に並べ、私が仕えた順に順番に説明します(Ubuntu 12.04)

このメソッドはあなたに与えます:

  1. インストールされたPHPバージョン間の切り替えを許可するメニュー付きスクリプト(同時に両方ではない)

  2. サーバーにインストールされているさまざまなPHPバージョン

  3. 分離されたconfファイル

必要なすべてのバージョンをインストールします(2つあります)

依存関係をインストールします。

Sudo apt-get install flex Apache2-threaded-dev libxml2-dev Apache2 Apache2-mpm-prefork Apache2-threaded-dev Apache2-utils Apache2.2-bin Apache2.2-common

PHP 5.3を初めてインストールします。 PHPソースをダウンロードする

md5sum Downloads/php-5.3.10.tar.bz2
mkdir ~/Sources
cd ~Sources/
cp -Rf ../Downloads/php-5.3.10.tar.bz2 .
tar xjf php-5.3.10.tar.bz2
cd php-5.3.10/
Sudo mkdir /usr/local/php/php_5.3.10

PHP5.6を初めてインストールします。 PHPソースをダウンロードする

md5sum Downloads/php-5.6.11.tar.bz2
mkdir ~/Sources
cd ~Sources/
cp -Rf ../Downloads/php-5.6.11.tar.bz2 .
tar xjf php-5.6.11.tar.bz2
cd php-5.6.11/
Sudo mkdir /usr/local/php/php-5.6.11

スクリプトマネージャーのバージョンPHP:php.shというファイルを作成し、/bin/に配置します。

#!/bin/bash
opcion=0
cat << CABECERAMENU
Opciones del menu
1 => PHP 5.3.10
2 => PHP 5.6.11
CABECERAMENU
echo -n "Ingrese su eleccion: "
read opcion
echo
case $opcion in
    "1")
        rm /etc/Apache2/php.conf
        ln -s /usr/local/php/php_5.3.10.conf /etc/Apache2/php.conf
        /etc/init.d/Apache2 restart
    ;;
    "2")
        rm /etc/Apache2/php.conf
        ln -s /usr/local/php/php_5.6.11.conf /etc/Apache2/php.conf
        /etc/init.d/Apache2 restart
    ;;
    *)
        echo "Opcion no valida"
    ;;
esac

Php 5.3をコンパイルしてインストールします。

cd ~/Sources/php-5.3.10/
Sudo ./configure --prefix=/usr/local/php/php_5.3.10 --with-config-file-path=/usr/local/php/php_5.3.10/lib --with-mysql --with-libdir=/lib/x86_64-linux-gnu --with-apxs2=/usr/bin/apxs2 --enable-Zip --with-Gd --with-curl --with-xmlrpc --with-freetype-dir=/usr/lib/x86_64-linux-gnu  --with-jpeg-dir=/usr/lib/x86_64-linux-gnu --with-pdo-mysql --with-pdo-pgsql --enable-soap
Sudo make clean
Sudo make
Sudo ls -lhart /usr/lib/Apache2/modules/libphp5.*
Sudo rm -rf /usr/lib/Apache2/modules/libphp5.*
Sudo make install
Sudo ls -lhart /usr/lib/Apache2/modules/libphp5.*
Sudo rm -rf /usr/local/php/php-5.3.10/modules/libphp5.so
Sudo mv /usr/lib/Apache2/modules/libphp5.so /usr/local/php/php_5.3.10/modules/
ls -lhart /usr/local/php/php_5.3.10/modules/
Sudo a2dismod php5
Sudo service Apache2 restart

PHP 5.6のコンパイルとインストール

cd ~/Sources/php-5.6.11
Sudo ./configure --prefix=/usr/local/php/php_5.6.11 --with-config-file-path=/usr/local/php/php_5.6.11/lib --with-mysql --with-libdir=/lib/x86_64-linux-gnu --with-apxs2=/usr/bin/apxs2 --enable-Zip --with-Gd --with-curl --with-xmlrpc --enable-calendar --enable-sockets --with-freetype-dir=/usr/lib/x86_64-linux-gnu  --with-jpeg-dir=/usr/lib/x86_64-linux-gnu --with-pdo-mysql  --with-pdo-pgsql --enable-soap
Sudo make clean
Sudo make
Sudo ls -lhart /usr/lib/Apache2/modules/libphp5.*
Sudo rm -rf /usr/lib/Apache2/modules/libphp5.*
Sudo make install
Sudo ls -lhart /usr/lib/Apache2/modules/libphp5.*
Sudo rm -rf /usr/local/php/php_5.6.11/modules/libphp5.so
Sudo mv /usr/lib/Apache2/modules/libphp5.so /usr/local/php/php_5.6.11/modules
ls -lhart /usr/local/php/php_5.6.11/modules
Sudo a2dismod php5
Sudo service Apache2 restart

それらを使用しましょう:

$ Sudo php.sh
Opciones del menu
1 => PHP 5.3.10
2 => PHP 5.6.11
Ingrese su eleccion: 1

 * Restarting web server Apache2                                                                                                                                                                                                                                        Apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
 ... waiting Apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
3
PegasusOnlin

問題点:

  1. 単一のApacheインスタンスは、2つの異なるPHPバージョンを同時に実行することはできません(少なくとも私の知る限り)。

  2. パッケージから2つの異なるPHPバージョンをインストールすることはできません。それらは競合します(同じディレクトリを上書きしてみてください)。

解決:

  • for b)ソースから「他の」PHPバージョンを手動でコンパイルします(または、必要に応じて、適切なパッケージのソースを取得して変更し、競合を回避し、インストールパスを変更します)

  • a)異なるモジュールパスと個別の起動スクリプトを使用して、Apacheの個別の構成セットを作成します。そしてもちろん、別のポートで実行します。

2
Mekk

複数のVirtualHostを作成する代わりに、次のコードを.htaccessファイルに追加するだけで、驚くほどうまくいきました。

<FilesMatch \.php$>
    SetHandler "proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/"
</FilesMatch>

ノード:コードを使用する前にphp7.2-fpmをインストール済みでした。

1
Rohan Kumar

これは、PHP-の新しいバージョンを無効にして有効にすることで実行できます。

  • 古いバージョンに切り替えます-
    a2dismod php7.0
    サービスApache2の再起動
  • 新しいバージョンに切り替える
    a2enmod php7.0
    サービスApache2の再起動
0
Vikas Chauhan

また、各Webサイトを異なるユーザーで実行することもできます。より安全に。

私はこのアプローチを一度使用しました。

http://blog.servergrove.com/2011/08/22/how-to-setup-multiple-php-versions-on-Apache/

Php-fpmを使用した方が良いと思いますが、複数のphpバージョンを設定するのは少し複雑です。

複数のphp-fpmsを実行し、Apacheが相互に使用するように設定する必要があります。

0

同時に実行する場合は、2つの異なるポートが必要です。たぶん、Apacheを起動する前に1つまたは別のバージョンを正しい位置に移動する単純なスクリプトを使用して、Apacheの構成(httpd.conf)を変更するだけでいいのかもしれません。

0
Martin Ueding

複数のプロジェクトを処理していたときに同じ問題が発生しました。 この記事 を参照しましたが、必要に応じてバージョンを切り替える必要があるたびに、CLIとWebに個別に柔軟性を与えます。

php5.6からphp7.0への移動

Apacheの場合、コマンドは次のように使用できます。

Sudo a2dismod php5.6 ; Sudo a2enmod php7.0 ; Sudo service Apache2 restart

CLIの場合、コマンドは次のように使用できます。

Sudo update-alternatives --set php /usr/bin/php7.0

php7.0からphp5.6への移動

Apacheの場合、コマンドは次のように使用できます。

Sudo a2dismod php7.0 ; Sudo a2enmod php5.6 ; Sudo service Apache2 restart

CLIの場合、コマンドは次のように使用できます。

Sudo update-alternatives --set php /usr/bin/php5.6
0

ボックスにインストールされているPHPバージョンを簡単に切り替えることができるbashスクリプトを作成しました。古いプログラムと新しいプログラムを持っている顧客とのいくつかのWebプロジェクトがあるため、複数の仮想ホストを実行しています。これらのプロジェクトのいくつかは、古いバージョンのphpを必要とし、他のプロジェクトはphp7.0を必要とします。

私のコメントを読んで、これを使用する前に何が起こっているかを理解してください。

#!/bin/bash
# This file is for switching php versions.  
# To run this file you must use bash, not sh
# 
# OS: Ubuntu 14.04 but should work on any linux
# Example: bash phpswitch.sh 7.0
# Written by Daniel Pflieger
# growlingflea at g mail dot com

NEWVERSION=$1  #this is the git directory target

#get the active php enabled mod by getting the array of files and store
#it to a variable
VAR=$(ls /etc/Apache2/mods-enabled/php*)

#parse the returned variables and get the version of php that is active.
IFS=' ' read -r -a array <<< "$VAR"
array[0]=${array[0]#*php}
array[0]=${array[0]%.conf}


#confirm that the newversion veriable isn't empty.. if it is tell user 
#current version and exit
if [ "$NEWVERSION" = "" ]; then
echo current version is ${array[0]}.  To change version please use argument
exit 1
fi 

OLDVERSION=${array[0]}
#confirm to the user this is what they want to do
echo "Update php"  ${OLDVERSION} to ${NEWVERSION}


#give the user the opportunity to use CTRL-C to exit ot just hit return
read x

#call a2dismod function: this deactivate the current php version
Sudo a2dismod php${OLDVERSION}

#call the a2enmod version.  This enables the new mode
Sudo a2enmod php${NEWVERSION} 

echo "Restart service??"
read x

#restart Apache
Sudo service Apache2 restart
0
Growling Flea