MongoDB Connect Issue jenssegers/laravel-mongodb - mongodb

I'm using jenssegers/laravel-mongodb MongoDB Jenssegers
I'm running into an issue where I can't seem to connect using the framework, but using a simple test script, I can connect fine.
The simple connection script I wrote:
<?php
$manager = new MongoDB\Driver\Manager("mongodb://user:password#cluster0-shard-00-00-reodz.mongodb.net:27017,cluster0-shard-00-01-reodz.mongodb.net:27017,cluster0-shard-00-02-reodz.mongodb.net:27017/test?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin");//ssl=true
$command = new \MongoDB\Driver\Command(["ping" => 1]);
$cursor = $manager->executeCommand("admin", $command);
$reply = $cursor->toArray()[0];
var_dump($reply);
When I run that, I get
["ok"]=> int(1)
Which is what I expect and is all good. I setup my config/database.php file with the same connection string, this is my config/database.php file:
return [
'default' => env('DB_CONNECTION','mongodb'),
'connections' => [
'mongodb' => [
'driver' => 'mongodb',
'dsn' => env('DB_DSN','mongodb://user:password#cluster0-shard-00-00-reodz.mongodb.net:27017,cluster0-shard-00-01-reodz.mongodb.net:27017,cluster0-shard-00-02-reodz.mongodb.net:27017/test?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin'),
'database' => env('DB_DATABASE'),
]
]
];
The .env file:
APP_ENV=local
APP_DEBUG=true
APP_KEY=
APP_TIMEZONE=UTC
#DB_CONNECTION=mongodb
#DB_HOST="cluster0-shard-00-00-reodz.mongodb.net"
#DB_PORT=27017
DB_DATABASE="test"
#DB_USERNAME="user"
#DB_PASSWORD="password"
CACHE_DRIVER=file
QUEUE_DRIVER=sync
When I access a route that I've associated with MongoDB, I'm getting:
(1/1) ConnectionTimeoutException
No suitable servers found (serverSelectionTryOnce set): [Failed to resolve 'user:password#cluster0-shard-00-00-reodz.mongodb.net:27017,cluster0-shard-00-01-reodz.mongodb.net:27017,cluster0-shard-00-02-reodz.mongodb.net:27017/test?ssl=true&replicaset=cluster0-shard-0&authsource=admin']
I would assume the problem is localized to my database.php file or my .env file, does anyone see an error? If the test.php can connect and return the ping, shouldn't Lumen be good to go?
Thanks
D

Related

PHP Warning in Typo3DatabaseBackend line 158 after updating DDEV to 1.19

After updating DDEV to 1.19 I get following error after backend login in TYPO3 11.5.8:
PHP Warning: gzuncompress(): need dictionary in
/var/www/html/public/typo3/sysext/core/Classes/Cache/Backend/Typo3DatabaseBackend.php
line 158
I already tried a lot of things:
I have tried all officially PHP versions which are possible with DDEV.
I have downgraded doctrine/dbal 2.13.8, 2.13.7, 2.13.6, ...
I have downgraded MariaDB 10.3 to 10.2
Nothing works. So it needs a deeper view of the problem:
In Typo3DatabaseBackend.php at line 158 I have added
$tmp = gzuncompress($data);
With help of xdebug I can see that uncompress works without any problems. So, IMO it can't be a zlib problem.
As next step I have converted the compressed $data with bin2hex($data) into $tmp and in my database I have tried to HEX the value, too:
SELECT uid, CONVERT(content USING utf8) FROM cache_rootline WHERE uid = 1;
Interesting point:
Before: 789c4d904172c3200
In DB: 0x783f4d3f41723f200
Select: 783f4d3f41723f200
Nearly each 2nd byte is correct, but the other bytes are totally wrong.
I have exported my MariaDB data and switched to MySQL 8.0 and imported the data again. Because of some utf8mb4_unicode_ci incompatibilities I have recreated all cache tables with help of Installtool of TYPO3.
After login to TYPO3 backend I got following error:
General error: 3988 Conversion from collation utf8_general_ci into utf8mb4_unicode_ci impossible
I have searched full TYPO3 project, but I can't find utf8_general_ci anywhere.
Do you have any idea, what could be wrong?
Thank you for your help.
Stefan
On new DDEV project four LocalConfiguration looks something like that:
'DB' => [
'Connections' => [
'Default' => [
'charset' => 'utf8',
'driver' => 'mysqli',
],
],
],
and DDEV creates following to your AdditionalConfiguration.php
'DB' => [
'Connections' => [
'Default' => [
'dbname' => 'db',
'driver' => 'pdo_mysql',
'host' => 'db',
'password' => 'db',
'port' => '3306',
'user' => 'db',
],
],
],
Maybe you have added following to your configuration to create new tables with a specific collation:
'DB' => [
'Connections' => [
'Default' => [
...
'tableoptions' => [
'charset' => 'utf8mb4',
'collate' => 'utf8mb4_general_ci',
],
],
],
],
Do you see the problem? The charset option of LocalConfiguration.php was NOT overwritten in your AdditionalConfiguration. So, you have a charset miss-match in your configuration. Please keep them in sync.
Either set collation back to utf8_unicode_ci or add:
'charset' => 'utf8mb4',
in AdditionalConfiguration.php
Have fun with TYPO3
Stefan
For me the easiest way was to replace the pdo_mysql driver with mysqli.
Because I'm only using MariaDB and my database was utf8_general_ci encoded, this was the easiest fix/help.

MongoDB with Laravel 8 Authentication Failed upon php artisan migrate

I Installed mongoDB in my laravel 8 project for first time, to explore mongoDB functionalities
When I run php artisan migrate I got:
MongoDB\Driver\Exception\AuthenticationException
Authentication failed.
at D:\xampp\htdocs\Mongo\mongonews\vendor\mongodb\mongodb\src\Command\ListCollections.php:115
my : D:\xampp\htdocs\Mongo\mongonews\config\database.php I set the following:
'mongodb' => [
'driver' => 'mongodb',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', 27017),
'database' => env('DB_DATABASE'),
'username' => env('DB_USERNAME'),
'password' => env('DB_PASSWORD'),
'options' => [
// here you can pass more settings to the Mongo Driver Manager
// see https://www.php.net/manual/en/mongodb-driver-manager.construct.php under "Uri Options" for a list of complete parameters that you can use
'database' => env('DB_AUTHENTICATION_DATABASE', 'admin'), // required with Mongo 3+
],
],
And this is my .env:
DB_HOST=127.0.0.1
DB_PORT=27017
DB_DATABASE=mongonews
DB_USERNAME=root
DB_PASSWORD=
Thanks Geaks, appreciate your help to start my first time mongo db based laravel app
All the best.
It was solved by removing username from DB_USERNAME
although It is supposed to be "root" in my case!!!!
DB_CONNECTION=mongodb
DB_HOST=127.0.0.1
DB_PORT=27017
DB_DATABASE=news
DB_USERNAME=
DB_PASSWORD=
Hope this helps who ever faced this problem.

How to Read from Mongodb secondary server using Yii2

I am facing an issue in yiisoft/ yii2-mongodb extension I am using three mongodb servers one primary and two secondaries but i am getting an error as below while fetching data from secondary servers.
The server gives below error
“name”: “MongoDB Exception”,
“message”: “not master”,
“code”: 10107,
“type”: “yii\mongodb\Exception
my connection is as below
‘components’ => [
‘mongodb’ => [
‘class’ => ‘\yii\mongodb\Connection’,
‘dsn’ => ‘mongodb://xxx:27017,xxx:27017,xxx:27017/?replicaSet=p&connectTimeoutMS=480000&socketTimeoutMS=520000&readPreference=secondary’,
],
]
Try to add options to your config like this:
'mongodb' => [
'class' => '\yii\mongodb\Connection',
'dsn' => 'mongodb://xxx:27017,xxx:27017,xxx:27017/?replicaSet=p&connectTimeoutMS=480000&socketTimeoutMS=520000&readPreference=secondary',
'options' => [
'replicaSet' => 'p'
]
]
Furthermore, you can add connection options like connectTimeoutMS directly in options array

dotenv-connector within TYPO3 CMS

I try to use helhum/dotenv-connector in my TYPO3 Project.
I have done the following:
my composer.json:
{
"require": {
"typo3/cms": "^8.5",
"helhum/dotenv-connector": "1.0.0",
"helhum/typo3-console": "^4.1"
},
"extra": {
"helhum/typo3-console": {
"install-extension-dummy": false
},
"typo3/cms": {
"cms-package-dir": "{$vendor-dir}/typo3/cms",
"web-dir": "web"
},
"helhum/dotenv-connector": {
"env-dir": "",
"allow-overrides": true,
"cache-dir": "var/cache"
}
}
}
Then I ran
composer install
After that I setup the TYPO3 using the command
php vendor/bin/typo3cms install:setup
This should be similar with doing the install the "normal" way.
After that, i placed a .env next to my composer.json
This .env contains the following:
TYPO3_CONTEXT="Development"
TYPO3__DB__database="dotenvconnector"
TYPO3__DB__host="127.0.0.1"
TYPO3__DB__password="root"
TYPO3__DB__port="3306"
TYPO3__DB__username="root"
Then i removed all informations about the DB from web/typo3conf/LocalConfiguration.php using the typo3_console-command
php vendor/bin/typo3cms configuration:remove DB
I then ran composer install and composer update again.
When calling the TYPO3 in the browser now, it keeps telling me
The requested database connection named "Default" has not been configured.
So what am i missing? Obviously my .env is not parsed or used at all.
FYI: Cachefile is written in var/cache with the following content:
<?php
putenv('TYPO3__DB__database=dotenvconnector');
$_ENV['TYPO3__DB__database'] = 'dotenvconnector';
$_SERVER['TYPO3__DB__database'] = 'dotenvconnector';
putenv('TYPO3__DB__host=localhost');
$_ENV['TYPO3__DB__host'] = 'localhost';
$_SERVER['TYPO3__DB__host'] = 'localhost';
putenv('TYPO3__DB__password=root');
$_ENV['TYPO3__DB__password'] = 'root';
$_SERVER['TYPO3__DB__password'] = 'root';
putenv('TYPO3__DB__port=3306');
$_ENV['TYPO3__DB__port'] = '3306';
$_SERVER['TYPO3__DB__port'] = '3306';
putenv('TYPO3__DB__username=root');
$_ENV['TYPO3__DB__username'] = 'root';
$_SERVER['TYPO3__DB__username'] = 'root';
Our setups work like this:
AdditionalConfiguration.php
$loader = new Dotenv\Dotenv(__DIR__ . '/../../', '.env.defaults');
$loader->load();
$loader = new Dotenv\Dotenv(__DIR__ . '/../../');
$loader->overload();
Interesting to see here that we run with a .env.defaults file that holds the standard config (no users or passwords of course) which we then overload with the custom .env file per user/environment.
This helps a lot when adding new functionality which requires a new .env configuration so other people on the team don't run into Fatals or Exceptions.
$GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['dbname'] = getenv('TYPO3_DB_NAME');
$GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['host'] = getenv('TYPO3_DB_HOST');
$GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['password'] = getenv('TYPO3_DB_PASSWORD');
$GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['user'] = getenv('TYPO3_DB_USER');
LocalConfiguration.php
return [
'BE' => [
'debug' => '<set by dotenv>',
'explicitADmode' => 'explicitAllow',
'installToolPassword' => '<set by dotenv>',
'loginSecurityLevel' => 'rsa',
'sessionTimeout' => '<set by dotenv>',
],
'DB' => [
'Connections' => [
'Default' => [
'charset' => 'utf8',
'dbname' => '<set by dotenv>',
'driver' => 'mysqli',
'host' => '<set by dotenv>',
'password' => '<set by dotenv>',
'port' => 3306,
'user' => '<set by dotenv>',
],
],
]...
I didn't paste the entire config but I think you get the point.
The dotenv-connector reads the .env file into the environment, but does not assign any values to TYPO3 configuration variables. You should be able to read them with getenv in your php code.
The connector is not specifically geared towards TYPO3, but is a general tool for any composer based php application. Therefore it would be out of the scope of the project, to know about the TYPO3 specific variable assignments.
There is another project, the configuration loader, that can help to assign environment variables to TYPO3 configuration variables.
.env -dotenv-connector-> environment -configuration-loader-> $GLOBALS['TYPO3_CONF_VARS']
The configuration loader can be found at https://github.com/helhum/config-loader . And an example of it all wired together in https://github.com/helhum/TYPO3-Distribution .
You don't have to use the configuration loader. You could also assign the values manually with getenv().
One important note with PHP 7.2 (on TYPO3 v9) and the usage of argon hash:
You must use single quotes / ticks for the values in the .env file.
Example:
Instead of my_value="foobar"
write my_value='foobar'

can't make code generator with PostgreSQL

i have a problem in using code generator with PostgreSQL database, i've make configuration in main.php..
...
'modules'=>array(
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'123wasis85',
'ipFilters'=>array('127.0.0.1','::1'),
),
),
...
'db'=>array(
'connectionString' => 'pgsql:host=127.0.0.1;port=5432;dbname=yii_first',
'emulatePrepare' => true,
'username' => 'postgres',
'password' => 'anghauz',
'charset' => 'utf8',
),
...
but it still making error result when i used crud generation, this is the error..:
...
CDbConnection failed to open the DB connection: could not find driver
C:\BitNami\apache2\htdocs\yii\framework\gii\generators\crud\CrudCode.php(44)
...
i make it in localhost n using bitnami..
please help me guys for the solutions..
Please go to php.ini file in the installed php folder. Uncomment the below lines.
extension=php_pdo_pgsql.dll
extension=php_pgsql.dll
It worked for me.