Mongo.so:> undefined symbol: php_json_encode в Unknown on line 0. После установки mongo драйвер для php

После успешной установки Mongo 2.6.0 я попытался обновить драйвер php mongo на ubuntu 12.04 с помощью следующей команды: 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 не установлен. С другой стороны, я могу ясно видеть extension=mongo.so в моем php.ini.

Я проверил свой error.log, и я вижу следующую строку:

PHP Предупреждение: запуск PHP: невозможно загрузить динамическую библиотеку '/usr/lib/php5/20121212/mongo.so' -/usr/lib/php5/20121212/mongo.so: undefined символ: php_json_encode в Unknown on line 0

Я проверил свой /usr/lib/php5/20121212/ и увидел, что на самом деле есть файл mongo.so. Я искал его, и единственное, что мне удалось найти, это this, что не очень актуально, но без других вариантов я все еще пробовал шаги там без успеха.

Есть ли у кого-нибудь идея, как это исправить?

Ответ 1

Проблема связана с порядком загрузки, поэтому расширение json необходимо загрузить до загрузки mongo.so.

Поскольку другие могут столкнуться с этим, я опишу весь процесс:

  • В вашем каталоге /etc/php/mods-available (или в зависимости от платформы) создайте отдельный mongo.ini со следующим:
; configuration for php mongo module
; priority=30
extension=mongo.so
  • Удалите любые другие ссылки на mongo.so из других файлов, таких как php.ini

  • Создайте символические ссылки в каждом из каталогов 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".

Но в основном удалите mongo.so из "php.ini" и поместите его в собственный файл с более высоким порядком загрузки, чем расширение json. Тогда это сработает.

Это, возможно, нуждается в JIRA, поскольку я полагаю, что это произошло раньше.

ОБНОВЛЕНИЕ: На самом деле это открытая JIRA PHP-1052

Ответ 2

моя система - centos 6.3. Я решил проблему.

vim /etc/php.ini

затем добавьте

extension=json.so

до

extension=mongo.so

наконец перезапустите php-fpm и nginx (apache)

service php-fpm restart
service ngxin restart

Это нормально!

Ответ 3

Для тех, кто ищет быстрое решение, вот мои несколько строк, в которых долгое объяснение Нейла Лунна о проблеме.

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

Все должно работать.

Ответ 4

Вам нужно загрузить расширение json перед расширением mongo.

Не указывайте ссылки на оба модуля в php.ini,

Создайте файл mongo.ini внутри /etc/php 5/mods-enable со следующим содержимым:

priority=30
extension=mongo.so

и json.ini

priority=20
extension=json.so

Ответ 5

Для CentOS вам просто нужно добавить mongo.ini в каталог php-модуля, в моем случае:

"/etc/php.d/"

Ответ 6

Для Ubuntu 14.04 вы также можете добавить символическую ссылку "30-mongo.ini":

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