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

在安装成功的Mongo 2.6.0之后,我尝试使用以下命令在ubuntu 12.04上升级php mongo驱动程序: 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]: 

我在哪里select了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启动:无法加载dynamic库'/usr/lib/php5/20121212/mongo.so' – /usr/lib/php5/20121212/mongo.so:未定义的符号:php_json_encode在未知的行0

我检查了我的/usr/lib/php5/20121212/并看到实际上有一个文件mongo.so 。 我GOOGLE了,唯一类似的东西,我能find的是,这是不相关的,但没有其他的select,我仍然尝试在那里没有成功的步骤。

有没有人有一个想法如何解决这个问题?

问题是加载顺序,所以json扩展需要加载之前加载mongo.so

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

  • 在你的/etc/php/mods-available目录下(或者适合平台)用下面的方法创建一个单独的mongo.ini
 ; configuration for php mongo module ; priority=30 extension=mongo.so 
  • 从其他文件(如php.ini删除对mongo.so任何其他引用

  • 根据需要在每个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 

这可以确保“json”扩展将在“mongo”模块之前由动态加载器加载。

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

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

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

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

 vim /etc/php.ini 

然后加

 extension=json.so 

之前

 extension=mongo.so 

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

 service php-fpm restart service ngxin restart 

没关系!

对于那些正在寻求快速解决方案的人来说,这里有几条线路,它们利用了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 

一切都应该工作。

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

不要在php.ini中提及这两个模块,

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

 priority=30 extension=mongo.so 

和json.ini

 priority=20 extension=json.so 

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

 "/etc/php.d/" 

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

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