【问题标题】:Laravel Homestead Vagrant Box Database ProblemsLaravel Homestead Vagrant Box 数据库问题
【发布时间】:2014-07-25 18:05:59
【问题描述】:

在浏览器中浏览本地网站(example.app:8000)和使用 php artisan migrate 时,我无法使用相同的 database.php 设置。

如果我的 database.php 设置是:

'mysql' => array(
   'driver'    => 'mysql',
   'host'      => '127.0.0.1',
   'database'  => 'homestead',
   'username'  => 'homestead',
   'password'  => 'secret',
   'charset'   => 'utf8',
   'collation' => 'utf8_unicode_ci',
   'prefix'    => '',
   'port'      => '33060'
)

Artisan 工作,但我在浏览网站时得到了这个:

SQLSTATE[HY000] [2003] 无法连接到“127.0.0.1”上的 MySQL 服务器 (111)(查看:/home/vagrant/Code/playnamics/app/views/hello.blade.php)

如果我的 database.php 设置是:

'mysql' => array(
   'driver'    => 'mysql',
   'host'      => 'localhost',
   'database'  => 'homestead',
   'username'  => 'homestead',
   'password'  => 'secret',
   'charset'   => 'utf8',
   'collation' => 'utf8_unicode_ci',
   'prefix'    => '',
   'port'      => '33060'
)

浏览网站有效,但工匠给出此错误:

[PDOException] SQLSTATE[HY000] [2002] 没有这样的文件或目录

基本上,我需要在浏览时将主机设置为 localhost,在使用 artisan 时需要将主机设置为 127.0.0.1。我怎样才能简单地使用同一个主机,这样我就不必每 2 分钟更改一次值?

真的很困惑。在我开始使用宅基地和流浪者之前似乎更简单......:/

【问题讨论】:

    标签: mysql laravel vagrant


    【解决方案1】:

    Ben Swinburne 的回答对我有用。

    我将以下内容添加到我的 Homestead.yaml 文件中

    variables:
     - key: APP_ENV
       value: local
     - key: DB_HOST
       value: 127.0.0.1
     - key: DB_PORT
       value: 3306
    

    这更新了我们的代码用于从 VM 内连接到 mysql 的内容。因为它们是在 VM 中设置的,所以它们将优先于 .env 文件中的内容。我相信 .env 文件中的值只有在服务器环境变量中不存在时才会设置。

    然后在主机上运行的 .env 中,我需要从进入的虚拟机外部连接到 mysql。

    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=33060
    DB_DATABASE=mydb
    DB_USERNAME=homestead
    DB_PASSWORD=mypassword
    

    现在,我可以在 VM 外部和 VM 内部使用 artisan migrate,而不会出现任何连接和端口问题。浏览网站也能正常工作。

    【讨论】:

      【解决方案2】:

      我这样做的方法是在homestead.yml 文件中设置变量。如果值存在,PhpDotenv 不会填充这些值,因此您可以在 Homestead VM 上设置环境变量并进行配置

      # homestead.yml
      
      variables:
       - key: APP_ENV
         value: local
       - key: DB_HOST
         value: 127.0.0.1
       - key: DB_PORT
         value: 3306
      
      # .env
      
      DB_HOST=192.168.10.10 # Homestead VM IP
      DB_PORT=33060         # Port which is forwarded to 3306 on the VM 
      

      --

      vagrant@homestead:~/Sites/example$ php artisan migrate

      没有要迁移的东西。

      --

      本在 ~/Sites/example on develop$ php artisan migrate

      没有要迁移的东西。

      这显然假设在 Homestead 上运行的所有站点都使用 MySQL(或 3306 上的某个数据库),并且所有数据库都在 Homestead VM 上,而不是在主机上,或者在第 3 方,比如 AWS 等。

      在撰写本文时,宅基地不允许您配置每个站点的变量。

      【讨论】:

        【解决方案3】:

        快速修复:

        1. ssh 进入你的宅基地虚拟机 (homestead ssh)
        2. 导航到项目目录
        3. 从那里运行你的命令 (php artisan migrate)

        【讨论】:

          【解决方案4】:

          使用 homestead ssh 并粘贴您的 ssh vagrant@127.0.0.1 -p 2222 我们的 php artisan migrate 工作正常

          【讨论】:

            【解决方案5】:

            您必须从 VM 内部执行迁移命令。首先,您登录虚拟机:

            ssh vagrant@127.0.0.1 -p 2222
            

            之后,您只需 cd 进入项目文件夹并运行迁移

            cd Code/blog
            php artisan migrate
            

            之所以会出现这种情况,是因为 localhost:3306 从你机器的角度看是一回事,从 VM 内部看又是另一回事。

            【讨论】:

            • 如果你正在使用 vagrant,那么只需执行 vagrant ssh
            【解决方案6】:

            在 homestead 中,MySQL 配置为绑定到 VM 的 10.x.x.x 地址,而不绑定到 127.0.0.1

            您可以通过编辑 /etc/mysql/my.cnf 并添加以下行来更改此设置:

            bind-address = 0.0.0.0

            这将允许您在数据库配置中使用 127.0.0.1 以用于数据库的 Web 和 CLI 使用。

            【讨论】:

              【解决方案7】:

              这是我在 Laracasts 论坛上的回答,以防有帮助:

              在 VM 内部,sql 端口是 3306。在 VM 外部,主机只转发到 VM 上的 SQL 端口。这就是为什么 33060 指向 3306。

              不幸的是,这就是为什么您不能对两者使用相同的数据库节。

              想到两个想法:

              1. 在 homestead.rb 文件中的主机上也将 sql 端口从 33060 更改为 3306。我知道如果您在端口 10000 下选择某些东西,机器会变得很挑剔,因此您可能会被提示输入管理员凭据(如果它甚至允许您的话)。只要您不在该端口上运行某些东西,它“应该”工作。

              2. 您可以考虑设置两个 Laravel 环境,用于在 VM 外部工作,一个用于内部工作。这样,您可以在 VM 上运行 artisan 命令或在主机上运行 artisan 时覆盖 database.php 设置。实际上,您只关心更改端口号,因为所有其他设置都是相同的。您可以保留其他所有内容。

              只是尝试一下。我只是让一个 SSH 会话对 VM 开放并在那里运行命令,因为在恢复机器后连接到它的速度非常快。

              【讨论】:

              • SSH 进入 VM 并运行 artisan 命令是 def。最简单的方法。
              • 第二个想法很棒,我创建了一个开发环境让我在我的主机上运行 migrate
              猜你喜欢
              • 1970-01-01
              • 2016-09-27
              • 2015-09-14
              • 1970-01-01
              • 1970-01-01
              • 2015-07-22
              • 2016-05-21
              • 2019-04-24
              • 1970-01-01
              相关资源
              最近更新 更多