前提・実現したいこと
ターミナルからcakeのShellを起動し、中でDBアクセスし処理を行いたい。
↓ここでやっていることがエラーとなる
シェルの中でのモデルの使用
発生している問題・エラーメッセージ
ターミナルからcake [クラス名]のコマンドで起動した際、
呼ばれた処理の中のDBアクセスを行っている箇所で接続エラーが発生する。
Exception: SQLSTATE[HY000] [2002] No such file or directory in [/Applications/XAMPP/xamppfiles/htdocs/tweetAnalysis/vendor/cakephp/cakephp/src/Database/Driver/PDODriverTrait.php, line 54]
2017-09-10 15:35:46 Error: [PDOException] SQLSTATE[HY000] [2002] No such file or directory in /Applications/XAMPP/xamppfiles/htdocs/tweetAnalysis/vendor/cakephp/cakephp/src/Database/Driver/PDODriverTrait.php on line 54
Stack Trace:
#0 /Applications/XAMPP/xamppfiles/htdocs/tweetAnalysis/vendor/cakephp/cakephp/src/Database/Driver/PDODriverTrait.php(54): PDO->__construct('mysql:host=loca...', 'root', 'xxxxxxxxxxxxx...', Array)
#1 /Applications/XAMPP/xamppfiles/htdocs/tweetAnalysis/vendor/cakephp/cakephp/src/Database/Driver/Mysql.php(104): Cake\Database\Driver\Mysql->_connect('mysql:host=loca...', Array)
#2 /Applications/XAMPP/xamppfiles/htdocs/tweetAnalysis/vendor/cakephp/cakephp/src/Database/Schema/BaseSchema.php(45): Cake\Database\Driver\Mysql->connect()
#3 /Applications/XAMPP/xamppfiles/htdocs/tweetAnalysis/vendor/cakephp/cakephp/src/Database/Dialect/MysqlDialectTrait.php(63): Cake\Database\Schema\BaseSchema->__construct(Object(Cake\Database\Driver\Mysql))
#4 /Applications/XAMPP/xamppfiles/htdocs/tweetAnalysis/vendor/cakephp/cakephp/src/Database/Schema/Collection.php(52): Cake\Database\Driver\Mysql->schemaDialect()
#5 /Applications/XAMPP/xamppfiles/htdocs/tweetAnalysis/vendor/cakephp/cakephp/src/Database/Schema/CachedCollection.php(42): Cake\Database\Schema\Collection->__construct(Object(Cake\Database\Connection))
#6 /Applications/XAMPP/xamppfiles/htdocs/tweetAnalysis/vendor/cakephp/cakephp/src/Database/Connection.php(368): Cake\Database\Schema\CachedCollection->__construct(Object(Cake\Database\Connection), true)
#7 /Applications/XAMPP/xamppfiles/htdocs/tweetAnalysis/vendor/cakephp/cakephp/src/ORM/Table.php(531): Cake\Database\Connection->getSchemaCollection()
#8 /Applications/XAMPP/xamppfiles/htdocs/tweetAnalysis/vendor/cakephp/cakephp/src/ORM/Query.php(210): Cake\ORM\Table->getSchema()
#9 /Applications/XAMPP/xamppfiles/htdocs/tweetAnalysis/vendor/cakephp/cakephp/src/ORM/Query.php(167): Cake\ORM\Query->addDefaultTypes(Object(App\Model\Table\WordsTable))
#10 /Applications/XAMPP/xamppfiles/htdocs/tweetAnalysis/vendor/cakephp/cakephp/src/ORM/Table.php(1576): Cake\ORM\Query->__construct(Object(Cake\Database\Connection), Object(App\Model\Table\WordsTable))
#11 /Applications/XAMPP/xamppfiles/htdocs/tweetAnalysis/vendor/cakephp/cakephp/src/ORM/Table.php(1178): Cake\ORM\Table->query()
#12 /Applications/XAMPP/xamppfiles/htdocs/tweetAnalysis/src/Shell/TweetExecShell.php(29): Cake\ORM\Table->find()
#13 /Applications/XAMPP/xamppfiles/htdocs/tweetAnalysis/vendor/cakephp/cakephp/src/Console/Shell.php(508): App\Shell\TweetExecShell->main()
#14 /Applications/XAMPP/xamppfiles/htdocs/tweetAnalysis/vendor/cakephp/cakephp/src/Console/CommandRunner.php(140): Cake\Console\Shell->runCommand(Array, true)
#15 /Applications/XAMPP/xamppfiles/htdocs/tweetAnalysis/bin/cake.php(12): Cake\Console\CommandRunner->run(Array)
#16 {main}
コマンド
bin/cake hoge
該当のソースコード
<?php
namespace App\Shell;
use Cake\Console\Shell;
class HogeShell extends Shell
{
public function initialize() {
parent::initialize();
$this->loadModel('Hoges');
}
public function main() {
$query = $this->Hoges->find()
->where(['active' => 1]);
foreach ($query as $row) {
$result[] = $row->hoge;
}
echo $result[0];
}
}
試したこと
上記のHogeShellが呼べていることと、ターミナルからではなくControllerからDBアクセスしデータの取得は出来ていることは確認済みです。
app.phpの設定もしており、ターミナルから起動した場合のみエラーが発生します。
エラーが発生しているのPDODriverTrait.phpの54行目ではusername、passwordなどのコネクション情報に絡んでいる箇所なので、app.phpに設定した内容が読み込めていない?ような気がしています。
何かわかる方いましたらご教示願います。
補足情報(言語/FW/ツール等のバージョンなど)
php5.6
xammpp5.6
cakephp3.x
mac osx
※9月11日追記 解決?
controllerから実行した場合とターミナルから実行した場合で読み込んでいるphp.iniのディレクトリを調べた結果
・controller:/Applications/XAMPP/xamppfiles/etc
・ターミナル:/usr/local/etc/php/5.6
controllerはxamppの配下、ターミナルからはhomebrewでPHPをインストールしたディレクトリとなっていました。
それぞれが読んでいるpdo_mysql.default_socketの場所を調べた結果
・controller:/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock
・ターミナル:/tmp/mysql.sock
ここで/tmp配下を覗いてみるとmysql.sockなんてファイルはない!つまりxamppの方のパスを指定してあげれば良いのでは?
と考え/Applications/XAMPP/xamppfiles/var/mysqlを見に行ったがそこにもmysql.sockなんてファイルはありませんでした。
ものは試しと思い、/usr/local/etc/php/5.6/php.iniのpdo_mysql.default_socketのパスをxamppのものにしてみたところDB接続が成功しレコード取得出来ました。。。
ファイル自体はターミナルから検索してもfinderで見ても存在していないのに読み込めているのは理由を理解しないと気持ち悪いですが、とりあえずはターミナルからcakeコマンドで実行した場合は使うphpや読み込むphp.iniが違うよというのが原因でした。(環境依存かもしれませんが...)
unauさん、icchiiさんありがとうございました!
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
おそらく、PHP から MySQL に接続するためのソケットが見つからなくて発生しているエラーです。
php.ini の設定の問題か、
接続先の指定方法 (localhost / 127.0.0.1) の問題か ...
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.20%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
popobot
2017/09/11 09:13
ブラウザとコマンドで使っているphpが違うということはないでしょうか。それぞれでphpinfo()などを実行して確認してみてください