目的
Error: Database connection "Mysql" is missing, or could not be created.
このエラーが 自作シェルを作成中に表示されるようになってしまったので、修正したい。
現状
ローカル環境(local)
- VMWare Fusion
- Ubuntu 14.04 LTS
- cakephp
- nginx
- mysql
本番環境(production)
- さくらのVPS
- Ubuntu 14.04 LTS
- cakephp
- nginx
- mysql
ローカル環境(local)と本番環境(production)で 読み込む database の設定を変えています。
設定は下記のとおりです。
開発しているのはローカル環境のほうです。
自作のシェル(app/Console/Command/MyShell.php)を
Console/cake My myMethod
して回しています。
現状はここまでなのですがエラーメッセージがでてしまいます。
エラーメッセージ
Welcome to CakePHP v2.5.8 Console
---------------------------------------------------------------
App : app
Path: /var/www/local.hoge.com/app/
---------------------------------------------------------------
Error: Database connection "Mysql" is missing, or could not be created.
#0 /var/www/local.hoge.com/lib/Cake/Model/Datasource/DboSource.php(260): Mysql->connect()
#1 /var/www/local.hoge.com/lib/Cake/Model/ConnectionManager.php(105): DboSource->__construct(Array)
#2 /var/www/local.hoge.com/lib/Cake/Model/Model.php(3545): ConnectionManager::getDataSource('production')
#3 /var/www/local.hoge.com/lib/Cake/Model/Model.php(1136): Model->setDataSource('production')
#4 /var/www/local.hoge.com/lib/Cake/Model/Model.php(3572): Model->setSource('app_models')
#5 /var/www/local.hoge.com/lib/Cake/Model/Model.php(1368): Model->getDataSource()
#6 /var/www/local.hoge.com/lib/Cake/Model/Model.php(1552): Model->schema()
#7 /var/www/local.hoge.com/app/Console/Command/GetAccessLogShell.php(44): Model->create()
#8 /var/www/local.hoge.com/lib/Cake/Console/Shell.php(437): GetAccessLogShell->crawl()
#9 /var/www/local.hoge.com/lib/Cake/Console/ShellDispatcher.php(209): Shell->runCommand('crawl', Array)
#10 /var/www/local.hoge.com/lib/Cake/Console/ShellDispatcher.php(66): ShellDispatcher->dispatch()
#11 /var/www/local.hoge.com/app/Console/cake.php(47): ShellDispatcher::run(Array)
#12 {main}
app/Config/database.php
class DATABASE_CONFIG {
public $local = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => '127.0.0.1',
'login' => 'user',
'password' => 'pass',
'database' => 'local_hoge_com',
'prefix' => '',
'encoding' => 'utf8',
);
public $production = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => '127.0.0.1',
'login' => 'user',
'password' => 'pass',
'database' => 'hoge_com',
'prefix' => '',
'encoding' => 'utf8',
);
}
/etc/nginx/sites-available/local.hoge.com.conf
server {
~
### 省略
~
location ~ \.php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_param CAKE_ENV 'Local';
}
}
~
app/Model/AppModel.php
class AppModel extends Model {
public function __construct($id = false, $table = null, $ds = null) {
parent::__construct();
if (getenv('CAKE_ENV') == 'Local') {
$this->useDbConfig = 'local';
} else {
$this->useDbConfig = 'production';
}
}
}
var_dump(getenv('CAKE_ENV’));
をすると
Local
が返ってきます。
app/Console/Command/MyShell.php
<?php
class MyShell extends AppShell {
public $uses = array('Table');
function myMethod() {
PDO で Database 接続のチェック
app/Console/Command/MyShell.php
内に
function myMethod() {
$dsn = 'mysql:dbname=local_hoge_com;host=127.0.0.1';
$user = 'user';
$pass = 'pass';
try {
$dbh = new PDO($dsn, $user, $pass);
if ($dbh == null) {
echo '接続に失敗しました';
} else {
echo '接続成功!';
}
} catch(PDOException $e) {
var_dump($e->getMessage());
throw new MissingConnectionException(array(
'class' => get_class($this),
'message' => $e->getMessage()
));
}
}
として「接続成功!」はこのシェルを回した時に表示されます。
何か根本的におかしい設定をしているのかもしれません。
ご回答お待ちしております。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
Localなのにエラーメッセージではproductionとなっていますが、この点はいかがでしょうか?
#3 ...(省略)...: Model->setDataSource('production')
#3 ...(省略)...: Model->setDataSource('production')
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.10%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2015/08/10 04:35
今回やっていたことでは nginx を経由しておらず、database の設定が適切に読み込まれておりませんでした。
シェルを実行する際に
$ CAKE_ENV=Local Console/cake My myMethod
と 環境変数を指定することで実行可能になりました。
ありがとうございます。