このマニュアルに従って、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 that
libevent`が既にインストールされている場合)。
しかし、それは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バージョンの間で切り替える方法を見つけていなかったので、質問はまだ開かれています。
これをスクリプト化しようとしたときに私にとって最もうまくいったのは次のとおりです(私がやったように他の誰かがこれに遭遇した場合):
$ 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-set
。 uninstall -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バージョンを削除します)。
Pecl throwsエラーが既にインストールされており、リリースされたバージョンと同じ場合
Peclからインストールする前に、必要なphp、php-config、phpizeバージョンに切り替えます
強制フラグを付けてインストールするだけです
Sudo pecl install -f <package-name>
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