ThinkPHP下PDO連接數據庫報錯出現“PDO->__construct(‘mysql:host=localhost…’”(SQLSTATE[HY000] [2002])
[重要通告]如您遇疑難雜癥,本站支持知識付費業務,掃右邊二維碼加博主微信,可節省您寶貴時間哦!
前幾天有個客戶說他裝的ThinkPHP框架的站點,過一段時間就崩了~~出現一系列的錯誤,先出現的是(SQLSTATE[HY000] [2002])
過一點時間又出現“PDO->__construct(‘mysql:host=localhost…’” 如下圖
關于SQLSTATE[HY000] [2002]? ?ThinkPHP或者mysql出現“SQLSTATE[HY000]: General error: 1030 Got error 28 from storage engine”的解決辦法
出現SQLSTATE[HY000] [2002] ,這問題也不一定是單一的問題,來分析一下;
PDO連接數據庫報錯:“SQLSTATE[HY000] [2002] No such file or directory”。
出現這個問題的原因是PDO無法找到mysql.sock或者mysqld.sock
PDO連接數據庫報錯解決方法1:
找到相應的.sock文件,并設置php.ini文件中的pdo_mysql.default_socket的值為.sock文件的路徑。
pdo_mysql.default_socket= /tmp/mysqld.sock
然后重啟Apache,或者nginx下重啟php-fpm即可。
PDO連接數據庫報錯解決方法2:(我是用這種方法解決,簡單省力)
將PDO連接中的dsn的host由“localhost”改為“127.0.0.1”即可
解惑:WordPress在數據庫連接使用127.0.0.1與localhost對數據庫連接速度的影響
延伸閱讀:用localhost連接MySQL和127.0.0.1有什么區別呢?
在我們印象中這兩個都可以訪問到本地的服務,但是本質上有什么區別的?
host=127.0.0.1,使用 TCP連接,mysql server會認為這個連接來自127.0.0.1這個IP或者localhost.localdomin這個域名。
host=localhost,不使用TCP連接,它使用Unix socket連接mysql服務
以上是這兩種host連接區別的簡單總結,知道了這個區別,當php用localhost去連接mysql的時候,它該用哪個socket呢?大家都知道mysql服務啟動后它的進程里有一個--socket=/var/lib/mysql/mysql.sock的參數(大家的地址和我的可能會不相同,這個可以在mysq.cnf中進行設置),其中這個mysql.sock就是要用到的socket,我們只要把這個完整地址告訴php就可以,告訴的方式就是修改php.ini
pdo_mysql.default_socket=? 這項是否有配置或者配置是否正確
設置好以后重啟php-fpm就大功告成了。
問題未解決?付費解決問題加Q或微信 2589053300 (即Q號又微信號)右上方掃一掃可加博主微信
所寫所說,是心之所感,思之所悟,行之所得;文當無敷衍,落筆求簡潔。 以所舍,求所獲;有所依,方所成!