【问题标题】:PHP Artisan Migrate with MAMP and Unix Socket使用 MAMP 和 Unix Socket 迁移 PHP Artisan
【发布时间】:2015-06-01 01:34:28
【问题描述】:

我最初在 Laravel 4.2 中开发我的应用程序,但后来决定将其移至 5.0 版本,以便它涵盖 5.0 超过 4.2 的更多变化和优势。

我正在尝试运行我的迁移,但是我收到了错误:

[PDOException]
  SQLSTATE[HY000] [2002] No such file or directory

我对此进行了调查并注意到它是如何发生的,因为我正在为我的服务器而不是 vagrant 和 homestead 运行 MAMP。我并没有反对这两者的用途,但在这一点上,我对 MAMP 感到更舒服,直到它失败了。我之所以知道它的 MAMP 是因为需要声明要使用的 unix 套接字值。

现在在我的应用程序的 4.2 版本中,我有以下内容:

'mysql' => array(
    'driver'    => 'mysql',
    'unix_socket'   => '/Applications/MAMP/tmp/mysql/mysql.sock',
    'host'      => getenv('DB_HOST'),
    ...
),

在我的 Laravel 5.0 版本中,我将 .env 文件用于我的环境变量,但不确定我需要如何执行此操作,以便它知道使用 unix 套接字值。

有人能告诉我我应该如何将它应用到新版本中,或者以更好的方式将它添加到设置中,这样我就不必这样做了吗?

【问题讨论】:

  • 你确定 unix 套接字在这个位置吗?您是否在非默认位置安装了 MAMP?
  • 是的,我知道这是正确的。
  • 对什么?我敢说你的电脑上指定的地方没有名为mysql.sock的文件。计算机不会在这方面犯错。如果它说那里没有文件,那是因为那里没有文件。如果您将 MAMP 安装在非默认位置,则可以通过使用 mysql.sock 文件的良好路径更新配置来解决您的问题,但 MAMP 本身不建议将其软件安装在其他位置,因为诸如此类的许多问题一个会出现的。
  • 我知道unix的路径是正确的。
  • 好的。对不起,我真的不想让我们竞争。我想告诉你的是,返回No such file or directory 的异常是没有出错,给我们留下了两个选择,要么文件不在你写的地方,要么函数附加了一些东西到路径,弄错了。但是,请,pleasePLEASE 别再相信计算机出错了。它正在寻找的文件不在它所在的位置,句号。没有别的了。找到函数试图包含的确切路径,并将其发布在此处。

标签: php laravel laravel-5 mamp-pro unix-socket


【解决方案1】:

试试这个:

'mysql' => array(
'driver'    => 'mysql',
'unix_socket'   => getenv('UNIX_SOCKET'),
'host'      => getenv('DB_HOST'),
...
),

在.env中添加

UNIX_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock

【讨论】:

  • 刚刚测试过了。像魅力一样工作!
  • 需要注意的是,一些 Laravel 5 的安装默认不附带 config/database.php 文件。我不知道为什么,但我必须创建一个,而 Laravel 5 文档中并没有真正提到(我可以找到)。
  • 感谢分享解决方案。我正在使用 Laravel 5.3.x
  • 在 Laravel 5.5 及以上版本中只需在 .env 中添加 DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock 即可
【解决方案2】:

虽然很老的问题,但仍然可以帮助别人。所以添加答案。

甚至还有简单的解决方案。将此添加到您的 .env 文件中

DB_HOST=localhost;unix_socket=/Applications/MAMP/tmp/mysql/mysql.sock

【讨论】:

    【解决方案3】:

    谢谢,帮我解决迁移问题:

    MAMP PRO 4.2
    Laravel 5.5
    

    .env 文件内:

    DB_CONNECTION=mysql
    DB_HOST=localhost
    DB_PORT=3306
    DB_DATABASE=<database name>
    DB_USERNAME=<username - default root>
    DB_PASSWORD=<password - default root>
    DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock
    

    在 config/database.php 中:

    'connections' => [
    
        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', '<database name>'),
            'username' => env('DB_USERNAME', '<username - default root>'),
            'password' => env('DB_PASSWORD', '<password - default root>'),
            'unix_socket' => env('DB_SOCKET', '/Applications/MAMP/tmp/mysql/mysql.sock'),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
    ],
    

    另外别忘了添加到 app/Providers/AppServiceProviders.php:

    use Illuminate\Support\Facades\Schema;
    public function boot()
    {
       Schema::defaultStringLength(191);
    }
    

    【讨论】:

    • 这行得通,但要注意 .env 文件中必须是 DB_SOCKET 而不是 UNIX_SOCKET,请更正。
    • 根据@tinyCoder 和 Esteban Bautista 关于将 UNIX_SOCKET 更改为 DB_SOCKET 的最新信息进行编辑。
    【解决方案4】:

    在 laravel 5.5 中,unix_socket 更改为 DB_SOCKET

    在 .env 文件中:

    DB_USERNAME=root
    DB_PASSWORD=root
    DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock
    

    在 config/database.php 中:

        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
    

    【讨论】:

      【解决方案5】:

      我创建了一个 StackOverflow 帐户只是为了回答这个问题,也许有助于防止有人经历我所经历的痛苦。

      我在网上找到的答案包括将 127.0.0.1 更改为 localhost,将端口从 3306 更改为 33060,反之亦然,并确保 unix_socket 正确。

      解决我的问题的解决方案正在改变:

      DB_CONNECTION=mysql
      DB_HOST=localhost
      

      DB_CONNECTION=mysql
      DB_HOST=mysql
      

      我希望这对那里的人有所帮助。我花了 4 个小时才找到这个令人痛苦的显而易见的解决方案……然后在 1 分钟 29 秒内发现它进入了 obscure YouTube video,浏览量低于 1000。

      【讨论】:

      • 除非您的计算机主机名是 mysql 并且您的数据库在网络上侦听,否则这将不起作用。
      猜你喜欢
      • 2019-06-30
      • 2020-01-18
      • 2018-06-07
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      • 2019-05-24
      • 1970-01-01
      • 2017-10-12
      相关资源
      最近更新 更多