2015-09-27 88 views
4

我試圖運行PHPUnit單元測試WordPress插件,但標題中的錯誤不斷出現。警告:mysqli_real_connect():(HY000/2002):沒有這樣的文件或目錄在/private/tmp/wordpress/wp-includes/wp-db.php在線1452

我使用WP-CLI來設置unittests,但是當我嘗試運行它時WP-CLI也會拋出類似的錯誤。

我使用MAMP運行數據庫。

我將WP-CLI和PHPUnit設置爲phars,在〜/ .bash-profile中設置別名,並使用OS X提供的默認「php」運行。 更改此設置並運行WP-CLI和PHPUnit由MAMP提供的最新PHP版本修復了WP-CLI(它正在運行並連接到數據庫),但PHPUnit仍然拋出了相同的錯誤。

我已經嘗試編輯wp-config.php文件,並將主機設置爲「:/path/to/mamp/mysql.socket」,「localhost:/path/to/mamp/mysql.socket」和「127.0.0.1」,其中沒有一個幫助。

我完全被困住了,不知道下一步該怎麼做。

+1

可能是http://stackoverflow.com/q/4219970/1924128的副本。特別參見http://stackoverflow.com/a/32575869/1924128。 –

+0

可能有[Warning:mysql \ _connect():\ [2002 \]沒有這樣的文件或目錄(試圖通過unix:///tmp/mysql.sock連接)](http://stackoverflow.com/問題/ 4219970/warning-mysql-connect-2002-no-such-file-or-directory-trying-to-connect-vi) – Nilpo

回答

7

我剛碰到這個錯誤 - 你檢查了你的wp-config.php指定的模式存在嗎?

在我的情況下,我會直接忘記創建它,所以修復就像CREATE DATABASE wordpress一樣簡單。

wp-config.php數據庫主機出錯時,我也遇到了此錯誤(嘗試交換localhost127.0.0.1)。

+1

更改本地主機爲127.0.0.1爲我做了,謝謝! – DNACode

+0

OP是否解決了您的問題? @sigsve –

+0

安裝PHP 7.1後發生了這個問題,tx。 – Octal

-2

論/wp-includes/wp-db.php報告線(1489線在WordPress V 4.5)的代碼讀取:

mysqli_real_connect($this->duh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags); 

問題在前面添加一個@消失。因此,代碼應爲:

@mysqli_real_connect($this->duh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags); 

添加缺少的@,保存並上傳修改後的文件以獲得警告消失。

+2

這是可怕的建議。抑制錯誤不能解決問題。這只是在地毯之下。不幸的是,認爲那裏有開發人員實際上會這樣做。 – Nilpo

+0

WP編碼有錯誤。這在稍後的WordPress版本中通過添加如上所述的缺少的@符號得以修復。這可以在v4.7.3的第1531行中看到。因此,WP開發人員需要清理這個錯誤。 – MissionNext

+0

它是1540行。當wp-config.php中的WP_DEBUG設置爲false時,該行可以抑制連接錯誤,正如它在同一if塊中也顯示爲未壓縮的事實所述。這不是OP問題的解決方案。 – Nilpo

3

首先,確保MySql實際上在運行。如果進程尚未啓動,它將不會創建套接字文件。

netstat -tulpn | grep mysql 

ps -e | grep mysql 

如果MySQL正在運行,改變你的數據庫主機從localhost到WP-config.php的作品127.0.0.1,但它只是一種解決方法。

當您指定localhost,該mysqli_real_connect()功能試圖通過一個Unix套接字,它無法找到連接到數據庫(因此「沒有這樣的文件」的錯誤。)當你指定127.0.0.1,它會嘗試使用連接到您的數據庫默認的TCP端口(通常爲3306)。

這不能解決PHP不知道在哪裏可以找到MySql套接字的問題。您需要在您的php.ini中配置以下選項。插槽的位置取決於您的操作系統,但通常您可以通過運行locate mysql.sock來找到它。以下是CentOS 6.8上適用於我的設置。

的php.ini

pdo_mysql.default_socket = /var/lib/mysql/mysql.sock 
mysqli.default_socket = /var/lib/mysql/mysql.sock 

其他系統通常使用/tmp/mysqld.sock。您可以通過檢查MySql配置文件my.cfg來驗證配置的位置。

一旦您將PHP配置爲指向正確的套接字位置,請重新啓動Apache/nginx以使其獲取新設置。

現在您可以按照預期使用localhost

+0

這是非常好的解釋(+1),但允許我批評(不是你,只是mysqli驅動程序開發人員的決定): 「當你指定localhost時,mysqli_real_connect()函數試圖通過一個Unix套接字連接到你的數據庫找不到「 當我把'localhost'字符串放到應用程序的任何配置中時,我正在考慮將它作爲域名。這個域名怎麼會變成'mysqli_real_connect'裏的神奇字符串,它告訴它通過套接字連接?我批評這是因爲我的問題類似於OPs是在Docker中使用MySQL服務器的結果 – Marecky

+1

@Marecky您提出了一個很好的問題。然而,這不是一個MySQL開發者的決定,它實際上是一個底層的Unix實踐。當你指定「localhost」時,它使用本地的Unix套接字。這種基於文件系統的方法提供更好的安全性(只能在本地使用)和更好的性能(無TCP開銷)。提供任何其他主機名稱或IP地址會導致需要TCP/IP的外部呼叫。這是Unix網絡如何通過設計工作的。使用127.0.0.1強制系統對自己進行外部呼叫。這種設計允許您以外部客戶端的方式連接到您的服務器。 – Nilpo

+1

感謝您對Linux工作原理的更多說明,我記得我可能會遇到更多關於通過'localhost'域名訪問服務器的問題。現在我知道這是涉及更多Linux軟件的更廣泛案例。 – Marecky

0

我可以改變localhost127.0.0.1中的wp-config.php文件是固定

還設置define('WP_DEBUG', false);將是很好的建議,隱藏等問題。因爲我可以看到以下塊wp-db.php

if (WP_DEBUG) { 
       mysqli_real_connect($this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags); 
      } else { 
       @mysqli_real_connect($this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags); 
      } 
0

就到你的phpMyAdmin的,單擊您的數據庫,並複製其中運行該服務的IP和你的wp-config.php文件替換:

/** MySQL主機名*/ define('DB_HOST','localhost');

/** MySQL主機名*/ define('DB_HOST','ip_where_is_running_mysqlserver');

Replace Localhost to ip of running MySQL Server

相關問題