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