web-dev-qa-db-fra.com

Comment installer l'extension php en utilisant pecl pour une version php spécifique, lorsque plusieurs versions php sont installées dans le système?

J'ai installé à la fois php5.6 et php7.0 de PPA sur Ubuntu selon ce manuel

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

Mais je n'ai pas compris comment installer des extensions en utilisant pecl pour php5.6 ou php7.0.

Par exemple, j'ai déjà installé la version de libevent ou amqp en php5.6.

Maintenant, quand je tape pecl install libevent et ma version php active est php7.0 (en utilisant update-alternatives --set php /usr/bin/php7.0),peclreturns message thatlibevent` déjà installé.

Mais il a été installé uniquement pour php5.6 (lorsque cette version était active) et maintenant je veux le faire pour php7.0.

Quelles commandes pourraient m'aider?

[~ # ~] upd [~ # ~]

J'ai trouvé ces commandes pour basculer pecl vers php7.0 et les empaqueter vers des scripts bash exécutables:

#!/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

et pour 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

Mais ils ne sont pas utiles, pecl me donne toujours list des extensions déjà installées à php5.6, même si je suis passé à 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

Il devrait être vide pour php7.0!

Comment résoudre le problème?

[~ # ~] upd [~ # ~]

Pour amqp, je viens d'installer le paquet php-amqp sans utiliser pecl.

apt-get install php-amqp

Et libevent n'existe toujours pas pour php7. Mais je n'avais pas trouvé de moyen de basculer l'installation de pecl entre la version 5.6 et la version 7, donc la question est toujours ouverte.

24
Oleg Abrazhaev

Voici ce qui a le mieux fonctionné pour moi lorsque j'essaie de créer un script (au cas où quelqu'un d'autre trouverait cela comme moi):

$ 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>

Le -d php_suffix=<version> piece vous permet de définir des valeurs de configuration au moment de l'exécution par rapport à leur préréglage avec pecl config-set. Le uninstall -r bit ne le désinstalle pas réellement (à partir de la documentation):

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
  ...

La ligne de désinstallation est nécessaire, sinon son installation supprimera toute version précédemment installée, même si c'était pour une autre version PHP (ex: Installation d'une extension pour PHP 7.0 supprimerait la version 5.6 si le paquet était toujours enregistré comme installé).

22
Matt Zuba

Lorsque pecl throws error est déjà installé et est le même que la version publiée

Passer aux versions requises de php, php-config, phpize avant l'installation à partir de pecl

Exécutez simplement l'installation avec l'indicateur de force

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

J'ai rencontré ce même problème lors de la mise à jour ma boîte Vagrant avec XHGui , car XHGui nécessite mongodb. Je voulais pouvoir prendre en charge le profilage sur les deux PHP 5.6 et 7.0.

J'ai fouillé dans le code source de pecl, et j'ai trouvé qu'il y avait un metadata_dir option de configuration. C'est un chemin d'accès à un répertoire où l'état actuel des packages installés. Malheureusement, ce n'est pas déjà un espace de noms par PHP. Si vous essayez de le définir avec pecl config-set, vous obtenez une erreur "échouée" opaque. Il s'avère que le paramètre n'est pas sur la liste blanche comme étant configurable dans le \PEAR_Config classe:

/**
 * 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'
    );

Dans le monde de PECL, "global" signifie qu'il ne peut être défini qu'au moment de l'installation, et non après.

Il y a un problème dans le tracker PPA sur github: https://github.com/oerdnj/deb.sury.org/issues/407

La dernière suggestion est de construire l'extension manuellement pour les versions alternatives PHP. J'ai fini par utiliser pecl pour PHP 7 extensions et les versions manuelles pour 5.6. Make vous exécutez update-alternatives pour php-config et phpize, et pas seulement php avant la construction:

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

Ensuite, extrayez l'extension et générez-la. Ces étapes du problème ci-dessus ont fonctionné pour moi avec l'extension mongodb:

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

6
deviantintegral