升级PHP7时couchbase扩展导入的bug

这两天在弄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,这样就不会因为依赖问题,导致报错;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • (centos7+nginx1.9+mysql5.6+php7) 1.准备工作: 1)把所有的软件安装在/data...
    Tshare_XUN阅读 631评论 0 0
  • 把当前目录作为Root Document只需要这条命令即可:php -S localhost:3300 也可以指定...
    绚烂的时光阅读 756评论 0 1
  • PHP7 已经出来1年了,PHP7.1也即将和大家见面,这么多好的特性,好的方法,为什么不使用呢,也希望PHP越来...
    梦幻_78af阅读 2,163评论 1 10
  • 2015.12.3 发生了两件大事, PHP7 问世了, Swift 开源了。最好的语言发布了新的版本,一个划时代...
    搬砖家阅读 567评论 0 1
  • 今天是周一轮到我们雨恒队早上值日,一大早我们队的六名队员按时到校,我们先进教室,把作业交到阳台上,然后把书...
    徐雨恒阅读 469评论 0 0