PHP 7:MongoDB 驱动程序问题

Posted

技术标签:

【中文标题】PHP 7:MongoDB 驱动程序问题【英文标题】:PHP 7: MongoDB Driver issue 【发布时间】:2017-04-24 09:39:42 【问题描述】:

我在尝试安装 MongoDB php 库时遇到了错误:

$ composer require "mongodb/mongodb=^1.0.0"

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/20151012/mongodb.so' - /usr/lib/php/20151012/mongodb.so: undefined symbol: php_json_serializable_ce in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/20151012/mongodb.so' - /usr/lib/php/20151012/mongodb.so: undefined symbol: php_json_serializable_ce in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/20151012/mongodb.so' - /usr/lib/php/20151012/mongodb.so: undefined symbol: php_json_serializable_ce in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/20151012/mongodb.so' - /usr/lib/php/20151012/mongodb.so: undefined symbol: php_json_serializable_ce in Unknown on line 0

当我执行phpinfo() 时,我可以看到以下内容:

mongodb

mongodb support enabled
mongodb version 1.2.1
mongodb stability   stable
libmongoc version   1.5.0
libbson version 1.5.0

当我执行 locate mongodb.so 时,这是我的 mongodb.so 文件所在的位置:

/usr/lib/php/20151012/mongodb.so

我注意到,这是20-mongodb.ini 文件所在的路径:

/etc/php/7.0/apache2/conf.d

另外,sudo pecl mongodb install 返回以下内容:

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/20151012/mongodb.so' - /usr/lib/php/20151012/mongodb.so: undefined symbol: php_json_serializable_ce in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/20151012/mongodb.so' - /usr/lib/php/20151012/mongodb.so: undefined symbol: php_json_serializable_ce in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/20151012/mongodb.so' - /usr/lib/php/20151012/mongodb.so: undefined symbol: php_json_serializable_ce in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/20151012/mongodb.so' - /usr/lib/php/20151012/mongodb.so: undefined symbol: php_json_serializable_ce in Unknown on line 0

sudo pecl info mongodb 返回:

About pecl.php.net/mongodb-1.2.1
================================
Release Type          PECL-style PHP extension (source code)
Name                  mongodb
Channel               pecl.php.net
Summary               MongoDB driver for PHP
Description           The purpose of this driver is to provide
                      exceptionally thin glue between MongoDB
                      and PHP, implementing only fundemental and
                      performance-critical components
                      necessary to build a fully-functional MongoDB
                      driver.
Maintainers           Hannes Magnusson <bjori@php.net> (lead)
                      Jeremy Mikola <jmikola@php.net> (lead)
                      Derick Rethans <derick@php.net> (lead)
Release Date          2016-12-07 18:25:03
Release Version       1.2.1 (stable)
API Version           1.2.1 (stable)
License               Apache License
                      (http://www.apache.org/licenses/LICENSE-2.0)
Release Notes         ** Bug
                          * [PHPC-848] - Fix BSON encoding of
                      immutable arrays and documents with circular
                      references
Required Dependencies PHP version 5.4.0-7.99.99
                      PEAR installer version 1.4.8 or newer
package.xml version   2.0
Last Modified         2016-12-09 00:28
Previous Installed    1.2.0
Version

我在 Google 上搜索了几个小时,但仍然一无所获。谢谢。

【问题讨论】:

【参考方案1】:

首先键入此命令/usr/bin/php-config 以查看扩展目录的位置。 你会看到类似--extension-dir [/usr/lib/php/20131226] 比那个文件夹中的ls 看看mongo.so 是否在那里,如果没有把它放在那里。 键入whereis php 以在CLI 中找到您正在使用的php 编辑 CLI 的 php.ini 并添加 extension=mongo.so

【讨论】:

感谢您的回答。我的扩展目录在这里:/usr/lib/php/20151012mongodb.so 在那里(不是mongo.so,因为它已被弃用)。无论如何,这里是加载的配置文件:/etc/php/7.0/apache2/php.ini 以及以下目录中的附加 ini 文件 /etc/php/7.0/apache2/conf.d 其中20-mongodb.ini 文件是。 嗨,您必须在/etc/php/7.0/cli/php.ini 中添加extension=mongodb.so,它应该可以工作。 谢谢。我整天都在解决这个问题,但仍然没有。当我输入 php --ini 时,我只是收到以下错误:PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/20151012/mongodb.so' - /usr/lib/php/20151012/mongodb.so: undefined symbol: php_json_serializable_ce in Unknown on line 0 无论如何,这可能是一个解决方案:derickrethans.nl/undefined-symbol.html 但仍然没有。 我认为这是一个不同的错误,你可以参考here【参考方案2】:

使用1.1.9 mongodb版本:

sudo pecl uninstall mongodb
sudo pecl install mongodb-1.1.9
composer update

【讨论】:

【参考方案3】:

是的,有很好的答案。 这是我在 php7.1 中安装 mongo 所做的。我正在使用 ubuntu16.04 64bit:

sudo aptitude install -y php7.1-dev pkg-config
sudo -H pecl channel-update pecl.php.net
sudo aptitude install -y libcurl4-openssl-dev pkg-config libssl-dev libsslcommon2-dev
sudo pecl install mongodb
echo 'extension=mongodb.so' | sudo tee /etc/php/7.1/fpm/conf.d/30-mongodb.ini
echo 'extension=mongodb.so' | sudo tee /etc/php/7.1/cli/conf.d/30-mongodb.ini
sudo systemctl restart php7.1-fpm.service

这一切都是为了 nginx。如果您使用的是apache,请添加:

echo 'extension=mongodb.so' | sudo tee /etc/php/7.1/apache2/conf.d/30-mongodb.ini

还有一个。如果您在使用 mongo 时仍然出现错误。类似的东西:

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/20160303/mongodb.so' - libssl.so.1.0.2: cannot open shared object file: No such file or directory in Unknown on line 0

不要绝望,运行以下命令:

sudo pecl uninstall mongodb
sudo pecl install mongodb

【讨论】:

【参考方案4】:

我是 @Andrinux 和 @J.C. Gras 的建议,我收到了一个错误 phpize not found

所以我做了研究,发现了这个How to install and run phpize。这是因为我的系统上没有安装php-dev,所以我安装了它。

按顺序,我做到了:

// Ubuntu 20.04.3
$ sudo apt-get update
$ sudo apt install php-dev
$ sudo pecl install mongodb (at the time, it installed mongodb-1.10.0)

如果您看到此消息,则扩展程序已成功安装

Build complete.
Don't forget to run 'make test'.

running: make INSTALL_ROOT="/tmp/pear/temp/pear-build-rootDvmP4U/install-mongodb-1.10.0" install
Installing shared extensions:     /tmp/pear/temp/pear-build-rootDvmP4U/install-mongodb-1.10.0/usr/lib/php/20200930/
running: find "/tmp/pear/temp/pear-build-rootDvmP4U/install-mongodb-1.10.0" | xargs ls -dils
52067    4 drwxr-xr-x 3 root root    4096 Sep 28 16:18 /tmp/pear/temp/pear-build-rootDvmP4U/install-mongodb-1.10.0
52629    4 drwxr-xr-x 3 root root    4096 Sep 28 16:18 /tmp/pear/temp/pear-build-rootDvmP4U/install-mongodb-1.10.0/usr
52630    4 drwxr-xr-x 3 root root    4096 Sep 28 16:18 /tmp/pear/temp/pear-build-rootDvmP4U/install-mongodb-1.10.0/usr/lib
52631    4 drwxr-xr-x 3 root root    4096 Sep 28 16:18 /tmp/pear/temp/pear-build-rootDvmP4U/install-mongodb-1.10.0/usr/lib/php
52632    4 drwxr-xr-x 2 root root    4096 Sep 28 16:18 /tmp/pear/temp/pear-build-rootDvmP4U/install-mongodb-1.10.0/usr/lib/php/20200930
52627 8708 -rwxr-xr-x 1 root root 8916120 Sep 28 16:18 /tmp/pear/temp/pear-build-rootDvmP4U/install-mongodb-1.10.0/usr/lib/php/20200930/mongodb.so

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

别忘了重启 PHP-FPM 和 APACHE 服务器

【讨论】:

以上是关于PHP 7:MongoDB 驱动程序问题的主要内容,如果未能解决你的问题,请参考以下文章

text 用于PHP的PHP 7.1 + nginx + MongoDB驱动程序

xampp 和 mongoDB:无法识别 mongo 驱动程序

centos7下配置nginx的mongodb驱动问题

将mongodb扩展添加到PHP-7.1.9 XAMPP Ubuntu

核心警告:模块'mongodb'已经加载

PHP 没有与 mongoDB 连接