【问题标题】:Weird Laravel 5 caching using wrong database name奇怪的 Laravel 5 缓存使用错误的数据库名称
【发布时间】:2015-12-28 19:52:24
【问题描述】:

我有两个 Laravel API,它们都在我的本地开发机器上为一个 AngularJS 应用程序提供服务。当 Angular 页面向这两个 API 调用 POST 时,我遇到了一个奇怪的问题,它似乎使用了错误的数据库名称(它使用了另一个 Laravel 实例的数据库)。 Laravel 抛出一个异常,说 Table database.table not found,其中 database 是不正确的数据库。我已经尝试使用 Postman 调用每个 API,并且效果很好,而且我确信在这两个项目中都没有提及其他数据库。

在我看来,这似乎是一个缓存问题,其中 .env 文件可能由于某种原因在两个 Laravel 服务器之间被缓存和共享。两个 Laravel 应用程序都托管在 Apache 上。我已经尝试调用php artisan config:clear 并在 .htaccess 文件中设置了适当的标头以尝试防止任何缓存,但这些都不起作用。我也试过多个浏览器,清了缓存,还是一样的错误。

我希望能够使用 .env 文件,这样我就可以为我的开发服务器拥有一个独特的配置,因此我不想在 config/database.php 中硬编码数据库凭据。任何想法可能是什么问题?

两个 database.php 文件看起来像:

'mysql' => [
'driver'    => 'mysql',
'host'      => env('DB_HOST'),
'database'  => env('DB_DATABASE'),
'username'  => env('DB_USERNAME'),
'password'  => env('DB_PASSWORD'),
'charset'   => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix'    => '',
'strict'    => false, 
],

唯一设置存储在.env中的位置

【问题讨论】:

  • 我仍然没有解决这个问题,但作为一种临时解决方法,我现在只是根据 env('APP_ENV') 的值在 app/config/database.php 中定义数据库凭据,而不是将它们存储在 .env 文件中
  • 停止服务器并再次运行(php artisan serve)
  • 我也遇到了同样的问题。我得到了它的解决方案php artisan optimize 运行这个命令,这个命令将清除配置、路由和文件缓存,并将创建新的缓存。并且每次编辑路由或 .env 后都运行此命令。

标签: php mysql angularjs caching laravel-5.1


【解决方案1】:

对我有用的是通过运行这些命令来清除一堆 Laravel 设置:

php artisan config:clear
php artisan cache:clear
php artisan route:clear
php artisan view:clear
php artisan optimize

我不确定是哪个命令执行的,但 Laravel 现在可以正确识别/读取 .env 文件以用于我的数据库配置。

【讨论】:

  • 谢谢 - 尝试了第一个 (config:clear) 并且成功了。我相信其余的可能是不必要的。
  • 我的 config/database.php 中有一个 die() 并且它没有被调用 - 在我执行 'php artisan config:clear' 之后它被调用(简而言之,这对我有用)
【解决方案2】:

如果有人仍然有这个问题,就像我一样。然后就可以使用命令了:

php artisan config:cache

在设置环境后提到here

现在的问题是,每当团队成员更改任何产品的环境文件中的某些内容时,该命令肯定会运行。

【讨论】:

  • 这行代码拯救了我的一天,谢谢
【解决方案3】:

我遇到了同样的问题,就我而言,这是由 toddbchttps://github.com/vlucas/phpdotenv/issues/76 上报告的问题引起的。

Laravel 依赖于 vlucas/phpdotenv,它使用 PHP 的 putenv().env 文件中添加值,以便您的应用程序可以访问它们。然而,

putenv()getenv() 不需要是可重入的或线程安全的。这意味着如果两个线程碰巧同时调用它们(在不同的内核上,或者从函数中间的上下文切换中),就会发生不好的事情。

因此,两个 PHP 实例(在我的例子中来自不同的应用程序)能够在并发请求期间读取属于彼此的环境变量。

vlucas 在他对问题报告的回复中很有帮助地解释说,这是预期的行为,解决方案是在您的网络服务器配置文件中定义您的环境变量。

对我有用的是从我的 .env 文件中删除 DB_HOSTDB_DATABASEDB_USERNAMEDB_PASSWORD 行,并将以下内容添加到我的 Apache vhost 配置块中:

SetEnv DB_HOST db_host
SetEnv DB_DATABASE db_name
SetEnv DB_USERNAME db_user
SetEnv DB_PASSWORD db_pass

(更改配置后不要忘记重新启动 Apache)

请注意,如果您的 Web 根目录中有一个 Laravel 应用程序,并且在使用 Apache Alias 指令将请求路由到正确应用程序的子目录中安装了另一个 Laravel 应用程序,则您需要使用 SetEnvIf 表示 BOTH 组数据库凭据,如下所示:

# Laravel app 1 in web root
SetEnvIf Host ".*" DB_HOST=db1_host
SetEnvIf Host ".*" DB_DATABASE=db1_name
SetEnvIf Host ".*" DB_USERNAME=db1_user
SetEnvIf Host ".*" DB_PASSWORD=db1_pass

# Laravel app 2 in subdirectory "/subdir"
SetEnvIf Request_URI ^/subdir DB_HOST=db2_host
SetEnvIf Request_URI ^/subdir DB_DATABASE=db2_name
SetEnvIf Request_URI ^/subdir DB_USERNAME=db2_user
SetEnvIf Request_URI ^/subdir DB_PASSWORD=db2_pass

(有关为什么不能同时使用SetEnvSetEnvIf 的解释,请参阅https://staff.washington.edu/fmf/2013/04/24/using-setenv-and-setenvif-together-in-apache/

这个解决方案的好处(如果它适合你的话)是它只需要在问题出现的环境中实现,即如果它只影响你的本地开发环境,那么你的生产不需要任何改变服务器。

【讨论】:

  • PHP FPM 似乎也使用了一些缓存。 echo "" | sudo -S service php7.3-fpm reload 为我解决了这个问题(替换为您的 PHP 版本号)。
【解决方案4】:

老问题,但以防万一其他人发现这种情况发生在他们身上(就像我刚刚发生的那样),我的简单解决方案是更改其中一个项目中 .env 变量的名称:

DB_X_HOST="localhost"
DB_X_DATABASE="other_project"
DB_X_USERNAME="homestead"
DB_X_PASSWORD="secret"
DB_X_PORT="3306"

然后将 config\database.php 中的变量更改为:

'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_X_HOST', '127.0.0.1'),
        'port' => env('DB_X_PORT', '3306'),
        'database' => env('DB_X_DATABASE', 'forge'),
        'username' => env('DB_X_USERNAME', 'forge'),
        'password' => env('DB_X_PASSWORD', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ]

现在你不应该在 Mark 的回复中详细说明交叉污染

【讨论】:

  • 最佳答案。更改变量名称对我有用。
  • 我同意,最好的解决方案
【解决方案5】:

使用php artisan serve 重新启动服务器为我解决了同样的问题

【讨论】:

    【解决方案6】:

    你需要做的就是输入这个命令:

    php artisan config:cache
    

    【讨论】:

      【解决方案7】:

      我也有同样的问题。一个网页将请求来自 laravel 的具有不同数据集的 5 个 json 响应,并且大约一半的请求会因“不正确的数据库”错误而轰炸,即使当您在自己的浏览器选项卡中重新加载这些确切的请求时它们也能正常工作。似乎是一个与处理来自 apache 的同时 Web 请求有关的 Laravel 错误。

      无论如何,我的解决方法是在我的 config\database.php 文件中对所有连接的主机、数据库、用户名和密码进行硬编码,现在我的 json 请求不再爆炸。然而,不得不将密码硬编码到源代码控制中并处理多种环境,这很糟糕——基本上可以追溯到 .env 文件存在之前的黑暗时代。

      【讨论】:

        【解决方案8】:

        这对我有用:

        php artisan config:cache
        

        【讨论】:

        • 嗨,Toufic!您能否解释一下这个解决方案的作用,为什么它可以解决这个问题,甚至可能提供一些外部链接以获取有关您的解决方案的更多信息?谢谢:)
        【解决方案9】:

        什么对我有用,没有额外的操作只是清除缓存并重新启动Apache2

        php artisan config:cache
        sudo /etc/init.d/apache2 restart
        

        【讨论】:

          【解决方案10】:

          如果你想使用.env.production,你可以通过添加--env = production来强制返回此错误的命令使用env文件

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-10-14
            • 2015-12-18
            • 1970-01-01
            • 1970-01-01
            • 2015-01-03
            • 2018-01-25
            • 2018-06-08
            • 2016-09-30
            相关资源
            最近更新 更多