我相信我已经成功地部署了我的(非常基本的)网站到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
在某种程度上,迁移一定是有效的,因为我的表在那里——但这并不能解释为什么它现在不适合我。
当前回答
对于任何试图创建一个新的db连接而不是在laravel上,而是在这里寻找从终端运行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
}
希望能有所帮助!
其他回答
来自@stuyam的回答为我解决了“没有这样的文件或目录”的问题
简单回答:将/app/config/database.php文件中的“host”从“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' => '',
),
在我的情况下,我没有任何问题,只是忘记启动mysql服务…
sudo service mysqld start
我在ubuntu 18.04的nginx中遇到了同样的问题。通过以下步骤,我的问题已经解决:
首先打开终端,进入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',
),
现在只需保存更改,并重新加载页面,它就工作了。
出现这个错误的一个最简单的原因是MySQL服务器没有运行。先验证一下。如果是,继续其他建议:
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
更新: 有些人问为什么这个修复工作,所以我对这个主题做了一些研究。似乎他们使用不同的连接类型,解释在这篇文章https://stackoverflow.com/a/9715164
这里出现的问题是“localhost”使用UNIX套接字,无法在标准目录中找到数据库。但是“127.0.0.1”使用TCP(传输控制协议),这本质上意味着它在您的计算机上通过“本地互联网”运行,在这种情况下比UNIX套接字更可靠。
错误消息表明尝试通过套接字进行MySQL连接(不支持)。
在Laravel (artisan)环境中,您可能需要使用不同/正确的环境。例如:php artisan migrate——env=生产(或任何环境)。在这里看到的。