質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.97%

CakePHP で データベース接続エラーが表示されます。Database connection "Mysql" is missing, or could not be created.

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 6,952

hogetail

score 43

 目的


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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

Localなのにエラーメッセージではproductionとなっていますが、この点はいかがでしょうか?
#3  ...(省略)...: Model->setDataSource('production')

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/10 04:35

    ご回答ありがとうございます。

    今回やっていたことでは nginx を経由しておらず、database の設定が適切に読み込まれておりませんでした。

    シェルを実行する際に
    $ CAKE_ENV=Local Console/cake My myMethod
    と 環境変数を指定することで実行可能になりました。

    ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • MySQLに関する質問
  • CakePHP で データベース接続エラーが表示されます。Database connection "Mysql" is missing, or could not be created.