php artisan migrate
或php artisan db:seed
),我就会收到一条错误消息: [PDOException]
SQLSTATE[HY000] [2002] No such file or directory
因为我的表在那里,所以迁移一定可以正常进行-但这不能解释为什么它现在对我不起作用。
#1 楼
错误消息表明尝试了通过套接字的MySQL连接(不支持)。在Laravel(工匠)的上下文中,您可能想使用其他/正确的环境。例如:
php artisan migrate --env=production
(或任何环境)。见这里。评论
这是解决我的问题的方法,我们公司的一名开发人员不使用Homestead,而是通过套接字连接到mysql。我在我的app / database.php文件中删除了套接字配置。问题解决了
– Borislemke
16年1月29日在6:06
我只需要在php.ini中启用mysqli.so扩展名
– Mehulkumar
17年4月23日在9:42
我必须将“'unix_socket'=>'/Applications/MAMP/tmp/mysql/mysql.sock'”添加到config / database.php
–Ángel Carlos del Pozo Muela
18年1月31日在12:23
您好社区,即使我没有使用laravel,我也收到此错误,您可以在这里查看问题是stackoverflow.com/questions/60796332/…
–科兰·帕特尔(Kiran Patel)
3月22日下午5:57
当您使用套接字作为MySQL端点并且MySQL服务根本无法运行时,也会发生这种情况。
–密码
7月12日15:16
#2 楼
Laravel 4:将
app/config/database.php
文件中的“主机”从“ localhost”更改为“ 127.0.0.1” Laravel 5+:将
.env
文件中的“ DB_HOST”从“ localhost”更改为“ 127.0.0.1 “ 我遇到了完全相同的问题。以上解决方案均不适用于我。我通过将/app/config/database.php文件中的“主机”从“ 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套接字可靠得多。
评论
奇怪的是,它也是我的解决方案,但是我能够从命令行使用mysql --host = localhost连接-可以,但是不能从PDO连接。
–约翰
14年6月23日在17:24
我想知道为什么localhost无法正常工作,而127.0.0.1可以正常工作吗?
–贾斯汀
2014年10月18日,下午2:35
这对我在命令行(终端)上运行php文件的MAMP系统上有效。在我将localhost更改为“ 127.0.0.1”之前,它可以用作网页,但不能用作命令行文件。
–塞缪尔·富尔曼(Samuel Fullman)
2015年1月8日,11:57
@Justin我认为这是因为localhost尝试使用套接字,而127.0.0.1使用TCP。
– Pebbo
15年8月19日在13:32
如果您未指定主机名或指定特殊主机名localhost,则使用Unix套接字文件。 dev.mysql.com/doc/refman/5.7/en/can-not-connect-to-server.html
–x-yuri
16年8月17日在17:22
#3 楼
我遇到了同样的问题,并且我正在运行Mac OS X 10.10 Yosemite。我启用了操作系统随附的Apache服务器和PHP。然后,我刚刚配置了mCrypt库以开始使用。之后,当我使用模型和数据库时,出现错误:[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
项目文件夹中,查找数据库您可以在.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',
),
现在只需保存更改,然后重新加载页面就可以了!
评论
最“直接发行”的解决方案。谢谢,这使我无法使用MAMP pro运行Laravel
–animaacija
15年6月25日在7:38
谢谢你这对我有用。使用OSX 10.10.5 MAMP Pro
– marknt15
2015年11月5日,下午4:45
这对于MAMP pro和OS X 10.11.x也同样有效。最终是:/Applications/MAMP/tmp/mysql/mysql.sock
–Bort车牌
16年1月20日在4:47
+1。像Yamartino在他的回答中所说的那样,在配置中使用“ 127.0.0.1”代替“ localhost”可以很好地工作,但是使用套接字的速度更快,这个答案解决了这个问题。当定义unix_socket时,mysql以一种特殊的方式对待“ localhost”是很可惜的...
– Shautieh
16-2-20在6:10
@GregFerrell是的,但是很好...我希望它会有用
–alexventuraio
16-2-20在6:37
#4 楼
我由于其他原因遇到了[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
为我修复了它。
评论
这是对我有用的修复程序,问题是我安装了两个版本的mysql并删除了一个版本,127.0.0.1的更改不起作用或在配置中添加了袜子,谢谢! @dcarrith
–路易斯
2015年10月27日,下午2:32
这帮助我找到了问题-这是我使用的是OSX捆绑的php,而不是MAMP php二进制文件。因此,请确保您使用的是正确的php版本,该版本指向正确的php.ini等。时刻。
–蜻蜓风格
16年4月5日在18:43
#5 楼
@stuyam的回答对我来说解决了“没有这样的文件或目录”的问题简短的回答:从“ localhost”更改/app/config/database.php文件中的“主机”改为“ 127.0.0.1”
,但是出现“拒绝连接”错误。如果有人遇到相同的问题,我的解决方案是更新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' => '',
),
评论
就我而言,它是'port'=>'33060',但是这个答案使我到了那里!
–mopo922
15年5月16日在22:53
#6 楼
如果您使用的是Laravel Homestead,请确保在服务器上调用命令。homestead ssh
然后简单地cd到正确的目录并在此执行命令。
评论
这行得通,我从我的计算机而不是ssh首先运行命令到VM并在其中运行命令。
– cmac
16年12月21日在16:00
我总是忘记这一步。嘿。 1.来源〜/ .zshrc 2. homestead up --provision 3. homestead ssh
–马塞尔
17年2月9日在2:58
在我的情况下流浪的SSH
– Marcos Curvello
18-10-18在15:54
#7 楼
就我而言,我一点问题都没有,只是忘了启动mysql服务...sudo service mysqld start
#8 楼
在.env文件中从DB_HOST=localhost
更改为DB_HOST=127.0.0.1
后,它起作用了评论
这行得通,您是对的。您是否有任何想法解释为什么localhost不起作用?
–融合
19年6月27日在7:08
@Fusion如果您在容器中运行应用程序,它将理解为“ localhost”作为容器,127.0.0.1告诉它使用主机的数据库
–死亡皇帝
19-10-3在8:59
我也遇到了这样的问题,无法清除缓存或运行手工艺品服务
–汤姆·姆文达(Tom Mwenda)
1月2日7:53
#9 楼
Mamp用户启用选项允许网络访问MYSQL#10 楼
像下面的示例一样在database.php文件中添加mysql.sock路径'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
示例
'mysql' => [
'driver' => 'mysql',
'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '8889'),
#11 楼
这是因为PDO特别对待“ localhost”主机:注意:仅Unix:当主机名设置为“ localhost”时,与服务器的
连接为通过域套接字。如果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将“强制”使用TCP。
注意:mysqli_connect运行正常与localhost。
#12 楼
以@dcarrith的答案为基础...我没有编辑配置文件,而是在PHP查找的位置创建了一个别名,该别名连接到真实的mysql.sock。 (源)
只需运行这两个命令(无需重新启动):
mkdir /var/mysql
ln -s /tmp/mysql.sock /var/mysql/mysql.sock
#13 楼
步骤1找到您的unix_socket的路径,只需运行
netstat -ln | grep mysql
你应该得到类似的东西
unix 2 [ ACC ] STREAM LISTENING 17397 /var/run/mysqld/mysqld.sock
步骤2
将其添加您的unix_socket参数
'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' <-----
),
),
希望对您有所帮助!
#14 楼
我在MAMP Pro上运行,并且在尝试迁移(创建数据库表)时遇到了类似的问题。也尝试了其中一些提到的建议,但没有为我做。因此,简单地(在一个小时的搜索之后),我在/config/database.php中添加了两件事。
'port' => '1234',
'unix_socket' => '/path/to/my/socket/mysqld.sock'
工作正常现在!
#15 楼
使用Docker容器运行应用程序时遇到了这个问题。该解决方案在DB_HOST的
docker_compose.yml
中放入了我正在使用的MySQL服务容器的名称。就我而言,是db
:DB_HOST=db
希望有帮助。
评论
真好!你救了我的夜猫:)
–СтасПишевский
8月18日23:19
如果您在容器中运行Laravel应用,则需要使用容器凭据。例如。 mysql在DB_PORT使用3306中公开端口33333:3306。
–СтасПишевский
8月18日23:22
#16 楼
仔细检查您的端口。在我的情况下是8889,我正在使用8888。将“ DB_HOST”从“ localhost”更改为“ 127.0.0.1”,反之亦然
评论
太好了,谢谢,我的端口是3306,但我的真实端口是8889
–大卫
4月26日10:16
#17 楼
我在访问Drupal网站时遇到类似的问题。我通过打开命令行并重新启动MySQL服务器或服务来修复它:service mysqld restart
这应该可以工作。如果没有,请重新启动本地Web服务器:
service httpd restart
就足够了。希望它也适用于其他环境。请注意,这些命令通常需要超级用户特权。
#18 楼
在Elixir / Gulp和Homestead作为我的Vagrant环境中运行PHPUnit时,我遇到了这个问题。我将.env文件从
DB_HOST=localhost
修改为DB_HOST=192.168.10.10
,其中192.168.10.10
是我的Vagrant /的IP宅基地主持人。#19 楼
从Laravel 5开始,数据库用户名和密码进入项目目录中存在的.env文件,例如,DB_HOST=127.0.0.1
DB_DATABASE=db1
DB_USERNAME=user1
DB_PASSWORD=pass1
您可以看到这些环境变量覆盖了'伪造'字符串在这里,因此更改它们无效:
'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和环境变量
#20 楼
尝试连接到本地主机: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 Server。
#21 楼
如果使用Laravel Homestead,这是设置
(包括Vagrant虚拟机)
.bash-profile
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
#22 楼
如果仍然有人在寻找答案,只需检查您的.env文件。出于某种原因,laravel创建了一个.env.example文件,所以所有这些答案对我来说都不起作用。我修复了将.env.example重命名为.env的问题
评论
这个问题没有一个正确的答案,因为可能会发生各种错误。这是其中之一,因为无法将.env文件复制到远程服务器。因此,值得在尝试运行查询的服务器上检查.env文件,以确保它既存在又包含建立连接所需的信息。
–petercoles
16-2-9在10:26
#23 楼
这发生在我身上,因为MySQL没有运行。 MySQL无法启动,因为我缺少/usr/local/etc/my.cnf.d/
目录。我的
/usr/local/etc/my.cnf
配置文件要求将其作为全局包含(include /usr/local/etc/my.cnf.d/*.cnf
)。运行
mkdir /usr/local/etc/my.cnf.d
和然后启动MySQL,解决了该问题。#24 楼
就我而言,当我需要ssh进入流浪汉并从那里运行它时,我在我的mac终端上运行php artisan migration。希望可以帮助别人头痛。#25 楼
我在docker_compose.yml文件中使用Docker和MySQL服务名称db
时遇到了相同的问题:我在
.env
文件中添加了以下内容:DB_HOST=db
还应该确保可以从php应用程序中找到主机。
这是因为PHP无法确定要使用哪个主机进行连接。
#26 楼
使用虚拟机时,请确保将ssh插入该计算机并导航至您的App文件夹,然后从此处调用php artisan migration命令。#27 楼
在可能的情况下,我只是使用vagrant up
homestead up
进行伪造幼体设置使用宅基地。我假设这意味着该站点已得到服务,但从未启动MySQL服务器。当我使用后一个命令启动我的无业游民的盒子时,错误消失了。
#28 楼
所有这些答案似乎都很繁琐...我刚刚创建了一个
.env
文件;编辑了我的bootstrap/app.php
文件,并取消了以下行的注释... Dotenv::load(__DIR__.'/../');
希望对别人有帮助
#29 楼
对于试图在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
}
希望对您有所帮助!
#30 楼
就我而言,我必须删除bootstrap / cache文件夹,然后再试一次。我的情况是在服务器迁移之后。
评论
PHP的可能重复-MySQL连接不起作用:2002没有这样的文件或目录有时只是因为您尚未安装mysql