我相信我已成功将我的(非常基本的)网站部署到fortrabbit,但是一旦我连接到SSH以运行某些命令(例如php artisan migrate
或php artisan db:seed
),我就会得到一个错误讯息:
[PDOException]
SQLSTATE[HY000] [2002] No such file or directory
在某些时候,迁移必须有效,因为我的桌子在那里 - 但这并不能解释为什么它现在不适合我。
答案 0 :(得分:562)
Laravel 4:将
app/config/database.php
文件中的“host”从“localhost”更改为“127.0.0.1”Laravel 5:将
.env
文件中的“DB_HOST”从“localhost”更改为“127.0.0.1”
我遇到了完全相同的问题。上述解决方案均不适合我。我通过将/app/config/database.php文件中的“host”从“localhost”更改为“127.0.0.1”来解决了这个问题。
不确定为什么“localhost”默认不起作用,但我在symfony2帖子中解决了类似问题中的答案。 https://stackoverflow.com/a/9251924/1231563
<强>更新强> 有些人问过为什么这个修复工作有效,所以我对这个主题进行了一些研究。好像他们使用了不同的连接类型,如本文https://stackoverflow.com/a/9715164/1231563
中所述此处出现的问题是“localhost”使用UNIX套接字,无法在标准目录中找到该数据库。但是“127.0.0.1”使用TCP(传输控制协议),这实际上意味着它在您的计算机上运行的“本地Internet”在这种情况下比UNIX套接字更可靠。
答案 1 :(得分:112)
错误消息表明尝试通过套接字连接MySQL(不支持)。
在Laravel(工匠)的背景下,您可能想要使用不同的/正确的环境。例如:php artisan migrate --env=production
(或任何环境)。请参阅here。
答案 2 :(得分:76)
我遇到了同样的问题,我正在运行Mac OS X 10.10 Yosemite。我启用了操作系统附带的Apache Server和PHP。然后我只是配置了mCrypt库来开始。之后,当我使用模型和DB时,我得到了错误:
[PDOException]
SQLSTATE[HY000] [2002] No such file or directory
我找到的原因仅仅是因为PHP和MySQL无法自己连接。 为了解决这个问题,我按照以下步骤操作:
打开终端并使用以下命令连接到mysql:
mysql -u root -p
它会询问您相关的密码。然后,一旦你获得了mysql promt,就输入下一个命令:
mysql> show variables like '%sock%'
你会得到这样的东西:
+-----------------------------------------+-----------------+
| Variable_name | Value |
+-----------------------------------------+-----------------+
| performance_schema_max_socket_classes | 10 |
| performance_schema_max_socket_instances | 322 |
| socket | /tmp/mysql.sock |
+-----------------------------------------+-----------------+
保留最后一行的值:
/tmp/mysql.sock
在laravel
项目文件夹中,查找 database.php 文件,您可以在其中配置数据库连接参数。在 mysql 部分中添加最后一行:
'unix_socket' => '/tmp/mysql.sock'
你必须有这样的东西:
'mysql' => array(
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'SchoolBoard',
'username' => 'root',
'password' => 'venturaa',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'unix_socket' => '/tmp/mysql.sock',
),
现在只需保存更改,然后重新加载页面即可正常工作!
答案 3 :(得分:45)
由于其他原因,我遇到了[PDOException] SQLSTATE[HY000] [2002] No such file or directory
错误。我刚刚在Ubuntu 12.04上用Apache 2.4.7,PHP v5.5.10和MySQL 5.6.16构建了一个全新的LAMP堆栈。我把我的网站搬回来并将它们解雇了。但是,由于上面的[PDOException]
,我无法加载基于Laravel 4.2.x的网站。所以,我检查了php -i | grep pdo
并注意到这一行:
pdo_mysql.default_socket => /tmp/mysql.sock => /tmp/mysql.sock
但是,在我的/etc/my.cnf中,sock文件实际上在/var/run/mysqld/mysqld.sock
。
所以,我打开了我的php.ini并设置了pdo_mysql.default_socket
:
pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock
然后,我重新启动了apache并检查了php -i | grep pdo
:
pdo_mysql.default_socket => /var/run/mysqld/mysqld.sock => /var/run/mysqld/mysqld.sock
为我修好了。
答案 4 :(得分:40)
@stuyam的回答解决了#34;没有这样的文件或目录&#34;问题对我来说
简短回答:改变&#34;主持人&#34;在&#34; localhost&#34;的/app/config/database.php文件中到&#34; 127.0.0.1&#34;
然后我有一个&#34;连接被拒绝&#34;错误。如果有人有同样的问题,我的解决方案是更新app / config / local / database.php文件,使端口为8889:
'mysql' => array(
'driver' => 'mysql',
'host' => '127.0.0.1',
'port' => '8889',
'database' => 'databaseName',
'username' => 'root',
'password' => 'root',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
答案 5 :(得分:22)
如果您使用的是Laravel Homestead,请确保您正在调用服务器上的命令。
homestead ssh
然后只需cd到正确的目录并在那里激活你的命令。
答案 6 :(得分:16)
在我的情况下我完全没有问题,只是忘了启动mysql服务......
sudo service mysqld start
答案 7 :(得分:16)
答案 8 :(得分:14)
在database.php文件中添加mysql.sock路径,如下例
'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
Eample
'mysql' => [
'driver' => 'mysql',
'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '8889'),
答案 9 :(得分:12)
这是因为PDO对待&#34; localhost&#34;特别主持:
注意:仅限Unix:当主机名设置为&#34; localhost&#34;时,则 通过域套接字连接到服务器。如果是PDO_MYSQL 针对libmysqlclient编译然后是套接字文件的位置 是在libmysqlclient的位置编译。如果编译了PDO_MYSQL 对于mysqlnd,可以通过设置默认套接字 pdo_mysql.default_socket设置。
(来自http://php.net/manual/en/ref.pdo-mysql.connection.php)
将localhost更改为127.0.0.1将&#34;强制&#34;使用TCP。
注意:mysqli_connect与localhost一起工作正常。
答案 10 :(得分:11)
以@dcarrith的答案为基础......
我没有编辑配置文件,而是在PHP正在寻找连接真实mysql.sock的位置创建了一个别名。 (source)
只需运行这两个命令(无需重启):
mkdir /var/mysql
ln -s /tmp/mysql.sock /var/mysql/mysql.sock
答案 11 :(得分:11)
在.env文件中从DB_HOST=localhost
更改为DB_HOST=127.0.0.1
后,它起作用了
答案 12 :(得分:10)
找到unix_socket的路径,只需运行netstat -ln | grep mysql
你应该得到这样的东西
unix 2 [ ACC ] STREAM LISTENING 17397 /var/run/mysqld/mysqld.sock
将其添加到 unix_socket param
中'mysql' => array(
'driver' => 'mysql',
'host' => '67.25.71.187',
'database' => 'dbname',
'username' => 'username',
'password' => '***',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'unix_socket' => '/var/run/mysqld/mysqld.sock' <-----
),
),
希望它有所帮助!!
答案 13 :(得分:7)
我在MAMP Pro上运行并且在尝试迁移时遇到了类似的问题(创建数据库表)。尝试了一些这些提到的建议,但没有为我做。
所以,简单地说(在一小时谷歌搜索后),我在/config/database.php中添加了两件事。
'port' => '1234',
'unix_socket' => '/path/to/my/socket/mysqld.sock'
现在工作正常!
答案 14 :(得分:3)
仔细检查您的端口。在我的情况下它是8889,我使用的是8888。 将“DB_HOST”从“localhost”更改为“127.0.0.1”,反之亦然
答案 15 :(得分:2)
我在Elixir / Gulp中运行PHPUnit时遇到了这个问题,而Homestead作为我的流浪者环境。
在我的情况下,我将.env文件从DB_HOST=localhost
编辑为DB_HOST=192.168.10.10
,其中192.168.10.10
是我的Vagrant / Homestead主机的IP。
答案 16 :(得分:2)
尝试连接到localhost:
SQLSTATE[HY000] [2002] No such file or directory
尝试连接到127.0.0.1:
SQLSTATE[HY000] [2002] Connection refused
好的,只需在my.cnf中注释/删除以下设置(在OS X 10.5:/opt/local/etc/mysqlxx/my.cnf
上)即可获得:
[mysqld]
# skip-networking
当然,停止并启动MySQL服务器。
答案 17 :(得分:2)
从Laravel 5开始,数据库用户名和密码位于项目目录中的.env文件中,例如
DB_HOST=127.0.0.1
DB_DATABASE=db1
DB_USERNAME=user1
DB_PASSWORD=pass1
正如您所看到的,这些环境变量正在覆盖&#39;伪造&#39;这里的字符串如此改变它们没有效果:
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],
更多信息请访问https://mattstauffer.co/blog/laravel-5.0-environment-detection-and-environment-variables
答案 18 :(得分:1)
在我的情况下,我在我的mac终端上运行php artisan migrate,当我需要ssh到vagrant并从那里运行它。希望能帮助别人头疼。
答案 19 :(得分:1)
使用docker容器运行应用程序时遇到了这个问题。
该解决方案的名称是我在DB_HOST上的docker_compose.yml
中使用的MySQL服务容器的名称。就我而言,它是db
:
DB_HOST=db
希望有帮助。
答案 20 :(得分:1)
在docker_compose.yml文件中使用Docker和MySQL服务名称db
时,我遇到了相同的问题:
我在.env
文件中添加了以下内容:
DB_HOST=db
您还应确保可以从php应用程序中找到主机。
这是因为PHP无法确定要使用哪个主机进行连接。
答案 21 :(得分:1)
我在使用 nginx 的 ubuntu 18.04 中遇到了同样的问题。通过执行以下步骤,我的问题已得到解决:
首先打开终端并进入mysql CLI。要检查 mysql 套接字位置,我编写了以下命令。
mysql> show variables like '%sock%'
我得到了如下内容:
+-----------------------------------------+-----------------------------+
| Variable_name | Value |
+-----------------------------------------+-----------------------------+
| mysqlx_socket | /var/run/mysqld/mysqlx.sock |
| performance_schema_max_socket_classes | 10 |
| performance_schema_max_socket_instances | -1 |
| socket | /var/run/mysqld/mysqld.sock |
+-----------------------------------------+-----------------------------+
4 rows in set (0.00 sec)
在 laravel 项目文件夹中,在 config 文件夹中查找 database.php 文件。在mysql部分我根据上表修改了unix_socket。
'mysql' => array(
'driver' => 'mysql',
'host' => '127.0.0.1',
'database' => 'database_name',
'username' => 'username',
'password' => 'password',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'unix_socket' => '/var/run/mysqld/mysqld.sock',
),
现在只需保存更改,然后重新加载页面即可。
答案 22 :(得分:1)
这发生在我身上,因为MySQL没有运行。 MySQL无法启动,因为我有一个丢失的/usr/local/etc/my.cnf.d/
目录。
我的/usr/local/etc/my.cnf
配置文件要求将其作为glob include(include /usr/local/etc/my.cnf.d/*.cnf
)。
运行mkdir /usr/local/etc/my.cnf.d
,然后启动MySQL,修复了问题。
答案 23 :(得分:1)
如果有人仍在寻找答案,请检查您的.env文件。出于某种原因,laravel会创建一个.env.example文件,因此所有这些答案都不适用于我。我修复了我的问题,将.env.example重命名为.env
答案 24 :(得分:1)
如果您使用的是Laravel Homestead, 这是设置
(包括Vagrant-Virtual Machine)
<强> .bash轮廓强>
alias vm="ssh vagrant@127.0.0.1 -p 2222"
<强> database.php中强>
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'database' => env('DB_DATABASE', 'homestead'),
'username' => env('DB_USERNAME', 'homestead'),
'password' => env('DB_PASSWORD', 'secret'),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],
<强>终端强>
vm
vagrant@homestead:~/Code/projectFolder php artisan migrate:install
答案 25 :(得分:0)
所有这些答案似乎都很重要......
我刚刚创建了一个.env
文件;编辑了我的bootstrap/app.php
文件,并取消注释以下行...
Dotenv::load(__DIR__.'/../');
希望这有助于某人
答案 26 :(得分:0)
在可能的情况下,我只是使用
vagrant up
而不是
homestead up
我使用宅基地进行伪造幼虫设置。我假设这意味着该网站正在服务,但MySQL服务器还没有启动。当我使用后一个命令启动我的流浪盒时,错误就消失了。
答案 27 :(得分:0)
访问Drupal网站时遇到类似问题。我通过打开命令行并重新启动我的MySQL服务器或服务来修复它:
service mysqld restart
这应该有效。如果没有,请重新启动本地网络服务器:
service httpd restart
那应该够了。希望它也适用于其他环境。请注意,这些命令通常需要超级用户权限。
答案 28 :(得分:0)
对于试图在laravel上而不是在laravel上创建新的db连接的任何人,这里碰到寻求从终端运行PDO的答案。这将对您有所帮助。您可以重构它,使其最适合您。
<?php
class db
{
private $DBHOST = 'localhost'; // you don't need 127.0.0.1
private $DRIVER = 'mysql';
private $PORT = '8888'; // database port. 8888 is mine
private $DB = 'example-db';
private $PASS = 'example-pass';
private $USER = 'root';
private $SOCKS = ''; // can fill this or leave blank.
// - connect (dummy connection)
private function con()
{
if ($this->SOCKS == '')
{
// run shell command to get
$socks = shell_exec('netstat -ln | grep mysql');
$socks = trim(substr($socks, strpos($socks, '/')));
$this->SOCKS = strlen($socks) > 0 ? ';unix_socket='.$socks : '';
}
else
{
$this->SOCKS = ';unix_socket='.$this->SOCKS;
}
$dsn = $this->DRIVER.':host='.$this->DBHOST.';dbname='.$this->DB;
// add socks
$dsn .= $this->SOCKS;
// add port
$dsn .= (strlen($this->PORT) > 0) ? ';port='.$this->PORT : '';
// extablish connection
$con = new PDO($dsn, $user, $pass);
// return PDO instance.
return $con;
}
// - ends here
// now you can call $this->con() within class to use connection
// would run fine on any terminal
}
希望有帮助!
答案 29 :(得分:0)
就我而言,我必须删除bootstrap / cache文件夹,然后重试。
我的情况是在服务器迁移之后。
答案 30 :(得分:0)
我的回答是针对Laravel的。
在database.php
配置文件中创建到本地Docker MySQL服务的新连接并将其设置为默认连接后,出现了此消息。我忘记了通过在模型中覆盖它来设置其他连接:
class Model extends \Illuminate\Database\Eloquent\Model
{
protected $connection;
public function __construct(array $attributes = [])
{
parent::__construct($attributes);
$this->connection = 'some_other_connection';
}
...
因此,即使我在database.php
文件中的默认连接指向正确的凭据,该模型仍在使用从本地环境文件中删除的远程数据库连接配置。
答案 31 :(得分:0)
使用VirtualMachine时,请确保将ssh插入该计算机并导航到App文件夹并从那里调用php artisan migrate命令。