在不重新启动服务器的情况下重新加载 .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 对我来说非常有用。
我的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 对我来说非常有用。