在不重新启动服务器的情况下重新加载 .env 变量(Laravel 5,共享主机)

Reloading .env variables without restarting server (Laravel 5, shared hosting)

我的Laravel 5已经运行OK,直到配置好数据库,然后发现这个错误:

SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known

做一些研究似乎我配置 MySQL 访问太晚了,所以我应该重新启动服务器以获得正确的环境变量。好吧,我正在使用 Dreamhost 的共享服务器,但我做不到。

我该如何解决这个问题?

谢谢

您的配置变量可能已被缓存。验证您的 config/app.php 以及 .env 文件,然后尝试

php artisan cache:clear

在命令行上。

config/database.php 中,我将默认数据库连接从 mysql 更改为 sqlite。我删除了 .env 文件(实际上重命名了它)并使用 touch storage/database.sqlite 创建了 sqlite 文件。迁移与 sqlite 一起工作。

然后我将 config/database.php 默认数据库连接切换回 mysql 并恢复了 .env 文件。迁移与 mysql.

一起工作

我想这没有意义。也许是服务器端的东西。

如果您的服务器上有 运行 php artisan config:cache,那么您的 Laravel 应用可能会缓存您放入 .env 文件中的过时配置设置。

运行 php artisan config:clear 解决这个问题。

如果有人偶然发现这个问题无法重新加载他们的网络服务器(长 运行 控制台命令,如队列运行器)或需要在请求中重新加载他们的 .env 文件,我找到了一种正确重新加载的方法laravel 5.

中的 .env 变量
use Dotenv;
use InvalidArgumentException;

try {
    Dotenv::makeMutable();
    Dotenv::load(app()->environmentPath(), app()->environmentFile());
    Dotenv::makeImmutable();
} catch (InvalidArgumentException $e) {
    //
}

一个简短的解决方案:

use Dotenv;

with(new Dotenv(app()->environmentPath(), app()->environmentFile()))->overload();
with(new LoadConfiguration())->bootstrap(app());

在我的例子中,我需要在以编程方式更改 .env 后重新建立数据库连接,但它没有用,如果你遇到这个麻烦试试这个

app('db')->purge($connection->getName()); 

重新加载 .env 后,那是因为 Laravel 应用程序之前可能已经访问了默认连接并且 \Illuminate\Database\DatabaseManager 需要重新读取配置参数。

需要明确的是,您可以根据自己的情况清除 4 种类型的缓存。

php artisan cache:clear

当您希望清除应用程序缓存时,您可以在您的控制台中运行上述语句。它的作用是这条语句清除了storage\framework\cache.

里面的所有缓存
php artisan route:cache

这会清除您的路由缓存。因此,如果您添加了一条新路线或更改了路线控制器或动作,您可以使用这个重新加载相同的路线。

php artisan config:cache 

这将清除 env 文件的缓存并重新加载它

php artisan view:clear 

这将清除您的应用程序的已编译视图文件。

对于共享主机

大多数共享主机提供商不提供对系统的 SSH 访问。在这种情况下,您需要创建一个路由并调用以下行:

Route::get('/clear-cache', function() {
    Artisan::call('cache:clear');
    return "All cache cleared";
});

我知道这是旧的,但对于本地开发人员来说,这就是将内容返回到生产 .env 文件的原因:

rm bootstrap/cache/config.php

然后

php artisan config:cache
php artisan config:clear
php artisan cache:clear

这是我能找到的唯一一个与重新加载 .env 以及现有应用程序实例上的 config($key) 值相关的问题,但其中许多答案可能存在于不同的问题上。

我在 Laravel 6.x 应用程序中使用了以下命令,同时尝试使 artisan 命令使用我的 cypress 环境变量。

对于上下文 $this->laravel === app()

    /**
     * Make the application use the cypress environment variables
     *
     * @return void
     */
    protected function enableCypressEnv()
    {
        // Get all of the original values from config. We need to do this because
        // rebuilding config will skip packages.
        $old = app(Repository::class)->all();

        // Change the applications env file
        $this->laravel->loadEnvironmentFrom('.env.cypress');

        // Reload the app's environment variables 
        Dotenv::create(
            $this->laravel->environmentPath(),
            $this->laravel->environmentFile(),
            Env::getFactory()
        )->overload();

        // Force config to be rebuitl with new env
        (new LoadConfiguration())->bootstrap($this->laravel);
        
        // Get all of the new values from buidling with new env
        $new = app(Repository::class)->all();

        // Merge the new values over the old distinctly
        $merged = array_merge_recursive_distinct($old, $new);

        // Get the applications configuration instance
        $config = config();

        // Overwrite all of the values in the container in accordance with the merged values
        foreach ($merged as $key => $value) {
            $config->set([$key => $value]);
        }
    }

感谢上面的答案,因为它们为我指明了正确的方向,但我会在这里包含我的答案,因为 none 对我来说非常有用。