我相信我已经成功地将我的(非常基本的)站点部署到了 fortrabbit,但是一旦我连接到 SSH 以运行一些命令(例如 php artisan migrate
或 php artisan db:seed
),我就会收到一条错误消息:
[PDOException]
SQLSTATE[HY000] [2002] No such file or directory
在某些时候,迁移必须有效,因为我的表在那里 - 但这并不能解释为什么它现在不适合我。
config/database.php
中设置 'host' => 'mysql',
并评论 unix_socket
参数。
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 文件中的“主机”从“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(传输控制协议),这实际上意味着它通过您计算机上的“本地互联网”运行,在这种情况下比 UNIX 套接字更可靠。
错误消息表明尝试了通过套接字的 MySQL 连接(不支持)。
在 Laravel(工匠)的上下文中,您可能想要使用不同的/正确的环境。例如:php artisan migrate --env=production
(或任何环境)。请参阅here。
我遇到了同样的问题,我正在运行 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%' 你会得到这样的: +-------------------- ---------------------+-----------------+ |变量名 |价值 | +------------------------------------------+-------- ----------+ | performance_schema_max_socket_classes | 10 | | performance_schema_max_socket_instances | 322 | |插座 | /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 ', '前缀' => '', 'unix_socket' => '/tmp/mysql.sock', ),
现在只需保存更改,然后重新加载页面,它必须工作!
/Applications/MAMP/tmp/mysql/mysql.sock
由于其他原因,我遇到了 [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
那为我修好了。
@stuyam 的回答为我解决了“没有这样的文件或目录”的问题
简短回答:将 /app/config/database.php 文件中的“主机”从“localhost”更改为“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'
但这个答案让我到了那里!
就我而言,我完全没有问题,只是忘记启动 mysql 服务......
sudo service mysqld start
如果您使用的是 Laravel Homestead,请确保您正在调用服务器上的命令。
homestead ssh
然后简单地 cd 到正确的目录并在那里触发你的命令。
source ~/.zshrc
2. homestead up --provision
3. homestead ssh
vagrant ssh
就我而言
我在 .env 文件中从 DB_HOST=localhost
更改为 DB_HOST=127.0.0.1
后它起作用了
localhost
不起作用?
在 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'),
这是因为 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 一起工作正常。
Mamp 用户启用选项 Allow network access to MYSQL
https://i.stack.imgur.com/uhnbn.png
基于@dcarrith 的答案...
我没有编辑配置文件,而是在 PHP 正在查找的位置创建了一个别名,该别名连接到真正的 mysql.sock。 (source)
只需运行这两个命令(无需重新启动):
mkdir /var/mysql
ln -s /tmp/mysql.sock /var/mysql/mysql.sock
步骤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' <-----
),
),
希望能帮助到你 !!
我在 MAMP Pro 上运行并在尝试迁移(创建数据库表)时遇到了类似的问题。也尝试了其中一些提到的建议,但没有为我做。
所以,简单地(经过一个小时的谷歌搜索),我在 /config/database.php 中添加了两件事。
'port' => '1234',
'unix_socket' => '/path/to/my/socket/mysqld.sock'
现在工作正常!
当我使用 docker 容器运行我的应用程序时,我遇到了这个问题。
解决方案是将我在 docker_compose.yml
中使用的 MySQL 服务容器的名称放在 DB_HOST 上。就我而言,它是 db
:
DB_HOST=db
希望能帮助到你。
我在 Elixir/Gulp 和 Homestead 作为我的 Vagrant 环境中运行 PHPUnit 时遇到了这个问题。
在我的例子中,我将 .env 文件从 DB_HOST=localhost
编辑到 DB_HOST=192.168.10.10
,其中 192.168.10.10
是我的 Vagrant/Homestead 主机的 IP。
仔细检查您的端口。就我而言,它是 8889,我使用的是 8888。将“DB_HOST”从“localhost”更改为“127.0.0.1”,反之亦然
我在访问我的 Drupal 网站时遇到了类似的问题。我通过打开命令行并重新启动我的 MySQL 服务器或服务来修复它:
service mysqld restart
这应该有效。如果没有,请重新启动本地网络服务器:
service httpd restart
这应该足够了。希望它也适用于其他环境。请注意,这些命令通常需要超级用户权限。
我在 docker_compose.yml 文件中使用 Docker 和 MySQL 服务名称 db
时遇到了同样的问题:
我在 .env
文件中添加了以下内容:
DB_HOST=db
您还应该确保可以从 php 应用程序中发现您的主机。
这是因为 PHP 没有弄清楚使用哪个主机来连接。
DB_HOST=localhost
并在将其更改为 DB_HOST=127.0.0.1
时得到 SQLSTATE[HY000] [2002] No such file or directory
,错误更改为 SQLSTATE[HY000] [2002] Connection refused
。只有当我将其更改为 MySQL docker 容器的名称时,它才开始工作,即:在我的情况下为 DB_HOST=mysql
。不知道为什么会这样,当其他答案声称它与套接字有关时,我的猜测是某种回退机制,不正确的检查会引发误导性错误。
我在使用 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',
),
现在只需保存更改,然后重新加载页面,它就可以工作了。
从 Laravel 5 开始,数据库用户名和密码位于项目目录中的 .env 文件中,例如
DB_HOST=127.0.0.1
DB_DATABASE=db1
DB_USERNAME=user1
DB_PASSWORD=pass1
如您所见,这些环境变量在这里覆盖了“forge”字符串,因此更改它们无效:
'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
只是我在 .env 文件中进行了一次更改
我有以下代码行。
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=database_name
DB_USERNAME=root
DB_PASSWORD=
将主机名 localhost 更改为 127.0.0.1
DB_CONNECTION=mysql
DB_HOST=127.0.01
DB_PORT=3306
DB_DATABASE=database_name
DB_USERNAME=root
DB_PASSWORD=
这对我来说是可行的,因为找不到像 localhost 这样的主机名
并在更改主机名后编写以下命令
php artisan config:clear
php artisan migrate:install
php artisan migrate
如果你使用 Laravel Homestead,这里是设置
(包括 Vagrant-Virtual Machine)
.bash-profile
alias vm="ssh vagrant@127.0.0.1 -p 2222"
数据库.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
尝试连接到本地主机:
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。
如果有人仍在寻找答案,只需检查您的 .env 文件。出于某种原因,laravel 创建了一个 .env.example 文件,所以所有这些答案都对我不起作用。我修复了将 .env.example 重命名为 .env 的问题
这发生在我身上是因为 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,解决了该问题。
就我而言,当我需要 ssh 进入 vagrant 并从那里运行它时,我在我的 mac 终端上运行 php artisan migrate。希望对头痛的人有所帮助。
就我而言,我必须删除 bootstrap/cache 文件夹并重试。
我的场景是在服务器迁移之后。
php artisan db:create
创建数据库。虽然在这个命令之前我有一个数据库,但我需要新的数据库。 ,但我面对。没有影响 mysql 连接的单一更改
解决了
就我而言,这是代码中的逻辑问题,连接值在 if 语句中:
if($_SERVER['HTTP_HOST'] == "localhost")
所以解决方案是添加一个管道并添加 127.0.0.1,这解决了我的问题
if($_SERVER['HTTP_HOST'] == "localhost" || $_SERVER['HTTP_HOST'] == "127.0.0.1")
使用 VirtualMachine 时,请确保您 ssh 进入该机器并导航到您的 App 文件夹并从那里调用 php artisan migrate 命令。
不定期副业成功案例分享
localhost
不起作用而127.0.0.1
起作用?A Unix socket file is used if you do not specify a host name or if you specify the special host name localhost.
dev.mysql.com/doc/refman/5.7/en/can-not-connect-to-server.html