我相信我已经将我的(非常基本的)站点成功部署到了fortrabbit,但是一旦我连接到SSH以运行某些命令(例如php artisan migrate
或php artisan db:seed
),我就会收到一条错误消息:
[PDOException]
SQLSTATE[HY000] [2002] No such file or directory
在某个时候,迁移肯定已经成功了,因为我的表在那里-但这不能解释为什么它现在对我不起作用。
我相信我已经将我的(非常基本的)站点成功部署到了fortrabbit,但是一旦我连接到SSH以运行某些命令(例如php artisan migrate
或php artisan db:seed
),我就会收到一条错误消息:
[PDOException]
SQLSTATE[HY000] [2002] No such file or directory
在某个时候,迁移肯定已经成功了,因为我的表在那里-但这不能解释为什么它现在对我不起作用。
Answers:
错误消息表明尝试了通过套接字的MySQL连接(不支持)。
在Laravel(工匠)的背景下,您可能想要使用其他/正确的环境。例如:(php artisan migrate --env=production
或任何环境)。看这里。
Laravel 4:将
app/config/database.php
文件中的“主机” 从“本地主机”更改为“ 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套接字可靠得多。
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
我遇到了同样的问题,并且我正在运行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
项目文件夹中,查找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',
),
现在,只需保存更改,然后重新加载页面,它就可以正常工作!
/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文件中的“主机”从“本地主机”更改为“ 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'
但这个答案使我到了!
如果使用Laravel Homestead,请确保在服务器上调用命令。
homestead ssh
然后,简单地cd到正确的目录,然后在其中触发命令。
source ~/.zshrc
2. homestead up --provision
3.homestead ssh
vagrant ssh
就我而言
它的工作我的变化后,从DB_HOST=localhost
到DB_HOST=127.0.0.1
在.ENV文件
localhost
不起作用吗?
这是因为PDO特别对待“ localhost”主机:
注意:仅限于Unix:当主机名设置为“ localhost”时,将通过域套接字建立与服务器的连接。如果针对libmysqlclient编译了PDO_MYSQL,则套接字文件的位置位于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上工作正常。
找到您的unix_socket的路径,即可运行 netstat -ln | grep mysql
你应该得到这样的东西
unix 2 [ ACC ] STREAM LISTENING 17397 /var/run/mysqld/mysqld.sock
接受并添加到您的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' <-----
),
),
希望能帮助到你 !!
仔细检查您的端口。在我的情况下是8889,我正在使用8888。将“ DB_HOST”从“ localhost”更改为“ 127.0.0.1”,反之亦然
从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
在Elixir / Gulp和Homestead作为我的流浪者环境中运行PHPUnit时,我遇到了这个问题。
以我为例,我从编辑的.ENV文件DB_HOST=localhost
到DB_HOST=192.168.10.10
哪里192.168.10.10
是我的流浪/宅基地主机的IP。
如果您使用的是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
如果仍然有人在寻找答案,只需检查您的.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,解决了该问题。
对于试图在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
}
希望能帮助到你!
就我而言,我必须删除bootstrap / cache文件夹,然后重试。
我的情况是在服务器迁移之后。