警告:mysql_connect():[2002]そのようなファイルまたはディレクトリ(unix:///tmp/mysql.sock経由で接続しようとしている)はありません


246

Appleのターミナル(PHPを使用)でMySQL DBに接続しようとしています。

昨日はうまくいきましたが、今度は突然タイトルにエラーが出ました。

ブラウザを使用してスクリプトを実行するとスクリプトは動作します(XAMPPがインストールされています)が、ターミナルはDBへの接続を拒否します。

接続するために含めるファイルは次のとおりです(これを含めない場合、スクリプトは機能しますが、DBに接続しません)。

<?php
    mysql_connect("localhost", "root", "") or die(mysql_error());
    mysql_select_db("FNB1C_data") or die(mysql_error());
?>

それは私のブラウザで動作するので、それは動作するはずです。

ターミナルで使用するコマンドはphp scriptname.phpです。

回答:


415

何らかの理由でOS Xのmysqlが必要なソケットファイルの場所を少し間違っていますが、ありがたいことに、解決策はシンボリックリンクを設定するのと同じくらい簡単です。

/tmp/mysql.sockまたはとしてソケット(長さがゼロのファイルとして表示される)を持っている可能性があります/var/mysql/mysql.sockが、1つ以上のアプリが他の場所でそれを探しています。このコマンドで調べてください:

ls -l /tmp/mysql.sock /var/mysql/mysql.sock

ソケットを移動して構成ファイルを編集し、パスが正しいサーバーから離れた場所に編集済みファイルを保存することを忘れないでください。シンボリックリンクを作成するだけで、Macが間違った場所を探している場合でも、必要なソケットを見つけられます。 !

あなたが持っている/tmp/mysql.sockのに/var/mysql/mysql.sockそれがないなら...

cd /var 
sudo mkdir mysql
sudo chmod 755 mysql
cd mysql
sudo ln -s /tmp/mysql.sock mysql.sock

あなたが持っている/var/mysql/mysql.sockのに/tmp/mysql.sockそれがないなら...

cd /tmp
ln -s /var/mysql/mysql.sock mysql.sock

ディレクトリとリンクを作成するには権限が必要です。必要に応じて、上記のコマンドの前にsudoを付けてください。


いい答えだ。修正は私のために働いた。なぜそれが一度機能し、その後再び機能しないのか知っていますか?私も同じ問題を抱えていました。
ニコール

16
これはかなりハッキーです。MySQLの隠しショートカットを回避するには、@ luismreisの回答をお勧めします。
MattiSG、2012

2
うまくいきませんでした...それらのファイルはありません。しかし、luismreisの答えはうまくいきました!
グレゴワール

4
これは「ハッキー」ではありません。これは、localhostソケットを機能させるための正しい方法であり、データベースにアクセスする前にパケットをルーターに送信することによる余分なオーバーヘッドを望まない場合に重要です。
ケブマン2013

1
Ubuntu 10.04のパスが正しくありませんでした。:私はこれをしなければならなかったcd /tmp当時と:sudo ln -s /var/run/mysqld/mysqld.sock mysql.sock
franzlorenzon 2013

370

私にもこのエラーがありましたが、ここの提案を通じてそれを修正することができました

要約すると、以下を使用します。

127.0.0.1

の代わりに:

localhost

その理由は、「localhost」はMySQLドライバーの特別な名前であるため、TCPソケットではなくUNIXソケットを使用してMySQLに接続するためです。


1
これで問題が解決する場合は、hostsファイルを確認してください。ファイルがないか、乱れている可能性があります
Fabrizio

3
また、多分言及するのも良いかもしれません:私のようにMAMPを使用する場合は、[ローカルアクセスのみを許可する]チェックボックスをオフにする必要があります
soupdiver

このソリューションでは、パケットが最初にルーターによって送信されるため、追加のオーバーヘッドが発生します。通常、テスト中は大きな問題ではありませんが、データの大きなパケットでは問題になる可能性があります。
ケブマン2013

3
@Fabrizioいいえ、関係ありません。localhostを名前として使用すると、localhostが/ etc / hostsで宣言されているかどうかに関係なく、mysqlは代わりに、Inetソケットではなくファイルエントリ(mysql.sockなど)で処理されるUnixソケットを使用します。ただし、代わりに127.0.0.1のIPアドレスを使用する場合は、mysqlに代わりにInetソケットを開くように強制します。
フランマルゾア2014年

1
これは、MySQL dbで 'user'% 'localhost'に提供したすべての付与が無効になることを意味しますか?
タコ

24

私は同じ問題を抱えていましたが、これが私がそれを修正した方法です:

私はこれを持っていましたが、うまくいきませんでした:

$con = mysql_connect('localhost', 'root', '1234');

私はこれを行い、それはうまくいきました:

$con = mysql_connect(':/Applications/MAMP/tmp/mysql/mysql.sock', 'root', '1234');

mysqlサーバーを使用する代わりに、Unixソケットに直接接続しました。私のために働いた。


これも私のために働いた唯一の解決策です。/var/mysql/mysql.sockがありません。そして、私は/tmp/mysql.sockを持っていません。
JeffB6688 2012年

localhostの代わりに127.0.0.1を試しましたか?
Mantisse

21

MySQLソケットは通常、/tmp/mysql.sockまたは/var/mysql/mysql.sockにありますが、おそらくPHPが間違った場所を探しています。

  1. ソケットがどこにあるかを確認してください:

     sudo /usr/libexec/locate.updatedb
  2. updatedbが終了すると:

     locate mysql.sock
  3. 次に、php.iniを見つけます。

     php -i | grep php.ini

    これは次のようなものを出力します:

     Configuration File (php.ini) Path => /opt/local/etc/php54
     Loaded Configuration File => /opt/local/etc/php54/php.ini
  4. php.iniを編集する

     sudo vim /opt/local/etc/php54/php.ini
  5. 行を変更します。

     pdo_mysql.default_socket=/tmp/mysql.sock
     mysql.default_socket=/tmp/mysql.sock
     mysqli.default_socket = /tmp/mysql.sock

    ここで、/ tmp / mysql.sockはソケットへのパスです。

  6. 変更を保存してESC + SHIFTを終了します:x

  7. Apacheを再起動します

     sudo apachectl stop
     sudo apachectl start

私はphp.iniを持っていません。私はphp.ini.defaultしか持っ ていないので、ここでの回避策が必要であるようです:apple.stackexchange.com/questions/65802/…しかし、私にとってはうまくいきませんでした。
user124384

@ user124384インストールがおそらく壊れている:あなたの名前を変更するphp.ini.defaultにはphp.ini
名詞

:Apacheは、単一の行で再開することができますsudo apachectl restart
fbiazi

11

私はMac OS XのXAMPPを使用しており、上記のBrian Loweのソリューションはわずかな変更で機能しました

mysql.sockファイルは、実際には「/ Applications / xampp / xamppfiles / var / mysql /」フォルダーにあります。/ tmpと/ var / mysqlの両方でリンクする必要がありました。PHPコマンドラインで使用されているものを確認していませんが、これで修正されたので満足しています:-)

sudo su
ln -s /Applications/xampp/xamppfiles/var/mysql/mysql.sock /tmp/mysql.sock
mkdir /var/mysql
ln -s /Applications/xampp/xamppfiles/var/mysql/mysql.sock /var/mysql/mysql.sock

1
ty-私は数日間解決策を探しました、そしてこれは最終的に物事を正しくしたものです!=)OS XのXAMPPも
ljubiccica 2014

10

Mac OS X EL Capitan + MAMP Proこれを行う

cd /var
sudo mkdir mysql
sudo chmod 755 mysql
cd mysql
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock mysql.sock

次にこれを行います

cd /tmp
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock mysql.sock

これにより時間を節約できることを願っています。


これは、リンクだmysql.dock/tmpそれを解決しています。ありがとう!
Mohammed J. Razem

6

その理由は、phpがの正しいパスを見つけられないためですmysql.sock

mysqlが最初に実行されていることを確認してください。

次に、どのパスにあるかを確認してください。mysql.sockたとえば、/tmp/mysql.sock

次に、このパス文字列をphp.iniに追加します。

  • mysql.default_socket = /tmp/mysql.sock
  • mysqli.default_socket = /tmp/mysql.sock
  • pdo_mysql.default_socket = /tmp/mysql.sock

最後に、Apacheを再起動します。


6

次の問題が発生した場合:

PHPがエラーをスロー「警告:mysql_connect()http://function.mysql-connect:2002 No such file or directory(trying via connect via unix:///tmp/mysql.sock)」

「mysql.default_socket」の値/etc/php.ini

 "mysql.default_socket = /var/mysql/mysql.sock". 

次に、サーバー管理でWebサービスを再起動します


これは私にとって最良の答えでした-私の場合、私はMAMPを使用しています、私はphp.iniに追加しました:mysqli.default_socket = /Applications/MAMP/tmp/mysql/mysql.sock mysql.default_socket = / Applications / MAMP / tmp /mysql/mysql.sock
アダムスキー

3

迫り来る2002ソケットエラーを修正します。これは、MySQLがソケットを配置し、OSXがそれを想定する場所をリンクします。MySQLはそれを/ tmpに置き、OSXはそれを/ var / mysqlで探します。ソケットは、mysqlクライアントを許可するファイルのタイプです/サーバー通信。

sudo mkdir /var/mysql

その後

sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

ソース:http : //coolestguidesontheplanet.com/get-apache-mysql-php-phpmyadmin-working-osx-10-10-yosemite/


1

別の解決策は、次のようにphp.ini構成ファイルのソケットの場所を修正することです。

pdo_mysql.default_socket=/tmp/mysql.sock

もちろん、シンボリックリンクも機能するので、どちらを変更するかは好みの問題です。


1

ポートを使用してphp53-mysqlをインストールすると、この問題の解決策である次のメッセージが返されます。

To use mysqlnd with a local MySQL server, edit /opt/local/etc/php53/php.ini
and set mysql.default_socket, mysqli.default_socket and
pdo_mysql.default_socket to the path to your MySQL server's socket file.

For mysql5, use /opt/local/var/run/mysql5/mysqld.sock
For mysql51, use /opt/local/var/run/mysql51/mysqld.sock
For mysql55, use /opt/local/var/run/mysql55/mysqld.sock
For mariadb, use /opt/local/var/run/mariadb/mysqld.sock
For percona, use /opt/local/var/run/percona/mysqld.sock

Mountain Lionを使用していて、macportsを使用してMySQLをインストールしました。
シェリック2013年

1

私は同じ問題を抱えていました

[PDOException] SQLSTATE [HY000] [2002]そのようなファイルまたはディレクトリはありません

[ErrorException]警告:PDO :: __ construct():[2002]…htdocs / Symfony / vendor / doctrine-dbal /にそのようなファイルまたはディレクトリ(unix:///var/mysql/mysql.sock経由で接続しようとしている)はありませんlib / Doctrine / DBAL / Driver / PDOConnection.php

したがって、解決策は、sockファイルへのシンボリックリンクを作成して、問題を解決することです。それを解決するには、次の手順を実行します。

$ sudo mkdir / private / var / mysql /

$ sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /private/var/mysql/mysql.sock

ソース:http : //www.reecefowell.com/2012/07/21/symfony2-cli-does-not-connect-to-mysql-while-browser-works-fine/


外部のウェブサイトへのリンクではなく、ここに回答を投稿してください。
ElmerCat

0

同じエラーが発生しました。Mysqlは、phpMyAdminを起動する前にスタンドアロンアプリケーションとして実行されていました。

私はmysqlを停止しました。次にsudo / Applications / XAMPP / xamppfiles / xampp stop sudo / Applications / XAMPP / xamppfiles / xampp start

うまくいきました


0

私はこの問題を抱えていましたが、特定のページをロードしたときにのみ表示されました(他のページは正常に動作しました)。との接続を閉じた後、MySQLを呼び出していることがわかりましたmysql_close()。したがって、@ brucenanが言ったように、呼び出すときにMySQLが実行されていることを確認してください


0

AppleターミナルでMAMP phpにエイリアスを設定するだけで実行できます。

alias phpmamp='/Applications/MAMP/bin/php/php7.0.0/bin/php'

例: > phpmamp - v

今、あなたは次のようなものを実行できます: > phpmamp scriptname.php

注:これは、現在のターミナルセッションにのみ適用されます。


0

MAMPを使用している可能性があるため、ポートをデフォルトの3306に変更するか、database.phpで127.0.0.1を使用します。

$db['default'] = array(
    'dsn'   => '',
    'hostname' => 'localhost',// leave it for port 3306
    'username' => 'yourUserhere',
    'password' => 'yourPassword',
    'database' => 'yourDatabase',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

またはデフォルト設定で:

$db['default'] = array(
        'dsn'   => '',
        'hostname' => '127.0.0.1:8889',// leave it for port 8889
        'username' => 'yourUserhere',
        'password' => 'yourPassword',
        'database' => 'yourDatabase',
        'dbdriver' => 'mysqli',
        'dbprefix' => '',
        'pconnect' => FALSE,
        'db_debug' => (ENVIRONMENT !== 'production'),
        'cache_on' => FALSE,
        'cachedir' => '',
        'char_set' => 'utf8',
        'dbcollat' => 'utf8_general_ci',
        'swap_pre' => '',
        'encrypt' => FALSE,
        'compress' => FALSE,
        'stricton' => FALSE,
        'failover' => array(),
        'save_queries' => TRUE
    );

0

mySQLクライアントは、デフォルトで、localhostのループバックアドレス(127.0.0.1)に接続する代わりに、ソケットと呼ばれるローカルファイルを介して接続を試みます。

このソケットファイルのデフォルトの場所は、少なくともOSXでは、 /tmp/mysql.sock

迅速でエレガントなソリューション

OSをだまして正しいソケットを見つけるためのシンボリックリンクを作成します。

ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp

適切なソリューション

startMysql.shファイルで定義されているソケットパスを変更します/Applications/MAMP/bin

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.