Di tengah-tengah usaha pengekodan kami , bukan sesuatu yang luar biasa untuk menghadapi pengecualian membingungkan yang nampaknya muncul entah dari mana. Pertimbangkan senario ini:
Saya cuba menyambung ke pangkalan data menggunakan PDO, tetapi saya mendapat mesej ralat samar ini:
Amaran: PDO::__construct(): [2002] Tiada fail atau direktori sedemikian (cuba menyambung melalui unix:///tmp/mysql.sock) dalam ...
Walaupun parameter sambungan TCP yang ditentukan, sistem nampaknya sedang mencuba untuk menyambung melalui soket Unix. Adalah penting untuk membetulkan isu ini untuk mewujudkan sambungan pangkalan data yang stabil. Jadi, apa yang silap?
Isu terasnya terletak pada tafsiran nama hos "host tempatan". Secara lalai, perpustakaan klien MySQL menganggap "localhost" merujuk kepada soket Unix dan bukannya nama hos TCP. Untuk menentukan sambungan TCP secara eksplisit, anda mesti menggunakan alamat IP "127.0.0.1" dan bukannya "localhost" sebagai nama hos.
Sebagai alternatif, anda boleh menentukan laluan soket Unix secara eksplisit dalam DSN menggunakan parameter unix_socket bukannya parameter hos.
Untuk menyelesaikan isu ini, pastikan anda menggunakan nama hos yang betul ("127.0.0.1") atau nyatakan laluan soket Unix secara eksplisit dalam DSN itu. Selain itu, semak sama ada laluan soket ditakrifkan dengan betul dalam fail php.ini anda (jika berkenaan).
Contoh DSN Menggunakan Alamat IP:
<code class="php">$dsn = 'mysql:host=127.0.0.1;port=3306;dbname=test';</code>
Contoh DSN Menggunakan Laluan Soket Unix:
<code class="php">$dsn = 'mysql:unix_socket=/tmp/mysql.sock;dbname=test';</code>
Dengan melaksanakan pelarasan ini, anda boleh mewujudkan sambungan pangkalan data yang stabil dan mengurangkan ralat "Tiada fail atau direktori sedemikian" dengan berkesan.
Atas ialah kandungan terperinci Mengapa sambungan PDO saya melalui TCP gagal dengan ralat 'Tiada fail atau direktori sedemikian' merujuk kepada soket Unix?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!