这是今天我朋友遇到的问题,网上没有啥解决方法,特此记录。

朋友的 MySQL 运行在 3307 端口,然而他的框架配置文件中没有 Port 的选项(好吧我说的就是 ss-panel),如果在 db_host 中填写 localhost:Port 这样的格式的话就会报 SQLSTATE Unknown MySQL server host 'localhost:3307' 这样的错误。

那么要怎么解决呢?

首先要找到 .env 被解析的地方,以 ss-panel 为例是在 /app/Services/Config.php 中:

public static function getDbConfig(){
  return [
    'driver'    => self::get('db_driver'),
    'host'      => self::get('db_host'),
    'database'  => self::get('db_database'),
    'username'  => self::get('db_username'),
    'password'  => self::get('db_password'),
    'charset'   => self::get('db_charset'),
    'collation' => self::get('db_collation'),
    'prefix'    => self::get('db_prefix')
  ];
}
use Illuminate\Database\Capsule\Manager as Capsule;

// Init Eloquent ORM Connection
$capsule = new Capsule;
$capsule->addConnection(Config::getDbConfig());
$capsule->bootEloquent();

Eloquent ORM 连接接受一个 array,array 内容即为 .env 中的配置,可以看到,数组中并没有 port 的设置。这确实是 ss-panel 作者的疏忽,我得去提个 Issue。

既然知道了是在哪里初始化的连接,就要去看看 Eloquent 的文档,看看怎么配置端口而不是默认的 3306。

不过我没找到 Eloquent 的具体 setting array(laravel 官方 class 文档倒是有一个,不过语焉不详),只找到了一个同样的问题:https://github.com/laravel/framework/issues/2719

由此可知,只需要在数组中加一个 port 成员即可:'port' => '3307'

对于其他使用 Eloquent 的框架同样适用,Laravel 默认的 .env 配置文件里也是没有端口配置的。