Я хотел бы поставить в очередь следующую инструкцию pdo для создания базы данных, подобной этой:
Queue::push(function($job, $dbname){
$dbh = new PDO("mysql:host=".getenv('DB_HOST'), getenv('DB_USERNAME'), getenv('DB_PASSWORD'));
$dbh->exec("CREATE DATABASE `$dbname` CHARACTER SET=utf8 COLLATE=utf8_unicode_ci;
GRANT ALL ON `$dbname`.* TO 'xxx'@'%';
FLUSH PRIVILEGES;");
unset($dbh);
Log::useFiles(storage_path().'/logs/databasecreated');
Log::info('database created: '.$dbname);
$job->delete();
});
Но это бросает
«Отсутствует аргумент 2 для Jeremeamia \ SuperClosure \ SerializableClosure :: {closure} ()
при попытке запустить php artisan queue: work
$dbname
устанавливается как
$dbname = $this->getDbName();
и весь код находится в функции класса.
Я также пытался использовать $this->getDbName()
а также $this->dbName
непосредственно в закрытии, но это, естественно, не сработало.
Разве нельзя запускать такие команды в очереди?
Попробуйте передать переменную с use
заявление:
Queue::push(function($job) use ($dbname){
$dbh = new PDO("mysql:host=".getenv('DB_HOST'), getenv('DB_USERNAME'), getenv('DB_PASSWORD'));
$dbh->exec("CREATE DATABASE `$dbname` CHARACTER SET=utf8 COLLATE=utf8_unicode_ci;
GRANT ALL ON `$dbname`.* TO 'xxx'@'%';
FLUSH PRIVILEGES;");
unset($dbh);
Log::useFiles(storage_path().'/logs/databasecreated');
Log::info('database created: '.$dbname);
$job->delete();
});
Других решений пока нет …