Как установить расширение php, используя pecl для конкретной версии php, когда в системе установлено несколько версий php?
Я установил php5.6 и php7.0 из PPA на Ubuntu в соответствии с этим руководством
http://lornajane.net/posts/2016/php-7-0-and-5-6-on-ubuntu
Но я не понял, как установить расширения с помощью pecl
для php5.6 или php7.0.
Например у меня уже установлена версия libevent
или же amqp
в php5.6.
Теперь, когда я печатаю 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
Но они не помогают, Пекл по-прежнему дает мне 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. Но я не нашел способа переключить установку pecl между 5.6 и 7 версией, поэтому вопрос все еще открыт.
3 ответа
Вот что лучше всего сработало для меня, когда я пытался написать сценарий (на случай, если кто-то еще столкнется с этим, как я):
$ 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>
кусок позволяет вам установить значения конфигурации во время выполнения против предварительной установки их с 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 ошибка уже установлена и совпадает с выпущенной версией
Переключитесь на необходимые версии php, php-config, phpize перед установкой из pecl
Просто запустите установку с флагом силы
sudo pecl install -f <package-name>
Я столкнулся с этой же проблемой при обновлении моей Vagrant-коробки с помощью XHGui, поскольку XHGui требует mongodb. Я хотел иметь возможность поддерживать профилирование на PHP 5.6 и 7.0.
Я копался в исходном коде pecl и обнаружил, что есть metadata_dir
опция конфигурации. Это путь к каталогу, в котором находится текущее состояние установленных пакетов. К сожалению, это еще не пространство имен для версии PHP. Если вы попытаетесь установить его с pecl config-set
, вы получаете непрозрачную ошибку "не удалось". Оказывается, этот параметр не входит в белый список, поскольку его можно настроить в \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 "глобальный" означает, что он может быть установлен только во время установки, а не после.
Есть проблема в трекере PPA на github: https://github.com/oerdnj/deb.sury.org/issues/407
Последнее предложение - создать расширение вручную для альтернативных версий PHP. В итоге я использовал pecl для расширений PHP 7 и ручные сборки для 5.6. Убедитесь, что вы бежите update-alternatives
для php-config и phpize, а не только для 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
Прежде всего, получите разрешение администратора в среде Linux - **Sudo su **<> Затем следуйте синтаксису нижеsudo apt-get install php7.3-bcmath
Здесь php7.3 (введите свою версию php и проверьте с помощью php -v) bcmath (введите имя вашего расширения)
И если вы хотите проверить список активных расширений, введите (php -m) в терминал.