Pecl устанавливает предыдущую версию php
Я обновил свой MacBook до Mavericks и разрушил среду разработки. Проблема, которую я сейчас имею в виду, заключается в том, что моя груша /pecl по-прежнему пытается установить для моей предыдущей версии (5.3) PHP вместо версии 5.4.
Версия PHP:
$ php -v
PHP 5.4.17 (cli) (built: Aug 25 2013 02:03:38)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans
груша
$ pear version
PEAR Version: 1.9.4
PHP Version: 5.4.17
Zend Engine Version: 2.4.0
Running on: Darwin MBP-retina.local 13.0.0 Darwin Kernel Version 13.0.0: Thu Sep 19 22:22:27 PDT2013; root:xnu-2422.1.72~6/RELEASE_X86_64 x86_64
Если я устанавливаю apc с
$ sudo pecl install apc
downloading APC-3.1.13.tgz ...
Starting to download APC-3.1.13.tgz (171,591 bytes)
.....................................done: 171,591 bytes
55 source files, building
running: phpize
Configuring for:
PHP Api Version: 20090626
Zend Module Api No: 20090626
Zend Extension Api No: 220090626
...
Build process completed successfully
Installing '/usr/local/Cellar/php53/5.3.26/include/php/ext/apc/apc_serializer.h'
Installing '/usr/local/Cellar/php53/5.3.26/lib/php/extensions/no-debug-non-zts-20090626/apc.so'
install ok: channel://pecl.php.net/APC-3.1.13
Extension apc enabled in php.ini
И включите модуль apc в php.ini php -v, чтобы изменить это:
$ php -v
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/extensions/no-debug-non-zts-20100525/apc.so' - dlopen(/usr/lib/php/extensions/no-debug-non-zts-20100525/apc.so, 9): image not found in Unknown on line 0
PHP 5.4.17 (cli) (built: Aug 25 2013 02:03:38)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans
Итак, pecl устанавливает расширение apc в /usr/local/Cellar/php53/5.3.26/lib/php/extensions/no-debug-non-zts-20090626
, а php ожидает его в /usr/lib/php/extensions/no-debug-non-zts-20100525/
.
Простое создание символической ссылки дает следующую ошибку:
$ php -v
PHP Warning: PHP Startup: apc: Unable to initialize module
Module compiled with module API=20090626
PHP compiled with module API=20100525
These options need to match
in Unknown on line 0
PHP 5.4.17 (cli) (built: Aug 25 2013 02:03:38)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans
Итак, это не решение.
Может ли кто-нибудь указать мне в правильном направлении? Я действительно не знаю, что здесь происходит.
Ответы
Ответ 1
Решение было довольно простым. Мне пришлось внести изменения в мою конфигурацию pecl. Оказалось, что эти две команды сделали трюк:
sudo pear config-set php_ini /etc/php.ini
sudo pecl config-set bin_dir /usr/bin/
pecl использовал неправильный phpize. Были две версии phpize. То же самое относится к моему файлу php.ini.
Ответ 2
В моем случае я пытался установить Gearman.
pecl install gearman установит его неправильно.
php -i
:
PHP Extension => 20100525
Но pecl будет устанавливать, используя:
PHP Api Version: 20090626
После изменения настроек конфигурации для использования:
Первое исправление
sudo pecl config-set php_ini /etc/php.ini
sudo pecl config-set php_bin /usr/bin/php5
Я заметил, что все равно получаю
ПРЕДУПРЕЖДЕНИЕ: php_bin/usr/bin/php5 имеет суффикс 5, но config переменная php_suffix не соответствует
Это можно решить с помощью настройки конфигурации:
Дополнительное исправление
sudo pear config-set php_suffix 5
Почему это проблема?
Для меня я попал в эту проблему, потому что добавил пользовательский PPA и переустановил PHP. Это означало, что моя предыдущая установка php5-dev не синхронизировалась.
Если вы когда-нибудь попадете в ту же ситуацию, вы можете просто запустить.
apt-get remove php5-dev
pecl uninstall <extensionname>
apt-get install php5-dev
apt-get remove php5-pear
apt-get install php5-pear
pecl install <extensionname>
В качестве альтернативы вы можете загрузить источник и запустить phpize.
Ответ 3
Ни один из других ответов (пока), по-видимому, не затрагивает наличие нескольких "совместимых" версий PHP, когда вы хотите создать данное расширение для всех установленных версий PHP.
Чтобы проиллюстрировать сценарий, в котором я нахожусь (я использую PPD для Ondrej Surý PHP для Ubuntu 16.04 LTS):
[email protected]:~# ls -lah /usr/bin/*php*
-rwxr-xr-x 1 root root 11K Apr 19 12:50 dh_php
-rwxr-xr-x 1 root root 3.1K Apr 5 2016 dh_phpcomposer
-rwxr-xr-x 1 root root 5.4K Apr 5 2016 dh_phppear
lrwxrwxrwx 1 root root 21 Jul 24 00:44 php -> /etc/alternatives/php
-rwxr-xr-x 1 root root 4.3M Jul 6 10:04 php5.6
-rwxr-xr-x 1 root root 4.3M Jul 6 10:04 php7.0
-rwxr-xr-x 1 root root 4.4M Aug 4 14:22 php7.1
lrwxrwxrwx 1 root root 28 Jul 24 00:44 php-config -> /etc/alternatives/php-config
-rwxr-xr-x 1 root root 4.3K Jul 6 10:03 php-config5.6
-rwxr-xr-x 1 root root 4.1K Jul 6 10:03 php-config7.0
-rwxr-xr-x 1 root root 4.1K Aug 4 14:21 php-config7.1
lrwxrwxrwx 1 root root 24 Jul 24 00:44 phpize -> /etc/alternatives/phpize
-rwxr-xr-x 1 root root 4.7K Jul 6 10:03 phpize5.6
-rwxr-xr-x 1 root root 4.6K Jul 6 10:03 phpize7.0
-rwxr-xr-x 1 root root 4.6K Aug 4 14:21 phpize7.1
pecl install extension-name
выполняет работу для PHP 7.1, но не другие.
Другие участники указывают, что, хотя можно удалить/переустановить php*-dev
, я бы скорее не отдал, учитывая намеренные, совместно установленные версии PHP в системе.
Одним из решений является создание расширения для каждой версии, присутствующей в системе.
Этот фрагмент демонстрирует создание с помощью PHP 5.6, но я сделал то же самое для 7.0 и 7.1, и этапы одинаковы.
В этом примере показано клонирование расширения из репозитория Git, но можно использовать любой исходный каталог.
(#
указывает, что вы должны быть root или использовать sudo
)
# apt-get install php-dev
# cd ~
# git clone https://github.com/vendor/extension-name
# cd ./extension-name
# phpize5.6
# ./configure --with-php-config=/usr/bin/php-config5.6
# make clean
# make
# make install
# ln -s /etc/php/5.6/mods-available/extension-name.ini /etc/php/5.6/fpm/conf.d/20-extension-name.ini
# service php5.6-fpm reload
Ответ 4
Лучше переустановить расширения phpize, поскольку он будет использоваться PECL, а не делать хаки.
Далее (пример php 5.5 = > php 5.6):
sudo apt-get remove php5-dev
sudo apt-get install php5.6-dev
(вы можете изменить 5.6 на нужную вам версию)
Тогда:
sudo pecl install extensionname
Ответ 5
Существует способ переключения версии PHP в Ubuntu:
sudo update-alternatives --set php /usr/bin/php5.6
Источник: https://superuser.com/a/1100911/371795
Ответ 6
В Ubuntu 16.04 при использовании ppa: ondrej/php (и, возможно, других альтернатив) для установки расширений pecl/php для php 5.6 необходимо выполнить следующее:
pecl config-set ext_dir /usr/lib/php/20131226
pecl config-set php_bin /usr/bin/php5.6
pecl config-set php_ini /etc/php/5.6/cli/php.ini
pear config-set ext_dir /usr/lib/php/20131226
pear config-set php_bin /usr/bin/php5.6
pear config-set php_ini /etc/php/5.6/cli/php.ini
update-alternatives --config php #select php 5.6
update-alternatives --config php-config #select php 5.6
update-alternatives --config phpize #select php 5.6
Далее вы можете использовать pecl как обычно:
pecl install raphf-1.1.2
downloading raphf-1.1.2.tgz...
Starting to download raphf-1.1.2.tgz(15,915 bytes)
......done: 15,915 bytes
8 source files, building
running: phpize
Configuring for:
PHP Api версия: 20131106
Zend Module Api No: 20131226
Расширение Zend Api №: 220131226
...
install ok: channel://pecl.php.net/raphf-1.1.2
Расширение raphf включено в php.ini
Я заметил, что когда в php.ini не включены расширения, pecl добавляет строку extension="xxx.so"
в начале php.ini, поэтому я обычно перемещаю ее в конец файла, вручную, и после того, как это нормально для следующие расширения.
В зависимости от того, что у вас есть в вашей системе, может потребоваться откатить ваши изменения после установки, особенно для версии php по умолчанию, с альтернативами обновления