26

我已经将我的 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

并在我的 php.ini 中启用 apc 模块 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

所以这不是一个解决方案。

谁能指出我正确的方向?我真的不知道这里发生了什么。

4

7 回答 7

40

就我而言,我试图安装 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。

于 2014-01-02T15:52:16.360 回答
32

解决方案非常简单。我不得不修改我的 pecl 配置。事实证明,这两个命令成功了:

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

pecl 使用了错误的 phpize。phpize 有两个版本。我的 php.ini 文件也是如此。

于 2013-10-24T19:52:25.140 回答
7

其他答案(到目前为止)似乎都没有解决拥有多个“可共同安装”的 PHP 版本,同时希望为所有已安装的 PHP 版本构建一个给定的扩展。

为了说明我发现自己的场景(我正在使用适用于 Ubuntu 16.04 LTS 的 Ondrej Surý PHP PPA):

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 做这项工作,但不是为其他人做的。

其他回答者表示,虽然可以卸载/重新安装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
于 2017-08-09T01:49:12.693 回答
6

最好重新安装 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
于 2016-10-27T09:47:58.887 回答
5

有一种方法可以在 Ubuntu 上切换 PHP 版本:

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

并且可以选择:

sudo update-alternatives --set phar /usr/bin/phar5.6
sudo update-alternatives --set phar.phar /usr/bin/phar.phar5.6
sudo update-alternatives --set phpize /usr/bin/phpize5.6
sudo update-alternatives --set php-config /usr/bin/php-config5.6

来源:https ://superuser.com/a/1100911/371795

于 2018-04-23T16:11:17.137 回答
2

最近遇到了类似的问题。

(Debian,刚刚安装的 PHP 7.3,正在使用 PHP 7.2)

如果有人尝试了最高投票的答案但仍然无法正常工作。以下是调试步骤:

  • 删除所有其他 php 版本,尤其是 dev 包(在我的情况下为 php7.2-dev)
  • 安装当前版本的开发包(php7.3-dev)

基本上就是这样。

原因:

PECL 需要 phpize,它是 php-dev 包的一部分。如果没有找到当前版本的 phpize,如果将查找以前的版本,这会导致旧的 PHP API 编号

于 2019-11-03T01:23:19.413 回答
1

在 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 (15,915 bytes) ...done: 15,915 bytes 8 个源文件,正在构建

运行:phpize

配置:

PHP API 版本:20131106

Zend 模块 API 编号:20131226

Zend Extension API 编号:220131226

...

安装好:频道://pecl.php.net/raphf-1.1.2

在 php.ini 中启用了扩展 raphf

我注意到,当 php.ini 中没有启用扩展时,pecl 在 php.iniextension="xxx.so"的开头添加该行,所以我通常将它手动移动到文件的末尾,然后在它可以用于下一个扩展之后。

根据您系统上的内容,可能需要在安装后回滚您的更改,特别是对于要使用的默认 php 版本,使用 update-alternatives

于 2019-08-13T14:00:36.190 回答