mongo.so:>未定义的符号:php_json_encode在第0行的Unknown中。安装mongo驱动程序后为php

时间:2014-04-09 04:47:29

标签: php mongodb ubuntu

安装成功的Mongo 2.6.0后,我尝试使用以下命令升级php mongo ubuntu 12.04驱动程序:sudo pecl upgrade mongo。它成功地开始了:

downloading mongo-1.5.1.tgz ...
Starting to download mongo-1.5.1.tgz (188,885 bytes)
.........................................done: 188,885 bytes
117 source files, building
running: phpize
Configuring for:
PHP Api Version:         20121113
Zend Module Api No:      20121212
Zend Extension Api No:   220121212
Build with Cyrus SASL (MongoDB Enterprise Authentication) support? [no]:

我选择了No,因为当我尝试是的时候,它失败了。没有我能够成功安装它,结束消息看起来像这样:

Build process completed successfully
Installing '/usr/lib/php5/20121212/mongo.so'
install ok: channel://pecl.php.net/mongo-1.5.1
configuration option "php_ini" is not set to php.ini location
You should add "extension=mongo.so" to php.ini

在此之后我重新启动了apache(2.4.9),但我的phpinfo()告诉我没有安装mongo。另一方面,我可以在php.ini中清楚地看到extension=mongo.so

我检查了我的error.log,我可以在那里看到以下行:

  

PHP警告:PHP启动:无法加载动态库   '/usr/lib/php5/20121212/mongo.so' - /usr/lib/php5/20121212/mongo.so:   未定义的符号:第0行的未知中的php_json_encode

我检查了我的/usr/lib/php5/20121212/,发现实际上有一个文件mongo.so。我用谷歌搜索了它,我能找到的唯一类似的东西是this,这并不是真正相关的,但没有其他选择我仍然尝试在那里步骤没有成功。

有没有人知道如何解决这个问题?

6 个答案:

答案 0 :(得分:25)

问题在于加载顺序,因此需要在加载mongo.so之前加载json扩展名。

由于其他人可能会遇到这个问题,我将概述整个过程:

  • 在您的/etc/php/mods-available目录中(或根据平台)创建一个单独的mongo.ini,其中包含以下内容:
; configuration for php mongo module
; priority=30
extension=mongo.so
  • 从其他文件中移除对mongo.so的任何其他引用,例如php.ini

  • 根据需要在每个cliapache2目录中创建符号链接,以供使用:

  

sudo ln -s ../../mods-available/mongo.ini 30-mongo.ini

在此结束时,你应该有一个看起来像这样的结构

$/etc/php5$ tree
.
├── apache2
│   ├── conf.d
│   │   ├── 05-opcache.ini -> ../../mods-available/opcache.ini
│   │   ├── 10-pdo.ini -> ../../mods-available/pdo.ini
│   │   ├── 20-json.ini -> ../../mods-available/json.ini
│   │   ├── 20-readline.ini -> ../../mods-available/readline.ini
│   │   └── 30-mongo.ini -> ../../mods-available/mongo.ini
│   └── php.ini
├── cli
│   ├── conf.d
│   │   ├── 05-opcache.ini -> ../../mods-available/opcache.ini
│   │   ├── 10-pdo.ini -> ../../mods-available/pdo.ini
│   │   ├── 20-json.ini -> ../../mods-available/json.ini
│   │   ├── 20-readline.ini -> ../../mods-available/readline.ini
│   │   └── 30-mongo.ini -> ../../mods-available/mongo.ini
│   └── php.ini
└── mods-available
    ├── json.ini
    ├── mongo.ini
    ├── opcache.ini
    ├── pdo.ini
    └── readline.ini

这确保在“mongo”模块之前动态加载程序将加载“json”扩展名。

但基本上从“php.ini”中删除mongo.so并将其放在自己的文件中,加载顺序比json扩展名更高。然后它会工作。

这可能需要一个JIRA,因为我相信它已经出现过。

更新:实际上是一个开放的JIRA PHP-1052

答案 1 :(得分:5)

我的系统是centos 6.3。我解决了问题。

vim /etc/php.ini

然后添加

extension=json.so

之前

extension=mongo.so

最后重启php-fpm和nginx(apache)

service php-fpm restart
service ngxin restart

没关系!

答案 2 :(得分:4)

对于正在寻找快速解决方案的人来说,这是我的几行,它利用了Neil对Lunn长期解释的问题。

sudo -i
cd /etc/php5/mods-available/
nano mongo.ini

比插入这个:

; configuration for php mongo module
; priority=30
extension=mongo.so

从编辑出去。

cd ../cli/conf.d
sudo ln -s ../../mods-available/mongo.ini 30-mongo.ini
cd ../../apache2/conf.d
sudo ln -s ../../mods-available/mongo.ini 30-mongo.ini

重启apache。

service apache2 restart

一切都应该有用。

答案 3 :(得分:2)

您需要在mongo扩展名之前加载json扩展名。

不要在php.ini,

中对这两个模块进行任何引用

使用以下内容在/ etc / php5 / mods-enable中创建文件mongo.ini:

priority=30
extension=mongo.so

和json.ini

priority=20
extension=json.so

答案 4 :(得分:0)

对于CentOS,你只需要在php模块目录中添加mongo.ini,就我而言:

"/etc/php.d/"

答案 5 :(得分:0)

对于Ubuntu 14.04,您还可以添加" 30-mongo.ini"符号链接在这些下面:

/etc/php5/cgi/conf.d
/etc/php5/fmp/conf.d