Uyarı: mysql_connect (): [2002] Böyle bir dosya veya dizin yok (unix: ///tmp/mysql.sock üzerinden bağlanmaya çalışıyor)


246

MySQL DB benim Apple (PHP ile) Terminal ile bağlanmaya çalışıyorum.

Dün işe yaradı ve şimdi aniden başlıkta hata alıyorum.

Komut dosyası çalıştırmak için tarayıcımı kullandığımda çalışıyor (yüklü XAMPP var), ancak Terminal DB'ye bağlanmayı reddediyor.

Bağlanmak için dahil ettiğim dosya (komut dosyası bunu eklemediğimde çalışır, ancak daha sonra DB'ye bağlanmaz) çalışır:

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

Tarayıcımla çalıştığı için bu işe yaramalı.

Terminalde kullandığım komut php scriptname.php.

Yanıtlar:


415

Nedense OS X üzerinde mysql gerekli soket dosyasının konumlarını biraz yanlış alır, ama neyse ki çözüm sembolik bir bağlantı kurmak kadar basittir.

Bir soket (sıfır uzunluklu dosya olarak görünen) olarak /tmp/mysql.sockveya olabilir /var/mysql/mysql.sock, ancak bir veya daha fazla uygulama bunun için başka bir konumda arıyor. Bu komutla öğrenin:

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

Soketi taşımak, yapılandırma dosyalarını düzenlemek ve düzenlenmiş dosyaları yerel ve yolların doğru olduğu sunuculardan uzak tutmayı hatırlamak yerine, Mac'iniz yanlış yere baksa bile gerekli soketi bulması için sembolik bir bağlantı oluşturmanız yeterlidir. !

Eğer var /tmp/mysql.sockama hayır /var/mysql/mysql.socko zaman ...

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

Eğer var /var/mysql/mysql.sockama hayır /tmp/mysql.socko zaman ...

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

Dizini ve bağlantıyı oluşturmak için izinlere ihtiyacınız olacak, bu nedenle gerekirse yukarıdaki komutların sudo ile ön ekini yapmanız yeterlidir.


İyi cevap. Fix benim için çalıştı. Neden bir kez çalışıp sonra tekrar çalışmayabileceğini biliyor musunuz? Aynı problemi yaşadım.
Nicole

16
Bu oldukça acayip. Daha çok @luismreis 'in MySQL gizli kısayoluna geçici bir çözüm bulmasını öneriyorum.
MattiSG

2
Benim için çalışmadı ... Hiçbir dosyam yok. Ama luismreis'in cevabı işe yaradı!
Gregoire

4
Bu "çılgın" değil. localhostSoketin çalışmasını sağlamanın doğru yoludur ve veritabanına erişmeden önce fazladan ek yükün yönlendiriciye paket göndermesini istemiyorsanız önemli olabilir.
Kebman

1
Ubuntu 10.04'ümdeki yol doğru değildi. : Bunu yapmak zorunda cd /tmpsonra ve: sudo ln -s /var/run/mysqld/mysqld.sock mysql.sock.
franzlorenzon

371

Ben de bu hatayı vardı, ama sadece burada öneri yoluyla düzeltmek olabilir .

Özetlemek için şunu kullanın:

127.0.0.1

Onun yerine:

localhost

Bunun nedeni, "localhost" un MySQL sürücüsü için özel bir isim olması ve bir TCP soketi yerine MySQL'e bağlanmak için UNIX soketini kullanmasıdır.


1
Bu işe yararsa, hostsdosyanızı kontrol edin , eksik veya dağınık olabilir
Fabrizio

3
Ayrıca bahsetmek için iyi olabilir: Benim gibi MAMP kullanırken "Sadece yerel erişime izin ver" kutusunun işaretini kaldırmalısınız
soupdiver

Bu çözüm, paket önce yönlendirici tarafından gönderildikçe ek yük getirir. Test sırasında genellikle büyük bir sorun olmaz, ancak büyük veri paketlerinde sorun olabilir.
Kebman

3
@Fabrizio Hayır, ilgili değil. Name olarak localhost kullandığınızda, mysql, Inhost olan bir dosya girişi (örneğin, mysql.sock) yerine işlenen Unix soketi kullanır, localhost / etc / hosts dizininde bildirilmiş olsun ya da olmasın. Ancak, bunun yerine bir IP adresi kullandığınızda, 127.0.0.1 bile, mysql yerine bir Inet soketi açmaya zorlarsınız.
Fran Marzoa

1
Bu durumda, MySQL db'de 'user'% 'localhost' için verdiğiniz tüm hibelerin kesileceğini ima eder mi?
Ahtapot

24

Aynı sorunu yaşıyordum ve bu nasıl düzelttim:

Bu vardı ve işe yaramadı:

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

Bunu yaptım ve işe yaradı:

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

MySQL sunucusunu kullanmak yerine, doğrudan Unix Soketine bağlandım. Benim için çalıştı.


Benim için de işe yarayan tek çözüm bu. /Var/mysql/mysql.sock'um yok. Ve /tmp/mysql.sock'um yok.
JeffB6688

localhost yerine 127.0.0.1'i denediniz mi?
Mantisse

21

MySQL soketi, genel olarak /tmp/mysql.sockveya içinde bulunur /var/mysql/mysql.sock, ancak muhtemelen PHP yanlış yere bakar.

  1. Soketinizin nerede olduğunu kontrol edin:

     sudo /usr/libexec/locate.updatedb
  2. Updatedb sonlandırıldığında:

     locate mysql.sock
  3. Sonra php.ini'nizi bulun:

     php -i | grep php.ini

    bu şöyle bir şey çıkarır:

     Configuration File (php.ini) Path => /opt/local/etc/php54
     Loaded Configuration File => /opt/local/etc/php54/php.ini
    
  4. Php.ini dosyanızı düzenleyin

     sudo vim /opt/local/etc/php54/php.ini
  5. Çizgileri değiştirin:

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

    Burada /tmp/mysql.sock, soketinize giden yoldur.

  6. Değişikliklerinizi kaydedin ve ESC + SHIFT'ten çıkın: x

  7. Apache'yi yeniden başlat

     sudo apachectl stop
     sudo apachectl start
    

Ben bir php.ini yok; Sadece bir php.ini.default var, bu yüzden buradaki geçici çözüm gerekli görünüyor: apple.stackexchange.com/questions/65802/… Ancak, benim için işe yaramadı.
user124384

@ user124384 Yüklemeniz muhtemelen bozuldu: En adlandırmak php.ini.defaultTo php.ini.
İsim

Apache tek bir satırla yeniden başlatılabilir:sudo apachectl restart
fbiazi

11

Mac OS X üzerinde XAMPP kullanıyorum ve yukarıdaki Brian Lowe'un çözümü hafif bir değişiklikle çalıştı .

Mysql.sock dosyası aslında "/ Applications / xampp / xamppfiles / var / mysql /" klasöründedir. Yani hem / tmp hem de / var / mysql ile bağlantı kurmak zorunda kaldı. Hangisinin PHP komut satırı tarafından kullanıldığını kontrol etmedim, ancak bu düzeltmeyi yaptı, bu yüzden mutluyum :-)

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 - Birkaç gün bir çözüm aradım ve bu nihayet işleri doğru yapan çözüm! =) OS X'de XAMPP de
ljubiccica

10

Mac OS X EL Capitan + MAMP Pro Bunu yapın

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

Öyleyse bunu yap

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

Umarım bu size biraz zaman kazandırır.


Bu çözüldü mysql.dockiçinde bağlantı /tmp. Teşekkürler!
Mohammed J.Razem10

6

Nedeni php doğru yolu bulamıyor olmasıdır mysql.sock.

Lütfen önce mysql'inizin çalıştığından emin olun.

Ardından, lütfen hangi yolun bulunduğunu onaylayın mysql.sock, örneğin/tmp/mysql.sock

sonra bu yol dizesini php.ini dosyasına ekleyin:

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

Son olarak, Apache'yi yeniden başlatın.


6

Aşağıdaki sorunla karşılaştığınızda:

PHP atma hatası "Uyarı: mysql_connect () http: //function.mysql-connect : 2002 Böyle bir dosya veya dizin yok (unix ile bağlanmaya çalışıyor: ///tmp/mysql.sock)"

Senin Set "mysql.default_socket" değer /etc/php.iniTo

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

Ardından sunucu yöneticisinde web hizmetini yeniden başlatın


Bu benim için en iyi cevaptı - benim durumumda MAMP kullanıyorum, php.ini'ye ekledim: mysqli.default_socket = /Applications/MAMP/tmp/mysql/mysql.sock mysql.default_socket = / Applications / MAMP / tmp /mysql/mysql.sock
Adamski


1

Başka bir çözüm, php.ini yapılandırma dosyasındaki yuva konumunu şu şekilde düzeltmektir:

pdo_mysql.default_socket=/tmp/mysql.sock

Tabii ki, symlink de çalışır, bu yüzden hangisini değiştireceğiniz bir tercih meselesidir.


1

Bağlantı noktasını kullanarak php53-mysql yüklediğinizde, bu sorunun çözümü olan aşağıdaki iletiyi döndürür:

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 kullanıyorum ve macports kullanarak MySQL'i kurdum.
Sheric

1

aynı sorunu yaşıyordum

[PDOException] SQLSTATE [HY000] [2002] Böyle bir dosya veya dizin yok

[ErrorException] Uyarı: PDO :: __ construct (): [2002]… htdocs / Symfony / vendor / doctrine-dbal / dizininde böyle bir dosya veya dizin (unix: ///var/mysql/mysql.sock aracılığıyla bağlanmaya çalışılıyor) yok lib / Doktrini / DBal / Sürücü / PDOConnection.php

Böylece çözüm, çorap dosyasına bir symlink yapmak ve böylece sorunu çözmektir. Çözmek için aşağıdakileri yapın:

$ sudo mkdir / private / var / mysql /

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

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


Harici bir web sitesine bağlantı vermek yerine cevabınızı buraya gönderin.
ElmerCat

0

Aynı hataları aldım. Ben phpMyAdmin başlamadan önce Mysql bağımsız bir uygulama olarak çalışıyordu.

Ben sadece mysql durdurdu Sonra sudo / Applications / XAMPP / xamppfiles / xampp stop sudo / Applications / XAMPP / xamppfiles / xampp start

İyi çalıştı


0

Bu sorunu yaşadım, ancak yalnızca belirli sayfaları yüklerken ortaya çıktı (diğer sayfalar iyi çalıştı). Bağlantıyı kapattıktan sonra MySQL'e çağrı yaptığım ortaya çıktı mysql_close(). Yani, @brucenan'ın dediği gibi: MySQL'i aradığınızda çalıştığından emin olun .


0

Bunu sadece Apple terminalindeki MAMP php'yi diğer adıyla alias yaparak yapabilirsiniz:

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

Misal: > phpmamp - v

Şimdi şöyle bir şey çalıştırabilirsiniz: > phpmamp scriptname.php

Not: Bu yalnızca geçerli terminal oturumu için uygulanır.


0

MAMP kullanabileceğiniz için, Portunuzu varsayılan 3306 olarak değiştirin veya database.php içinde 127.0.0.1 kullanın

$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
);

Veya varsayılan ayarlarla:

$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 istemcisi varsayılan olarak, yerel ana bilgisayar için geri döngü adresine (127.0.0.1) bağlanmak yerine soket adı verilen yerel bir dosya üzerinden bağlanmaya çalışır.

Bu soket dosyasının varsayılan konumu, OSX üzerinde en azından bir /tmp/mysql.sock.

HIZLI, DAHA AZ ZARİF ÇÖZÜM

İşletim sistemini doğru soketi bulmak için kandırmak için bir sembolik bağlantı oluşturun.

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

UYGUN ÇÖZÜM

İçindeki startMysql.shdosyada tanımlanan soket yolunu değiştirin /Applications/MAMP/bin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.