成功安装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]:
我之所以选择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/pphp5/20121212/mongo.so:未定义的符号:第0行上未知的php_json_encode
我检查了我的/usr/lib/php5/20121212/
,发现实际上有一个文件mongo.so
。我在谷歌上搜索了一下,我能找到的唯一类似的东西是这个,它并不是真正相关的,但由于没有其他选择,我仍然尝试了一些步骤,但没有成功。
有人知道如何解决这个问题吗?
问题在于加载顺序,因此需要在加载mongo.so
之前加载json扩展。
由于其他人可能会遇到这种情况,我将概述整个过程:
- 在
/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 long解释。
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