php - mongo.so : > undefined symbol: php_json_encode in Unknown on line 0. 为php安装mongo驱动后

标签 php mongodb ubuntu

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 Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php5/20121212/mongo.so' - /usr/lib/php5/20121212/mongo.so: undefined symbol: php_json_encode in Unknown on line 0

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

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

最佳答案

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

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

  • 在您的 /etc/php/mods-available 目录(或根据平台)创建一个单独的 mongo.ini,其中包含以下内容:
; configuration for php mongo module
; priority=30
extension=mongo.so
  • php.ini

  • 等其他文件中删除对 mongo.so 的任何其他引用
  • 根据需要在每个 cliapache2 目录中创建符号链接(symbolic link)以供使用:

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

关于php - mongo.so : > undefined symbol: php_json_encode in Unknown on line 0. 为php安装mongo驱动后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22952994/

相关文章:

ubuntu - 用于动态创建虚拟网络接口(interface)的 Bash 脚本

python - pandas在ubuntu上安装错误代码1 in/tmp/pip-build-FM0q5o/pandas/

node.js - 找不到用户 : Could not find user nodejs@sDatabase

php - 如何同时运行两个php文件?一个在背景中,另一个在前景中

php - Laravel 中的 Bootstrap 模态验证

php - 模板和我的文件差异

node.js - 如何在 MongoDB 中创建动态查询?

mongodb - 查询以返回展平的嵌入字段

php - 选择查询返回一条匹配记录

c# - MongoDb 的 C# 驱动程序,是否可以将其包装在通用 session 中?