Pecl устанавливает для предыдущей версии PHP

Я обновил свой MacBook до Mavericks и разрушил свою среду разработки. У меня сейчас проблема в том, что мой pear/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

Так что это не решение.

Кто-нибудь может указать мне правильное направление? Я действительно понятия не имею, что здесь происходит.

5 ответов

Решение

Решение было довольно простым. Мне пришлось внести изменения в мой конфиг pecl. Оказалось, что эти две команды сделали свое дело:

sudo pear config-set php_ini /etc/php.ini
sudo pecl config-set bin_dir /usr/bin/

pecl использовал неправильный phpize. Было две версии phpize. То же самое относится и к моему файлу php.ini.

В моем случае я пытался установить 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, но переменная конфигурации 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.

Ни один из других ответов (пока что), по-видимому, не касается наличия нескольких "совместно устанавливаемых" версий PHP, в то же время желая создать данное расширение для всех установленных версий PHP.

Чтобы проиллюстрировать сценарий, в котором я нахожусь (я использую PHP PPA Ondrej Surý для Ubuntu 16.04 LTS):

root@localhost:~# 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, но не остальные.

Другие anwsers указывают, что хотя можно удалить / переустановить 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

Существует способ переключения PHP-версии в Ubuntu:

sudo update-alternatives --set php /usr/bin/php5.6

Источник: /questions/21765170/mozhno-li-poluchit-nomera-kalifornijskogo-loterejnogo-bileta-po-ego-shtrih-kodu/21765176#21765176

Лучше переустановить расширения 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

Недавно столкнулся с подобной проблемой.

(Debian, PHP 7.3 только что установлен, использовал PHP 7.2)

Если кто-то пробовал ответ с наибольшим количеством голосов, но все равно не работал. Вот шаги для отладки:

  • Удалите все другие версии php, особенно пакет dev (в моем случае php7.2-dev)
  • установить пакет dev для текущей версии (php7.3-dev)

И в основном это все.

Причина:

PECL требует phpize, который является частью пакета php-dev. Если phpize для текущей версии не найден, if будет искать предыдущую версию, что приведет к более старому номеру PHP API.

В 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

загрузка raphf-1.1.2.tgz ... Начало загрузки raphf-1.1.2.tgz (15915 байт) ...... выполнено: 15 915 байт 8 исходных файлов, сборка

работает: phpize

Настройка для:

Версия PHP Api: 20131106

Номер API модуля Zend: 20131226

Zend Extension Api №: 220131226

...

установить нормально: канал://pecl.php.net/raphf-1.1.2

Расширение raphf включено в php.ini

Я заметил, что, когда в php.ini не включены расширения, pecl добавляет строку extension="xxx.so" в начале php.ini, поэтому я обычно перемещаю его в конец файла вручную, и после этого он подходит для следующих расширений.

В зависимости от того, что у вас есть в вашей системе, может потребоваться откат ваших изменений после установки, особенно для используемой версии php по умолчанию, с альтернативами обновления

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