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 that
libevent` 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.
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é).
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>
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