这两天在弄php7.1的docker镜像,使用的系统是Ubuntu 16.04;
PHP7发布到现在大部分的扩展都可以直接用pecl安装,但也要注意一些变化,比如couchbase。
首先说明一下,5.6的安装步骤是怎样的:
- 使用apt-get 安装php5.6,以及各个库
- 依次使用pecl安装几个扩展如(yar、couchbase)
- 增加各个扩展的配置到/etc/php/{version}/mod_available,如couchbase.ini,内容如下:
extension=couchbase.so
- 使用phpenmod couchbase,使得配置生效(其实是在真实的配置地址下,建立软连接,如生成文件/etc/php/7.1/cli/conf.d/20-couchbase.ini
- 如果是php-fpm,需要重启才能生效
以上步骤,除了couchbase,都正常使用,当使用php -v
命令时,出现报错,其中json_globals可能是json的其他函数:
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/20160303/couchbase.so' - /usr/lib/php/20160303/couchbase.so: undefined symbol: json_globals in Unknown on line 0
导致整个原因是因为,couchbase在v2.0.0版本时修改了扩展的载入类型
从
PHP_ARG_ENABLE(couchbase, whether to enable Couchbase support,
[ --with-couchbase Include Couchbase support])
改成了
PHP_ARG_WITH(couchbase, whether to enable Couchbase support,
[ --with-couchbase Include Couchbase support])
这个修改导致couchbase的导入和内置扩展同个级别,但是couchbase依赖json,导致载入couchbase时报错
通过修改couchbase.ini,增加注释priority = 30
可以避免这个报错
; configuration for php couchbase module
; priority = 30
extension=couchbase.so
这样通过phpenmod命令生效的配置,是30-couchbase.ini文件,导入顺序在内置扩展之后,就不会出现报错了;
另外这个就是书写配置的习惯问题了,如果不是PHP自带的扩展,在写扩展配置文件时,都添加priority = {value},value>20,这样就不会因为依赖问题,导致报错;
网友评论