PHP模块编译API不正确(无法初始化)

时间:2011-12-06 20:58:10

标签: php sql-server

我正在尝试在RHEL5盒子上安装freetds和php-mssql。我已成功完成(似乎是)所有事情。但是,当PHP尝试加载模块时,我收到以下错误:

PHP Warning:  PHP Startup: mssql: Unable to initialize module
Module compiled with module API=20090626, debug=0, thread-safety=0
PHP    compiled with module API=20050922, debug=0, thread-safety=0
These options need to match

我一直在努力弄清楚为什么他们有不同的价值,但没有成功。

在最新的尝试中,我下载了我正在运行的版本的php源码(php-5.3.8),进入了ext / mssql文件夹并运行了phpize,configure,make,make install。

我验证了mssql.so文件位于相应的文件夹中,并且该php正在尝试加载它。

phpize -v
Configuring for:
PHP Api Version:         20050922
Zend Module Api No:      20090626
Zend Extension Api No:   220090626

3 个答案:

答案 0 :(得分:12)

RHEL有一个旧版本的php(5.1.x),并且安装较新的php版本(例如5.3.x)意味着需要进行一些更改。如果从非官方的repos安装,你会看到名为php- *和php5- *的软件包。两个版本都可以成为问题的根源。

看起来你的系统正在从以前的php安装中访问一些配置文件。

看看:   - /etc/php.d确保没有旧版本的元素   - 看看/ usr / bin / php-config *,如果你同时拥有php-config和php-config5,删除(重命名)/ usr / bin / php-config并对新的符号链接进行符号链接:< / p>

# mv /usr/bin/php-config /usr/bin/php-config_old
# ln -s /usr/bin/php-config5 /usr/bin/php-config

希望这有帮助

答案 1 :(得分:1)

我可以确认,当一个模块由于不同的API而没有加载时,因为旧的php-config。然后你必须查看/ usr / bin / php-config并用更新的版本覆盖它。

答案 2 :(得分:0)

对于那些使用基于 debian 的发行版(例如 Ubuntu)的人,如果您安装了多个版本的 php,您还可以检查已设置的任何替代方案。

快速确定为与 php 相关的任何内容设置了哪些替代方案的一种方法是 ls -l /etc/alternatives/*php*

示例输出:

$ ls -l /etc/alternatives/*php*
lrwxrwxrwx 1 root root 15 May 19 00:02 /etc/alternatives/php -> /usr/bin/php7.4
lrwxrwxrwx 1 root root 19 Jan 28 18:50 /etc/alternatives/php-cgi -> /usr/bin/php-cgi7.4
lrwxrwxrwx 1 root root 23 Jan 28 18:50 /etc/alternatives/php-cgi-bin -> /usr/lib/cgi-bin/php7.4
lrwxrwxrwx 1 root root 35 Jan 28 18:50 /etc/alternatives/php-cgi.1.gz -> /usr/share/man/man1/php-cgi7.4.1.gz
lrwxrwxrwx 1 root root 22 May 19 20:27 /etc/alternatives/php-config -> /usr/bin/php-config7.4
lrwxrwxrwx 1 root root 38 May 19 20:27 /etc/alternatives/php-config.1.gz -> /usr/share/man/man1/php-config7.4.1.gz
lrwxrwxrwx 1 root root 24 May 19 20:30 /etc/alternatives/php-fpm.sock -> /run/php/php8.0-fpm.sock
lrwxrwxrwx 1 root root 31 May 19 00:02 /etc/alternatives/php.1.gz -> /usr/share/man/man1/php7.4.1.gz
lrwxrwxrwx 1 root root 18 May 19 20:29 /etc/alternatives/phpdbg -> /usr/bin/phpdbg7.4
lrwxrwxrwx 1 root root 34 May 19 20:29 /etc/alternatives/phpdbg.1.gz -> /usr/share/man/man1/phpdbg7.4.1.gz
lrwxrwxrwx 1 root root 18 May 19 20:29 /etc/alternatives/phpize -> /usr/bin/phpize7.4
lrwxrwxrwx 1 root root 34 May 19 20:29 /etc/alternatives/phpize.1.gz -> /usr/share/man/man1/phpize7.4.1.gz

就我而言,我在安装了 7.4 之后安装了 php8。然后我需要切换回来,我的一半选择仍然设置为8。当我尝试启用我用pecl安装的扩展时,我遇到了OP提到的问题。

因此,例如,当从 php 8.0 切换回 7.4 时,如果其中一个选项的符号链接仍然指向 8.0,例如 php-fpm.sock,那么您将
sudo update-alternatives --config php-fpm.sock 并选择匹配 php7.4-fpm.sock 的编号(下例中为 1)

$ sudo update-alternatives --config php-fpm.sock 
There are 2 choices for the alternative php-fpm.sock (providing /run/php/php-fpm.sock).

  Selection    Path                      Priority   Status
------------------------------------------------------------
* 0            /run/php/php8.0-fpm.sock   80        auto mode
  1            /run/php/php7.4-fpm.sock   74        manual mode
  2            /run/php/php8.0-fpm.sock   80        manual mode

Press <enter> to keep the current choice[*], or type selection number: 1