在安装成功的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
任何其他引用
根据需要在每个cli
和apache2
目录中创建符号链接,如下所示:
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