Как установить расширение 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 thatlibevent` уже установлен.

Но он был установлен только для 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) в терминал.

Другие вопросы по тегам