Laravel Homestead Mongo install causing PHP error

2019-03-20 13:12发布

问题:

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

After installing MongoDB I'm now get this error whenever I run any php command from terminal:

php artisan

php -v

I have searched for 2 days now. I have seen these:

PHP unable to load dynamic library (mongo.so)

https://github.com/mongodb/mongo-php-library/issues/126

and I'm pretty sure any other solution that comes up from google this error. They all seem to be fixes for php5 and ain't working for me.

I have added extension=mongodb.so to ini files.

I have destroyed VM and started fresh 100 times.

I'm running: Vagrant 1.8.5 Laravel Installer version 1.3.3

vagrant@homestead:~$ php -v 

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
7.0.13-1+deb.sury.org~xenial+1 (cli) ( NTS ) Copyright (c) 1997-2016 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.13-1+deb.sury.org~xenial+1, Copyright (c) 1999-2016, by Zend Technologies
    with blackfire v1.14.1~linux-x64-non_zts70, https://blackfire.io, by Blackfireio Inc.

Mongo is installed and running fine:

vagrant@homestead:~$ mongo
MongoDB shell version v3.4.0
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.0
Server has startup warnings: 
2016-12-05T15:32:01.158+0000 I STORAGE  [initandlisten] 
2016-12-05T15:32:01.204+0000 I CONTROL  [initandlisten] 
2016-12-05T15:32:01.204+0000 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2016-12-05T15:32:01.204+0000 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2016-12-05T15:32:01.204+0000 I CONTROL  [initandlisten] 
2016-12-05T15:32:01.204+0000 I CONTROL  [initandlisten] 
2016-12-05T15:32:01.204+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2016-12-05T15:32:01.204+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2016-12-05T15:32:01.204+0000 I CONTROL  [initandlisten] 
2016-12-05T15:32:01.204+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2016-12-05T15:32:01.205+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2016-12-05T15:32:01.205+0000 I CONTROL  [initandlisten] 
> 

But I can't stop this php error for nothing in the world!!!

回答1:

I think the problem is here that mongodb.so depends on json.so. The solution is to load mongodb.so after json.so.

I guess you are using the custom Mongo script for Homestead. The script outputs the mongodb.so module in php.ini file with the result that mongodb.so is loaded first. You should create a mongodb.ini file where mongodb.so is loaded.

Create the .ini-file: /etc/php/7.0/mods-available/mongodb.ini with content:

; configuration for php mongo module
; priority=30
extension=mongodb.so

Give it priority 30, since json gets 20 (in my settings) to be sure it is loaded afterwards.

Create a softlink of the ini-file to /etc/php/7.0/fpm/conf.d to make it available for the webserver.

ln -s /etc/php/7.0/mods-available/mongodb.ini 30-mongodb.ini

Reload webserver and php-fpm.

sudo service [your webserver] restart && sudo service php7.0-fpm restart

You are done! You can config the cli-version the same way



回答2:

I had the same problem, I solved it by reverting to an older PECL mongodb version (1.1.9). There was an update to version 1.2.0 on November 29th, which is why the mongo-php-library also got updated to version 1.1.0.

Here is what I did:

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

The pecl commands will show the same warning, but the installation was successfully completed.

I hope that the mongo-php-library will be fixed soon, so we're not stuck using an older PECL extension.