私は(非常に基本的な)サイトをfortrabbitにうまく展開できたと思いますが、SSHに接続していくつかのコマンド(php artisan migrate
やphp artisan db:seed
など)を実行するとすぐにエラーメッセージが表示されます。
[PDOException]
SQLSTATE[HY000] [2002] No such file or directory
私のテーブルがあるので、ある時点で移行はうまくいったに違いありません。
エラーメッセージは、ソケット経由のMySQL接続が試行されたことを示します(これはサポートされていません)。
Laravel(職人)の文脈では、おそらく異なる/正しい環境を使いたいでしょう。例:php artisan migrate --env=production
(またはどんな環境でも)。 ここ を参照してください。
Laravel 4:
app/config/database.php
ファイルの "Host"を "localhost"から "127.0.0.1"に変更Laravel 5:
.env
ファイルの "DB_Host"を "localhost"から "127.0.0.1"に変更
私はまったく同じ問題を抱えていました。上記の解決策のどれも私のために働きませんでした。 /app/config/database.phpファイルの "Host"を "localhost"から "127.0.0.1"に変更することで問題を解決しました。
なぜ "localhost"がデフォルトで機能しないのかわからないが、私はsymfony2の投稿で解決された同様の質問でこの答えを見つけました。 https://stackoverflow.com/a/9251924/1231563
更新: なぜこの修正が機能するのかという質問を受けたので、このトピックについて少し調査しました。それは彼らがこの記事で説明されているように異なる接続タイプを使用しているかのように思われます https://stackoverflow.com/a/9715164/1231563
ここで発生した問題は、「localhost」がUNIXソケットを使用しており、標準ディレクトリにデータベースが見つからないことです。しかし、 "127.0.0.1"はTCP(Transmission Control Protocol)を使用します。これは本質的に、この場合UNIXソケットよりもはるかに信頼性が高く、コンピュータ上の "ローカルインターネット"を経由することを意味します。
私は同じ問題を抱えていて、私はMac OS X 10.10 Yosemiteを使っています。私はApache ServerとPHPを有効にしました。これはすでにOSに付属しています。それでは、mCryptライブラリを設定しました。その後モデルとDBを扱っていたときにエラーが発生しました。
[PDOException]
SQLSTATE[HY000] [2002] No such file or directory
私が見つけた理由は、PHPとMySQLが接続できないからです。この問題を解決するには、次の手順に従います。
端末を開き、次のようにしてmysqlに接続します。
mysql -u root -p
関連するパスワードを聞いてきます。それならmysqlのプロンプトが表示されたら次のコマンドを入力してください。
mysql> show variables like '%sock%'
あなたはこのようなものを得るでしょう:
+-----------------------------------------+-----------------+
| Variable_name | Value |
+-----------------------------------------+-----------------+
| performance_schema_max_socket_classes | 10 |
| performance_schema_max_socket_instances | 322 |
| socket | /tmp/mysql.sock |
+-----------------------------------------+-----------------+
最後の行の値を保持してください。
/tmp/mysql.sock
laravel
プロジェクトフォルダーで、 database.php ファイルを探します。そこにDB接続パラメータを設定します。 mysql セクションで、最後に次の行を追加します。
'unix_socket' => '/tmp/mysql.sock'
あなたはこのようなものを持っている必要があります。
'mysql' => array(
'driver' => 'mysql',
'Host' => 'localhost',
'database' => 'SchoolBoard',
'username' => 'root',
'password' => 'venturaa',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'unix_socket' => '/tmp/mysql.sock',
),
変更を保存してページをリロードするだけでうまくいきます。
別の理由で[PDOException] SQLSTATE[HY000] [2002] No such file or directory
エラーが発生しました。 Apache 2.4.7、PHP v5.5.10、およびMySQL 5.6.16を使用して、Ubuntu 12.04上に新しいLAMPスタックを構築しました。私は自分のサイトを元に戻して起動した。しかし、上記の[PDOException]
のため、Laravel 4.2.xベースのサイトを読み込めませんでした。だから、私はphp -i | grep pdo
をチェックして、この行に気づきました:
pdo_mysql.default_socket => /tmp/mysql.sock => /tmp/mysql.sock
しかし、私の/etc/my.cnfでは、sockファイルは実際には/var/run/mysqld/mysqld.sock
にあります。
そこで、php.iniを開いてpdo_mysql.default_socket
の値を設定しました。
pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock
それから、Apacheを再起動してphp -i | grep pdo
をチェックしました。
pdo_mysql.default_socket => /var/run/mysqld/mysqld.sock => /var/run/mysqld/mysqld.sock
それは私のためにそれを修正しました。
@stuyamからの回答で、「そのようなファイルやディレクトリはありません」という問題が解決しました
短い答え:/app/config/database.phpファイルの "Host"を "localhost"から "127.0.0.1"に変更します。
しかし、それから私は "接続が拒否されました"というエラーがありました。誰もが同じ問題を抱えていた場合、これに対する私の解決策は、ポートが8889になるようにapp/config/local/database.phpファイルを更新することでした:
'mysql' => array(
'driver' => 'mysql',
'Host' => '127.0.0.1',
'port' => '8889',
'database' => 'databaseName',
'username' => 'root',
'password' => 'root',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
Laravel Homesteadを使用している場合は、サーバー上でコマンドを呼び出していることを確認してください。
Homestead ssh
それから、正しいディレクトリにcdして、そこでコマンドを実行してください。
私の場合、私はまったく問題がなかった、ちょうどMySQLサービスを開始するのを忘れていました...
Sudo service mysqld start
以下の例のように、database.phpファイルにmysql.sockパスを追加します。
'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
例
'mysql' => [
'driver' => 'mysql',
'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
'Host' => env('DB_Host', 'localhost'),
'port' => env('DB_PORT', '8889'),
これは、PDOが "localhost"ホストを特別に扱うためです。
注:UNIXのみ:ホスト名が "localhost"に設定されていると、サーバーへの接続はドメインソケットを介して行われます。 PDO_MYSQLがlibmysqlclientに対してコンパイルされている場合、ソケットファイルの場所はlibmysqlclientのコンパイル済みの場所にあります。 PDO_MYSQLがmysqlndに対してコンパイルされている場合は、pdo_mysql.default_socket設定を介してデフォルトソケットを設定できます。
( http://php.net/manual/en/ref.pdo-mysql.connection.php から)
localhostを127.0.0.1に変更すると、TCPが強制的に使用されます。
注:mysqli_connectはlocalhostで正常に動作しています。
.envファイルでDB_Host=localhost
からDB_Host=127.0.0.1
に変更した後でうまくいきました
@dcarrithからの回答をもとに...
設定ファイルを編集する代わりに、PHPが実際のmysql.sockに接続する場所にエイリアスを作成しました。 ( ソース )
これら2つのコマンドを実行するだけです(再起動は不要です)。
mkdir /var/mysql
ln -s /tmp/mysql.sock /var/mysql/mysql.sock
あなたのunix_socketへのパスを見つけ、それを実行するにはnetstat -ln | grep mysql
を実行するだけです。
あなたはこのようなものを手に入れるべきです
unix 2 [ ACC ] STREAM LISTENING 17397 /var/run/mysqld/mysqld.sock
それを持ってあなたの unix_socket paramにそれを追加してください。
'mysql' => array(
'driver' => 'mysql',
'Host' => '67.25.71.187',
'database' => 'dbname',
'username' => 'username',
'password' => '***',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'unix_socket' => '/var/run/mysqld/mysqld.sock' <-----
),
),
それが役に立てば幸い !!
私はMAMP Proで実行していて、移行(dbテーブルの作成)を試みるときにも同様の問題がありました。これらの言及された提案のいくつかも試してみましたが、私のためにそれをしませんでした。
それで、単純に(1時間のグーグルの後)、/ config/database.phpに二つのことを追加しました。
'port' => '1234',
'unix_socket' => '/path/to/my/socket/mysqld.sock'
今正常に動作します!
ポートを慎重に確認してください。私の場合は8889で、8888を使用しています。 "DB_Host"を "localhost"から "127.0.0.1"に変更します。
Laravel 5以降、データベースのユーザー名とパスワードはプロジェクトディレクトリに存在する.envファイルに保存されます。
DB_Host=127.0.0.1
DB_DATABASE=db1
DB_USERNAME=user1
DB_PASSWORD=pass1
ご覧のとおり、これらの環境変数はここで 'forge'文字列をオーバーライドしているため、変更しても効果はありません。
'mysql' => [
'driver' => 'mysql',
'Host' => env('DB_Host', 'localhost'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],
より多くの情報はここにあります https://mattstauffer.co/blog/laravel-5.0-environment-detection-and-environment-variables
私のVagrant環境としてElixir/Gulpで、そしてHomesteadでPHPUnitを実行するとき、私はこの問題に遭遇しました。
私の場合は、.envファイルをDB_Host=localhost
からDB_Host=192.168.10.10
に編集しました。ここで、192.168.10.10
は私のVagrant/Homestead HostのIPです。
Laravel Homesteadを使用している場合は、ここに
(Vagrant-Virtual Machineを含む)
.bash-profile
alias vm="ssh [email protected] -p 2222"
database.php
'mysql' => [
'driver' => 'mysql',
'Host' => env('DB_Host', '127.0.0.1'),
'database' => env('DB_DATABASE', 'Homestead'),
'username' => env('DB_USERNAME', 'Homestead'),
'password' => env('DB_PASSWORD', 'secret'),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],
ターミナル
vm
vagrant@Homestead:~/Code/projectFolder php artisan migrate:install
それでも回答を探している人がいる場合は、.envファイルを確認してください。どういうわけかlaravelが.env.exampleファイルを作成したので、これらすべての答えが私にはうまくいきませんでした。私は私の問題を修正します。
Dockerコンテナを使用してアプリケーションを実行していたときに、この問題が発生しました。
解決策は私が使っていたMySQLサービスコンテナの名前をDB_Hostのdocker_compose.yml
に入れました。私の場合、それはdb
でした。
DB_Host=db
それが役に立てば幸い。
Localhostに接続しようとしました。
SQLSTATE[HY000] [2002] No such file or directory
127.0.0.1への接続を試みます。
SQLSTATE[HY000] [2002] Connection refused
それでは、my.cnf(OS X 10.5:/opt/local/etc/mysqlxx/my.cnf
)から以下の設定をコメントアウトするか削除してください。
[mysqld]
# skip-networking
もちろん、MySQL Serverを停止して起動します。
MySQLが動作していなかったので、これは私に起こりました。 /usr/local/etc/my.cnf.d/
ディレクトリが見つからないため、MySQLが起動しませんでした。
これは私の/usr/local/etc/my.cnf
設定ファイルにglobインクルード(include /usr/local/etc/my.cnf.d/*.cnf
)として要求されていました。
mkdir /usr/local/etc/my.cnf.d
を実行してからMySQLを起動すると、問題が解決しました。
私の場合は、vagrantにSSH接続してそこから実行する必要があるときに、私のMac端末でphp artisan migrateを実行していました。誰かが頭痛の種になることを願っています。
仮想マシンを使用するときは、必ずそのマシンにアクセスしてAppフォルダに移動し、そこからphp artisan migrateコマンドを呼び出してください。
場合によっては、私は単に使用したい
vagrant up
の代わりに
Homestead up
homesteadを使用して私の偽造の幼虫のセットアップのために。私はこれがそのサイトが提供されていたことを意味していると思いますが、MySQLサーバーは決して起動されませんでした。後者のコマンドを使って私のvagrant boxを立ち上げると、エラーは消えました。
これらすべての答えは大変な作業のようです...
.env
ファイルを作成しました。私のbootstrap/app.php
ファイルを編集し、次の行のコメントを外しました...
Dotenv::load(__DIR__.'/../');
これが誰かに役立つことを願っています
私の場合、bootstrap/cacheフォルダーを削除して、再試行する必要がありました。
私のシナリオは、サーバーの移行後です。
私は私のDrupalウェブサイトにアクセスする際に同様の問題を抱えていた。コマンドラインを開き、MySQLサーバーまたはサービスを再起動することで修正しました。
service mysqld restart
これでうまくいくはずです。起動しない場合は、ローカルWebサーバーを再起動します。
service httpd restart
それで十分です。他の環境でもうまくいくことを願っています。これらのコマンドには通常スーパーユーザー特権が必要です。
新しいレベルではないdb接続を作成しようとしている人のために、ターミナルからPDOを実行するための回答を求めてここにぶつかった。これはあなたにとって助けになるでしょう。そして、あなたはそれをあなたにとって最適に働くようにリファクタリングすることができます。
<?php
class db
{
private $DBHOST = 'localhost'; // you don't need 127.0.0.1
private $DRIVER = 'mysql';
private $PORT = '8888'; // database port. 8888 is mine
private $DB = 'example-db';
private $PASS = 'example-pass';
private $USER = 'root';
private $SOCKS = ''; // can fill this or leave blank.
// - connect (dummy connection)
private function con()
{
if ($this->SOCKS == '')
{
// run Shell command to get
$socks = Shell_exec('netstat -ln | grep mysql');
$socks = trim(substr($socks, strpos($socks, '/')));
$this->SOCKS = strlen($socks) > 0 ? ';unix_socket='.$socks : '';
}
else
{
$this->SOCKS = ';unix_socket='.$this->SOCKS;
}
$dsn = $this->DRIVER.':Host='.$this->DBHOST.';dbname='.$this->DB;
// add socks
$dsn .= $this->SOCKS;
// add port
$dsn .= (strlen($this->PORT) > 0) ? ';port='.$this->PORT : '';
// extablish connection
$con = new PDO($dsn, $user, $pass);
// return PDO instance.
return $con;
}
// - ends here
// now you can call $this->con() within class to use connection
// would run fine on any terminal
}
それが役に立てば幸い!