配置
简介
Laravel 框架的所有配置文件都存储在 config 目录中。每个选项都有文档,您可以随时查看文件并熟悉可用的选项。
这些配置文件允许您配置诸如数据库连接信息、邮件服务器信息以及应用程序 URL 和加密密钥等各种其他核心配置值。
about 命令
Laravel 可以通过 about Artisan 命令显示应用程序配置、驱动程序和环境的概览。
php artisan about
如果您只对应用程序概览输出中的特定部分感兴趣,可以使用 --only 选项进行筛选:
php artisan about --only=environment
或者,要详细探索特定配置文件的值,您可以使用 config:show Artisan 命令:
php artisan config:show database
环境配置
根据应用程序运行的环境拥有不同的配置值通常很有用。例如,您可能希望在本地使用与生产服务器上不同的缓存驱动程序。
为了让这变得轻而易举,Laravel 利用了 DotEnv PHP 库。在全新的 Laravel 安装中,应用程序的根目录将包含一个 .env.example 文件,该文件定义了许多常见的环境变量。在 Laravel 安装过程中,此文件将自动复制到 .env。
Laravel 的默认 .env 文件包含一些常见的配置值,这些值可能因您的应用程序是在本地运行还是在生产 Web 服务器上运行而异。然后,这些值通过 Laravel 的 env 函数由 config 目录中的配置文件读取。
如果您正在与一个团队一起开发,您可能希望继续在您的应用程序中包含和更新 .env.example 文件。通过在示例配置文件中放置占位符值,您团队中的其他开发者可以清楚地看到运行您的应用程序需要哪些环境变量。
.env 文件中的任何变量都可以被外部环境变量(例如服务器级别或系统级别环境变量)覆盖。环境文件安全
您的 .env 文件不应提交到应用程序的源代码控制中,因为使用您的应用程序的每个开发者/服务器可能需要不同的环境配置。此外,如果入侵者获得对您源代码控制仓库的访问权限,这会是一个安全风险,因为任何敏感凭据都将被暴露。
但是,可以使用 Laravel 的内置 环境加密 来加密您的环境文件。加密的环境文件可以安全地放置在源代码控制中。
额外的环境文件
在加载应用程序的环境变量之前,Laravel 会确定是否已从外部提供了 APP_ENV 环境变量或是否指定了 --env CLI 参数。如果是,Laravel 将尝试加载 .env.[APP_ENV] 文件(如果存在)。如果不存在,则将加载默认的 .env 文件。
环境变量类型
您的 .env 文件中的所有变量通常都解析为字符串,因此已创建一些保留值,以便您可以从 env() 函数返回更广泛的类型:
.env 值 | env() 值 |
|---|---|
true | (bool) true |
(true) | (bool) true |
false | (bool) false |
(false) | (bool) false |
empty | (string) '' |
(empty) | (string) '' |
null | (null) null |
(null) | (null) null |
如果您需要定义一个值中包含空格的环境变量,您可以通过将值括在双引号中来实现:
APP_NAME="My Application"
检索环境配置
当您的应用程序收到请求时,.env 文件中列出的所有变量都将加载到 $_ENV PHP 超级全局变量中。但是,您可以在配置文件中使用 env 函数从这些变量中检索值。事实上,如果您查看 Laravel 配置文件,您会注意到许多选项已经在使用此函数:
'debug' => env('APP_DEBUG', false),
传递给 env 函数的第二个值是 “默认值”。如果给定键不存在任何环境变量,则将返回此值。
确定当前环境
当前应用程序环境通过您的 .env 文件中的 APP_ENV 变量确定。您可以通过 App facade 上的 environment 方法访问此值:
use Illuminate\Support\Facades\App;
$environment = App::environment();
您还可以将参数传递给 environment 方法以确定环境是否与给定值匹配。如果环境与任何给定值匹配,该方法将返回 true:
if (App::environment('local')) {
// 环境是本地的
}
if (App::environment(['local', 'staging'])) {
// 环境是本地的或者暂存的...
}
APP_ENV 环境变量来覆盖。加密环境文件
未加密的环境文件绝不应存储在源代码控制中。但是,Laravel 允许您加密环境文件,以便它们可以安全地与应用程序的其余部分一起添加到源代码控制中。
加密
要加密环境文件,您可以使用 env:encrypt 命令:
php artisan env:encrypt
运行 env:encrypt 命令将加密您的 .env 文件并将加密内容放置在 .env.encrypted 文件中。解密密钥显示在命令的输出中,应存储在安全的密码管理器中。如果您想提供自己的加密密钥,您可以在调用命令时使用 --key 选项:
php artisan env:encrypt --key=3UVsEgGVK36XN82KKeyLFMhvosbZN1aF
AES-256-CBC 密码,该密码需要 32 个字符的密钥。您可以通过在调用命令时传递 --cipher 选项来自由使用 Laravel 的 加密器 支持的任何密码。如果您的应用程序有多个环境文件,例如 .env 和 .env.staging,您可以通过 --env 选项提供环境名称来指定应加密的环境文件:
php artisan env:encrypt --env=staging
解密
要解密环境文件,您可以使用 env:decrypt 命令。此命令需要一个解密密钥,Laravel 将从 LARAVEL_ENV_ENCRYPTION_KEY 环境变量中检索该密钥:
php artisan env:decrypt
或者,可以通过 --key 选项直接将密钥提供给命令:
php artisan env:decrypt --key=3UVsEgGVK36XN82KKeyLFMhvosbZN1aF
当调用 env:decrypt 命令时,Laravel 将解密 .env.encrypted 文件的内容并将解密后的内容放置在 .env 文件中。
可以向 env:decrypt 命令提供 --cipher 选项以使用自定义加密密码:
php artisan env:decrypt --key=qUWuNRdfuImXcKxZ --cipher=AES-128-CBC
如果您的应用程序有多个环境文件,例如 .env 和 .env.staging,您可以通过 --env 选项提供环境名称来指定应解密的环境文件:
php artisan env:decrypt --env=staging
为了覆盖现有的环境文件,您可以向 env:decrypt 命令提供 --force 选项:
php artisan env:decrypt --force
访问配置值
您可以使用 Config Facade 或全局 config 函数从应用程序中的任何位置轻松访问您的配置值。可以使用 “点” 语法访问配置值,该语法包括您希望访问的文件名和选项。还可以指定一个默认值,如果配置选项不存在,则会返回该值:
use Illuminate\Support\Facades\Config;
$value = Config::get('app.timezone');
$value = config('app.timezone');
// 如果配置值不存在,则检索默认值...
$value = config('app.timezone', 'Asia/Seoul');
要在运行时设置配置值,您可以调用 Config Facade 的 set 方法或将数组传递给 config 函数:
Config::set('app.timezone', 'America/Chicago');
config(['app.timezone' => 'America/Chicago']);
为了帮助进行静态分析,Config Facade 还提供了类型化的配置检索方法。如果检索到的配置值与预期类型不匹配,则会抛出异常:
Config::string('config-key');
Config::integer('config-key');
Config::float('config-key');
Config::boolean('config-key');
Config::array('config-key');
Config::collection('config-key');
配置缓存
为了提高应用程序的速度,您应该使用 config:cache Artisan 命令将所有配置文件缓存到单个文件中。这将把应用程序的所有配置选项组合到一个文件中,框架可以快速加载该文件。
您通常应该将 php artisan config:cache 命令作为生产部署过程的一部分来运行。该命令不应在本地开发期间运行,因为在应用程序开发过程中配置选项会经常需要更改。
一旦配置被缓存,在请求或 Artisan 命令期间,框架将不会加载您的应用程序的 .env 文件;因此,env 函数将只返回外部、系统级别的环境变量。
因此,您应确保只从应用程序的配置(config)文件内部调用 env 函数。通过检查 Laravel 的默认配置文件,您可以看到许多示例。可以使用上面描述的 config 函数从应用程序中的任何位置访问配置值。
config:clear 命令可用于清除缓存的配置:
php artisan config:clear
config:cache 命令,您应该确保只从配置文件中调用 env 函数。一旦配置被缓存,.env 文件将不会被加载;因此,env 函数将只返回外部、系统级别的环境变量。配置发布
Laravel 的大多数配置文件已发布在您的应用程序的 config 目录中;但是,某些配置文件(例如 cors.php 和 view.php)默认未发布,因为大多数应用程序永远不需要修改它们。
但是,您可以使用 config:publish Artisan 命令发布任何默认未发布的配置文件:
php artisan config:publish
php artisan config:publish --all
调试模式
您的 config/app.php 配置文件中的 debug 选项决定了向用户实际显示多少有关错误的信息。默认情况下,该选项会遵循存储在 .env 文件中的 APP_DEBUG 环境变量的值。
APP_DEBUG 环境变量设置为 true。在您的生产环境中,此值应始终为 false。如果该变量在生产中设置为 true,您就有可能向应用程序的最终用户暴露敏感配置值。维护模式
当您的应用程序处于维护模式时,将为所有进入应用程序的请求显示一个自定义视图。这使得在应用程序更新或您执行维护时 “禁用” 应用程序变得容易。维护模式检查包含在应用程序的默认中间件堆栈中。如果应用程序处于维护模式,将抛出状态码为 503 的 Symfony\Component\HttpKernel\Exception\HttpException 实例。
要启用维护模式,请执行 down Artisan 命令:
php artisan down
如果您希望所有维护模式响应都发送 Refresh HTTP 标头,您可以在调用 down 命令时提供 refresh 选项。Refresh 标头将指示浏览器在指定秒数后自动刷新页面:
php artisan down --refresh=15
您还可以向 down 命令提供 retry 选项,该选项将设置为 Retry-After HTTP 标头的值,尽管浏览器通常会忽略此标头:
php artisan down --retry=60
绕过维护模式
为了允许使用秘密令牌绕过维护模式,您可以使用 secret 选项指定维护模式绕过令牌:
php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"
将应用程序置于维护模式后,您可以导航到与此令牌匹配的应用程序 URL,Laravel 将向您的浏览器颁发绕过维护模式的 Cookie:
https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515
如果您希望 Laravel 为您生成秘密令牌,您可以使用 with-secret 选项。一旦应用程序处于维护模式,秘密将显示给您:
php artisan down --with-secret
当访问此隐藏路由时,您将被重定向到应用程序的 / 路由。一旦 Cookie 颁发给您的浏览器,您将能够正常浏览应用程序,就像它没有处于维护模式一样。
? 或 &。多服务器上的维护模式
默认情况下,Laravel 使用基于文件的系统来确定您的应用程序是否处于维护模式。这意味着要激活维护模式,必须在托管您的应用程序的每台服务器上执行 php artisan down 命令。
或者,Laravel 提供了一种基于缓存的方法来处理维护模式。此方法只需要在一台服务器上运行 php artisan down 命令。要使用此方法,请修改应用程序 .env 文件中的维护模式变量。您应该选择所有服务器都可以访问的缓存 store。这确保了维护模式状态在每台服务器上都保持一致:
APP_MAINTENANCE_DRIVER=cache
APP_MAINTENANCE_STORE=database
预渲染维护模式视图
如果您在部署期间使用 php artisan down 命令,如果用户在您的 Composer 依赖项或其他基础架构组件正在更新时访问应用程序,他们有时可能仍然会遇到错误。发生这种情况是因为 Laravel 框架的很大一部分必须启动才能确定您的应用程序处于维护模式并使用模板引擎渲染维护模式视图。
因此,Laravel 允许您预渲染一个维护模式视图,该视图将在请求周期的最开始返回。此视图在您的任何应用程序依赖项加载之前渲染。您可以使用 down 命令的 render 选项预渲染您选择的模板:
php artisan down --render="errors::503"
重定向维护模式请求
在维护模式下,Laravel 将为用户尝试访问的所有应用程序 URL 显示维护模式视图。如果您愿意,您可以指示 Laravel 将所有请求重定向到特定 URL。这可以通过使用 redirect 选项来实现。例如,您可能希望将所有请求重定向到 / URI:
php artisan down --redirect=/
禁用维护模式
要禁用维护模式,请使用 up 命令:
php artisan up
resources/views/errors/503.blade.php 中定义自己的模板来自定义默认的维护模式模板。维护模式和队列
当您的应用程序处于维护模式时,不会处理任何 排队的作业。一旦应用程序退出维护模式,作业将继续正常处理。
维护模式的替代方案
由于维护模式会让你的应用短暂停机几秒钟,因此建议将应用部署在像 Laravel Cloud 这样的全托管平台上,以实现 Laravel 的零停机部署。