После установки 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()
сказал мне, что монго не установлено. С другой стороны, я могу ясно видеть extension=mongo.so
в моем php.ini.
Я проверил свой error.log, и я вижу следующую строку:
PHP Предупреждение: запуск PHP: невозможно загрузить динамическую библиотеку '/usr/lib/php5/20121212/mongo.so' – /usr/lib/php5/20121212/mongo.so: undefined symbol: php_json_encode в Unknown on line 0
Я проверил /usr/lib/php5/20121212/
и увидел, что на самом деле есть файл mongo.so
. Я искал его, и единственное, что я смог найти, это то , что не имеет особого значения, но без каких-либо других вариантов я все еще пробовал шаги там без успеха.
У кого-нибудь есть идея, как это исправить?
Проблема mongo.so
с порядком загрузки, поэтому расширение 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, поскольку я считаю, что это произошло раньше.
UPDATE : На самом деле это открытый 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
Все нормально!
Для тех, кто ищет быстрое решение, вот мои несколько строк, в которых долгое объяснение Нейла Лунна о проблеме.
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
Все должно работать.
Вам нужно загрузить расширение json перед расширением mongo.
Не указывайте ссылки на оба модуля в php.ini,
Создайте файл mongo.ini внутри / etc / php5 / mods-enable со следующим содержимым:
priority=30 extension=mongo.so
и json.ini
priority=20 extension=json.so
Для CentOS вам просто нужно добавить mongo.ini в каталог php-модуля, в моем случае:
"/etc/php.d/"
Для Ubuntu 14.04 вы также можете добавить символическую ссылку «30-mongo.ini»:
/etc/php5/cgi/conf.d /etc/php5/fmp/conf.d