web-dev-qa-db-ja.com

システムに複数のPHPバージョンがインストールされている場合、特定のPHPバージョンにpeclを使用してPHP拡張機能をインストールする方法は?

このマニュアルに従って、UbuntuのPPAからphp5.6とphp7.0の両方をインストールしました。

http://lornajane.net/posts/2016/php-7-0-and-5-6-on-ubunt

しかし、php5.6またはphp7.0のpeclを使用して拡張機能をインストールする方法がわかりませんでした。

たとえば、php5.6にlibeventまたはamqpのバージョンを既にインストールしています。

pecl install libeventと入力し、アクティブなphpバージョンがphp7.0の場合(update-alternatives --set php /usr/bin/php7.0),peclreturns message thatlibevent`が既にインストールされている場合)。

しかし、それはphp5.6のみ(このバージョンがアクティブだったとき)にインストールされていたので、今はphp7.0でも実行したいです。

どのコマンドが役立ちますか?

[〜#〜] upd [〜#〜]

Peclをphp7.0に切り替えるための次のコマンドを見つけ、実行可能なbashスクリプトにパケット化します。

#!/bin/bash

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

Sudo pecl config-set php_ini /etc/php/7.0/cli/php.ini
Sudo pecl config-set ext_dir /usr/lib/php/20151012/
Sudo pecl config-set bin_dir /usr/bin/
Sudo pecl config-set php_bin /usr/bin/php7.0
Sudo pecl config-set php_suffix 7.0

php5.6の場合

#!/bin/bash

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

Sudo pecl config-set php_ini /etc/php/5.6/cli/php.ini
Sudo pecl config-set ext_dir /usr/lib/php/20131226/
Sudo pecl config-set bin_dir /usr/bin/
Sudo pecl config-set php_bin /usr/bin/php5.6
Sudo pecl config-set php_suffix 5.6

しかし、それらは助けではありません。peclは、php7に切り替えた場合でも、php5.6に既にインストールされている拡張機能のlistを提供します。

pecl list
Installed packages, channel pecl.php.net:
=========================================
Package  Version State
amqp     1.7.1   stable
libevent 0.1.0   beta
stats    1.0.3   stable

Php7.0では空になります!

問題を解決する方法は?

[〜#〜] upd [〜#〜]

Amqpの場合、peclを使用せずにphp-amqpパッケージをインストールしました。

apt-get install php-amqp

また、php7にはまだlibeventが存在しません。しかし、私はpeclのインストールを5.6と7バージョンの間で切り替える方法を見つけていなかったので、質問はまだ開かれています。

24
Oleg Abrazhaev

これをスクリプト化しようとしたときに私にとって最もうまくいったのは次のとおりです(私がやったように他の誰かがこれに遭遇した場合):

$ pecl -d php_suffix=5.6 install <package>
$ pecl uninstall -r <package>

$ pecl -d php_suffix=7.0 install <package>
$ pecl uninstall -r <package>

$ pecl -d php_suffix=7.1 install <package>
$ pecl uninstall -r <package>

-d php_suffix=<version> pieceを使用すると、実行時に設定値を設定できますが、pecl config-setuninstall -rビットは実際にそれをアンインストールしません(ドキュメントから):

vagrant@Homestead:~$ pecl help uninstall
pecl uninstall [options] [channel/]<package> ...
Uninstalls one or more PEAR packages.  More than one package may be
specified at once.  Prefix with channel name to uninstall from a
channel not in your default channel (pecl.php.net)

Options:
  ...
  -r, --register-only
        do not remove files, only register the packages as not installed
  ...

アンインストール行が必要です。それ以外の場合は、別のPHPバージョン(たとえば、PHPパッケージがまだインストール済みとして登録されている場合、7.0は5.6バージョンを削除します)。

22
Matt Zuba

Pecl throwsエラーが既にインストールされており、リリースされたバージョンと同じ場合

Peclからインストールする前に、必要なphp、php-config、phpizeバージョンに切り替えます

強制フラグを付けてインストールするだけです

Sudo pecl install -f <package-name>
7
Panoptik

XHGuiにはmongodbが必要なので、 XHGuiを使用したVagrant box の更新中に同じ問題に遭遇しました。 PHP 5.6と7.0の両方でプロファイリングをサポートできるようにしたかった。

Peclのソースコードを掘り下げたところ、metadata_dir configオプションがあることがわかりました。これは、インストールされたパッケージの現在の状態があるディレクトリへのパスです。残念ながら、それはPHPバージョンごとに既に名前空間化されていません。pecl config-setで設定しようとすると、不透明な 'failed'エラーが発生します。 \PEAR_Configクラスで構成可能としてホワイトリストに登録されました:

/**
 * Configuration values that can be set for a channel
 *
 * All other configuration values can only have a global value
 * @var array
 * @access private
 */
var $_channelConfigInfo = array(
    'php_dir', 'ext_dir', 'doc_dir', 'bin_dir', 'data_dir', 'cfg_dir',
    'test_dir', 'www_dir', 'php_bin', 'php_prefix', 'php_suffix', 'username',
    'password', 'verbose', 'preferred_state', 'umask', 'preferred_mirror', 'php_ini'
    );

PECLの世界では、「グローバル」はインストール時にのみ設定でき、後では設定できないことを意味します。

GithubのPPAトラッカーに問題があります: https://github.com/oerdnj/deb.sury.org/issues/407

最後の提案は、代替PHPバージョンの拡張機能を手動でビルドすることです。PHP 7拡張機能、および5.6の手動ビルドでpeclを使用することになりました。ビルドする前にphpだけでなく、php-configとphpizeに対してupdate-alternativesを実行してください:

update-alternatives --set php /usr/bin/php5.6
update-alternatives --set php-config /usr/bin/php-config5.6
update-alternatives --set phpize /usr/bin/phpize5.6

次に、拡張機能を抽出してビルドします。上記の問題からのこれらの手順は、mongodb拡張機能を使用することで機能しました。

phpize5.6 && ./configure --with-php-config=php-config5.6 && make && Sudo make install

6
deviantintegral