2016-11-04 27 views
9

我已經按照本手冊如何在系統中安裝幾個PHP版本時使用pecl爲特定的php版本安裝php擴展?

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

在Ubuntu上安裝了PPA都php5.6和php7.0,但我沒有得到如何使用pecl爲php5.6或php7.0安裝擴展。

例如,我已經在php5.6中安裝了libeventamqp的版本。

現在,當我鍵入pecl install libevent和我主動的PHP版本是php7.0(使用update-alternatives --set php /usr/bin/php7.0), PECL已經安裝returns message that libevent`。

但只安裝了php5.6(當這個版本是活躍的),現在我想這樣做的php7.0。

哪些命令能幫助我嗎?

UPD

我有FO UND此命令爲開關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仍然給我的已經list安裝了php5.6的擴展,即使我切換到php7。

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我已經安裝了PHP,AMQP包,而無需使用PECL。

apt-get install php-amqp 

而libevent仍然不存在爲php7。 但我沒有找到一種方法來切換5.6和7版本之間的pecl安裝,所以問題仍然是開放的。

+0

爲什麼你有兩個版本的PHP? – Archish

+1

我需要兩個我的具體需求。例如,我有2個項目,其中一個應該運行5.6,第二個運行7個。而且我沒有時間將第一個遷移到php7。 –

+0

您是否找到任何解決方案? – ChickenFeet

回答

3

我遇到同樣的問題,同時更新my Vagrant box with XHGui,因爲XHGui需要mongodb。我希望能夠支持PHP 5.6和7.0的分析。

我挖入pecl源代碼,發現有一個metadata_dir配置選項。這是安裝軟件包當前狀態的目錄的路徑。不幸的是,每個PHP版本都沒有命名空間。如果您嘗試使用pecl config-set進行設置,則會出現不透明的「失敗」錯誤。事實證明,設置不列入白名單爲在\PEAR_Config類configuable:

/** 
* 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的世界裏,「全球化」意味着它只能在安裝時進行設置,而不是之後。

有一個在PPA跟蹤過一個問題,在github上:https://github.com/oerdnj/deb.sury.org/issues/407

最後建議有手工打造的擴展備用PHP版本。我最終使用pecl來處理PHP 7擴展,並且手動構建了5.6。確保你的PHP-config並phpize運行update-alternatives和建築之前不只是PHP的:

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

2

當PECL拋出已安裝誤差,是一樣的發佈版本

切換到需要的PHP,PHP的配置,phpize版本安裝來自PECL之前

只是強制標誌運行安裝

sudo pecl install -f <package-name> 
+1

這是我認爲最好的答案。但是,它似乎刪除了以前的擴展對象,這很煩人。 – msbit

1

下面是試圖腳本的時候爲我工作最好的這個(如果任何人遇到這種像我一樣):

$ 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>片可以讓你在運行時設置配置值VS預先設定他們pecl config-set 。該uninstall -r位實際上不卸載它(從文檔):

[email protected]:~$ 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版本,如果包仍然被註冊爲已安裝)。