zhuravljov / yii2-queue-monitor

Yii2 Queue Analytics Module
BSD 3-Clause "New" or "Revised" License
102 stars 24 forks source link

PDOException: invalid data source name #26

Open SOHELAHMED7 opened 1 year ago

SOHELAHMED7 commented 1 year ago

What steps will reproduce the problem?

DB is MariaDB

Queue type is DB queue

I have a typical queue job. Its push and exec operation is carried out properly.

When I go to queue job monitor page, I get this error:

PDOException: invalid data source name
invalid data source name
PDOException: invalid data source name in /app/vendor/yiisoft/yii2/di/Container.php:411
Stack trace:
#0 [internal function]: PDO->__construct('', NULL, NULL, NULL)
#1 /app/vendor/yiisoft/yii2/di/Container.php(411): ReflectionClass->newInstanceArgs(Array)
#2 /app/vendor/yiisoft/yii2/di/Container.php(170): yii\di\Container->build('PDO', Array, Array)
#3 /app/vendor/yiisoft/yii2/BaseYii.php(365): yii\di\Container->get('PDO', Array, Array)
#4 /app/vendor/zhuravljov/yii2-queue-monitor/src/records/PushRecord.php(354): yii\BaseYii::createObject(Array)
#5 /app/vendor/zhuravljov/yii2-queue-monitor/src/records/PushRecord.php(352): zhuravljov\yii\queue\monitor\records\PushRecord->unserializeData(Array)
#6 /app/vendor/zhuravljov/yii2-queue-monitor/src/records/PushRecord.php(352): zhuravljov\yii\queue\monitor\records\PushRecord->unserializeData(Array)
#7 /app/vendor/zhuravljov/yii2-queue-monitor/src/records/PushRecord.php(352): zhuravljov\yii\queue\monitor\records\PushRecord->unserializeData(Array)
#8 /app/vendor/zhuravljov/yii2-queue-monitor/src/records/PushRecord.php(352): zhuravljov\yii\queue\monitor\records\PushRecord->unserializeData(Array)
#9 /app/vendor/zhuravljov/yii2-queue-monitor/src/records/PushRecord.php(247): zhuravljov\yii\queue\monitor\records\PushRecord->unserializeData(Array)
#10 /app/vendor/zhuravljov/yii2-queue-monitor/src/views/job/_index-item.php(78): zhuravljov\yii\queue\monitor\records\PushRecord->getJobParams()
#11 /app/vendor/yiisoft/yii2/base/View.php(347): require('/app/vendor/zhu...')
#12 /app/vendor/yiisoft/yii2/base/View.php(257): yii\base\View->renderPhpFile('/app/vendor/zhu...', Array)
#13 /app/vendor/yiisoft/yii2/base/View.php(156): yii\base\View->renderFile('/app/vendor/zhu...', Array, NULL)
#14 /app/vendor/yiisoft/yii2/widgets/ListView.php(191): yii\base\View->render('_index-item', Array)
#15 /app/vendor/yiisoft/yii2/widgets/ListView.php(124): yii\widgets\ListView->renderItem(Object(zhuravljov\yii\queue\monitor\records\PushRecord), 1423, 0)
#16 /app/vendor/yiisoft/yii2/widgets/BaseListView.php(160): yii\widgets\ListView->renderItems()
#17 /app/vendor/yiisoft/yii2/widgets/BaseListView.php(135): yii\widgets\BaseListView->renderSection('{items}')
#18 [internal function]: yii\widgets\BaseListView->yii\widgets\{closure}(Array)
#19 /app/vendor/yiisoft/yii2/widgets/BaseListView.php(138): preg_replace_callback('/{\\w+}/', Object(Closure), '{summary}\n{item...')
#20 /app/vendor/yiisoft/yii2/base/Widget.php(146): yii\widgets\BaseListView->run()
#21 /app/vendor/zhuravljov/yii2-queue-monitor/src/views/job/index.php(34): yii\base\Widget::widget(Array)
#22 /app/vendor/yiisoft/yii2/base/View.php(347): require('/app/vendor/zhu...')
#23 /app/vendor/yiisoft/yii2/base/View.php(257): yii\base\View->renderPhpFile('/app/vendor/zhu...', Array)
#24 /app/vendor/yiisoft/yii2/base/View.php(156): yii\base\View->renderFile('/app/vendor/zhu...', Array, Object(zhuravljov\yii\queue\monitor\controllers\JobController))
#25 /app/vendor/yiisoft/yii2/base/Controller.php(407): yii\base\View->render('index', Array, Object(zhuravljov\yii\queue\monitor\controllers\JobController))
#26 /app/vendor/zhuravljov/yii2-queue-monitor/src/controllers/JobController.php(57): yii\base\Controller->render('index', Array)
#27 [internal function]: zhuravljov\yii\queue\monitor\controllers\JobController->actionIndex()
#28 /app/vendor/yiisoft/yii2/base/InlineAction.php(57): call_user_func_array(Array, Array)
#29 /app/vendor/yiisoft/yii2/base/Controller.php(178): yii\base\InlineAction->runWithParams(Array)
#30 /app/vendor/yiisoft/yii2/base/Module.php(552): yii\base\Controller->runAction('', Array)
#31 /app/vendor/yiisoft/yii2/web/Application.php(103): yii\base\Module->runAction('queue-monitor/j...', Array)
#32 /app/vendor/yiisoft/yii2/base/Application.php(384): yii\web\Application->handleRequest(Object(yii\web\Request))
#33 /app/backend/web/index.php(30): yii\base\Application->run()
#34 {main}

What's expected?

No error. A normal web page showing statuses of queue jobs

What do you get instead?

Above error

Additional info

Q A
Yii version 2.0.45
PHP version 7.4.29
Operating system Ubuntu

yiisoft/yii2-queue: 2.3.4

zhuravljov/yii2-queue-monitor: 0.3.4

SOHELAHMED7 commented 1 year ago

Patch for this



'queue-monitor' => [
            'class' => \zhuravljov\yii\queue\monitor\Module::class,       

            // Issue reported: https://github.com/yiisoft/yii2-queue/issues/458
            'on beforeAction' => function ($event) {
                Yii::$container->setSingletons([\PDO::class => function ($container, $params, $config) {
                    return new \PDO(
                        Yii::$app->db->dsn,
                        Yii::$app->db->username,
                        Yii::$app->db->password,
                        Yii::$app->db->attributes,
                    );
                    }
                ]);
            },
        ],
SOHELAHMED7 commented 1 year ago

More info to reproduce this issue:

I was using https://github.com/mikk150/yii2-queue-mailer to send email in queue.

MailJob has properties:


    /**
     * @var string|array|MessageInterface
     */
    public $message;

It is stored in queue push record table -> job_data (blob) col as

           "message": {
        "=class=": "yii\\swiftmailer\\Message",
        "mailer": {
            "=class=": "mikk150\\queuemailer\\Mailer",
            "mailer": {
                "=class=": "yii\\swiftmailer\\Mailer",
                "messageClass": "yii\\swiftmailer\\Message",
                "enableSwiftMailerLogging": false,
                "htmlLayout": "layouts/html",
                "textLayout": "layouts/text",
                "messageConfig": [],
                "useFileTransport": true,
                "fileTransportPath": "@runtime/mail",
                "fileTransportCallback": null
            },
            "queue": {
                "=class=": "yii\\queue\\db\\Queue",
                "db": {
                    "=class=": "yii\\db\\Connection",
                    "dsn": "mysql:host=ui;dbname=1111",
                    "username": "11",
                    "password": "111",
                    "attributes": null,
                    "pdo": {
                        "=class=": "PDO" <--- no arguments for constructor here
                    },