使用MAMP和Unix Socket进行PHP Artisan迁移

10

我最开始是在Laravel 4.2上开发我的应用程序,但后来决定将其迁移到5.0版本,以涵盖5.0相对于4.2的许多变更和优势。

我现在正在尝试运行我的数据库迁移,但是收到了以下错误信息:

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

我研究了一下,发现这是因为我在服务器上运行的是MAMP而不是vagrant和homestead。我并不否认那两个工具的用途,但我现在更喜欢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 Socket 值。

能否有人给我指点一下如何将其采用到新版本中或更好的方法将其添加到设置中,以便我不必这样做?


你确定Unix套接字在这个位置吗?你是否将MAMP安装在非默认位置? - Félix Adriyel Gagnon-Grenier
是的,我知道它是正确的。 - user3732216
是什么意思?我敢说,在指定的位置上你的电脑上没有名为 mysql.sock 的文件。电脑不会在这方面犯错。如果它说那里没有文件,那就是因为那里没有文件。如果你在非默认位置安装了MAMP,你可以通过更新配置文件中 mysql.sock 文件的正确路径来解决问题,但MAMP本身不建议在其他地方安装他们的软件,因为会出现许多类似这样的问题。 - Félix Adriyel Gagnon-Grenier
我知道Unix的路径是正确的。 - user3732216
好的。抱歉,我真的不想和你竞争。我想告诉你的是,返回“没有这样的文件或目录”的异常并不是错误,留给我们两个选择,要么文件不在你写的地方,要么函数将路径附加了一些东西,使其变得错误。但是,请,拜托,停止相信计算机会犯错。它正在寻找的文件不在那里,就是这样。没有其他的了。找到函数尝试包含的确切路径,并在此处发布它。 - Félix Adriyel Gagnon-Grenier
6个回答

25

试试这个:

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

在 .env 文件中添加

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

刚刚测试了一下,完美运行! - Troy
需要注意的是,Laravel 5 的某些安装默认情况下不带有 config/database.php 文件。我不知道为什么,但我不得不创建一个,而这在 Laravel 5 文档中并没有明确提到(至少我没有找到)。 - russellmania
感谢分享解决方案。我正在使用Laravel 5.3.x。 - Fairuz Sulaiman
1
在 Laravel 5.5 及以上版本中,只需将 DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock 添加到 .env 文件中即可正常工作。 - Rory

8
虽然这是一个很旧的问题,但仍然可以帮助其他人。 因此,我添加了答案。
甚至有简单的解决方案。 将以下内容添加到您的 .env 文件中。
DB_HOST=localhost;unix_socket=/Applications/MAMP/tmp/mysql/mysql.sock

6
在 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', ''),

2

谢谢,帮我解决了迁移问题,使用以下方法:

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
根据@tinyCoder和Esteban Bautista关于UNIX_SOCKET更改为DB_SOCKET的最新信息进行了编辑。 - DerekOBrien

0
在您的.env文件中,只需将此内容简单地添加到您的数据库变量旁边。
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock

-3
我创建了一个StackOverflow账户,仅仅是为了回答这个问题,或许能够帮助防止其他人经历我所经历的痛苦。
我在网上找到的答案包括将127.0.0.1更改为localhost,将端口从3306更改为33060或者反过来,并确保unix_socket正确等。
最终解决我的问题的方法是更改:
DB_CONNECTION=mysql
DB_HOST=localhost

DB_CONNECTION=mysql
DB_HOST=mysql

希望这能帮助到某个人。我花了4个小时才找到这个非常明显的解决方案……而且是在一个不到1000次观看的晦涩的YouTube视频中的1分29秒找到的。

1
除非您的计算机主机名为mysql并且您的数据库正在网络上侦听,否则这将无法工作。 - miken32

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接