跳到内容

配置

简介

Laravel 框架的所有配置文件都存储在 config 目录中。每个选项都有文档记录,因此请随意浏览这些文件,熟悉可用的选项。

这些配置文件允许您配置诸如数据库连接信息、邮件服务器信息以及各种其他核心配置值,例如应用程序 URL 和加密密钥。

about 命令

Laravel 可以通过 about Artisan 命令显示应用程序配置、驱动程序和环境的概览。

1php artisan about

如果您只对应用程序概览输出的特定部分感兴趣,您可以使用 --only 选项来筛选该部分

1php artisan about --only=environment

或者,要详细探索特定配置文件的值,您可以使用 config:show Artisan 命令

1php artisan config:show database

环境配置

根据应用程序运行的环境使用不同的配置值通常很有帮助。例如,您可能希望在本地使用与生产服务器上不同的缓存驱动程序。

为了简化此操作,Laravel 使用了 DotEnv PHP 库。在全新的 Laravel 安装中,应用程序的根目录将包含一个 .env.example 文件,其中定义了许多常见的环境变量。在 Laravel 安装过程中,此文件将自动复制到 .env

Laravel 的默认 .env 文件包含一些常见的配置值,这些值可能因应用程序是在本地还是在生产 Web 服务器上运行而异。然后,这些值由 config 目录中的配置文件使用 Laravel 的 env 函数读取。

如果您正在与团队一起开发,您可能希望继续包含和更新应用程序的 .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

如果您需要定义一个值包含空格的环境变量,您可以通过将该值用双引号括起来来实现

1APP_NAME="My Application"

检索环境配置

当您的应用程序收到请求时,.env 文件中列出的所有变量都将加载到 $_ENV PHP 超全局变量中。但是,您可以使用 env 函数从配置文件中检索这些变量的值。实际上,如果您查看 Laravel 配置文件,您会注意到许多选项已经在使用此函数

1'debug' => env('APP_DEBUG', false),

传递给 env 函数的第二个值是“默认值”。如果给定键不存在环境变量,则将返回此值。

确定当前环境

当前应用程序环境通过 .env 文件中的 APP_ENV 变量确定。您可以通过 App 外观模式上的 environment 方法访问此值

1use Illuminate\Support\Facades\App;
2 
3$environment = App::environment();

您还可以将参数传递给 environment 方法,以确定环境是否与给定值匹配。如果环境与任何给定值匹配,该方法将返回 true

1if (App::environment('local')) {
2 // The environment is local
3}
4 
5if (App::environment(['local', 'staging'])) {
6 // The environment is either local OR staging...
7}

可以通过定义服务器级别的 APP_ENV 环境变量来覆盖当前应用程序环境检测。

加密环境文件

未加密的环境文件永远不应存储在源代码控制中。但是,Laravel 允许您加密环境文件,以便可以安全地将其添加到源代码控制中,与应用程序的其余部分一起。

加密

要加密环境文件,您可以使用 env:encrypt 命令

1php artisan env:encrypt

运行 env:encrypt 命令将加密您的 .env 文件,并将加密的内容放在 .env.encrypted 文件中。解密密钥显示在命令的输出中,应存储在安全的密码管理器中。如果您想提供自己的加密密钥,您可以在调用命令时使用 --key 选项

1php artisan env:encrypt --key=3UVsEgGVK36XN82KKeyLFMhvosbZN1aF

提供的密钥长度应与正在使用的加密密码所需的密钥长度匹配。默认情况下,Laravel 将使用 AES-256-CBC 密码,该密码需要 32 个字符的密钥。您可以使用 Laravel 的加密器支持的任何密码,方法是在调用命令时传递 --cipher 选项。

如果您的应用程序有多个环境文件,例如 .env.env.staging,您可以通过 --env 选项提供环境名称来指定应加密的环境文件

1php artisan env:encrypt --env=staging

解密

要解密环境文件,您可以使用 env:decrypt 命令。此命令需要解密密钥,Laravel 将从 LARAVEL_ENV_ENCRYPTION_KEY 环境变量中检索该密钥

1php artisan env:decrypt

或者,可以通过 --key 选项直接将密钥提供给命令

1php artisan env:decrypt --key=3UVsEgGVK36XN82KKeyLFMhvosbZN1aF

当调用 env:decrypt 命令时,Laravel 将解密 .env.encrypted 文件的内容,并将解密的内容放在 .env 文件中。

可以为 env:decrypt 命令提供 --cipher 选项,以便使用自定义加密密码

1php artisan env:decrypt --key=qUWuNRdfuImXcKxZ --cipher=AES-128-CBC

如果您的应用程序有多个环境文件,例如 .env.env.staging,您可以通过 --env 选项提供环境名称来指定应解密的环境文件

1php artisan env:decrypt --env=staging

为了覆盖现有的环境文件,您可以为 env:decrypt 命令提供 --force 选项

1php artisan env:decrypt --force

访问配置值

您可以从应用程序中的任何位置轻松使用 Config 外观模式或全局 config 函数访问您的配置值。可以使用“点”语法访问配置值,其中包括您要访问的文件和选项的名称。还可以指定默认值,如果配置选项不存在,则将返回该默认值

1use Illuminate\Support\Facades\Config;
2 
3$value = Config::get('app.timezone');
4 
5$value = config('app.timezone');
6 
7// Retrieve a default value if the configuration value does not exist...
8$value = config('app.timezone', 'Asia/Seoul');

要在运行时设置配置值,您可以调用 Config 外观模式的 set 方法,或将数组传递给 config 函数

1Config::set('app.timezone', 'America/Chicago');
2 
3config(['app.timezone' => 'America/Chicago']);

为了帮助进行静态分析,Config 外观模式还提供了类型化的配置检索方法。如果检索到的配置值与预期类型不匹配,则将抛出异常

1Config::string('config-key');
2Config::integer('config-key');
3Config::float('config-key');
4Config::boolean('config-key');
5Config::array('config-key');

配置缓存

为了提高应用程序的速度,您应该使用 config:cache Artisan 命令将所有配置文件缓存到单个文件中。这将把应用程序的所有配置选项合并到一个文件中,框架可以快速加载该文件。

您通常应在生产部署过程中运行 php artisan config:cache 命令。该命令不应在本地开发期间运行,因为在应用程序开发过程中,配置选项经常需要更改。

配置缓存后,框架在请求或 Artisan 命令期间不会加载应用程序的 .env 文件;因此,env 函数将仅返回外部的系统级环境变量。

因此,您应确保仅从应用程序的配置(config)文件中调用 env 函数。您可以通过检查 Laravel 的默认配置文件来查看许多示例。可以使用 上面描述的 config 函数从应用程序中的任何位置访问配置值。

可以使用 config:clear 命令清除缓存的配置

1php artisan config:clear

如果您在部署过程中执行 config:cache 命令,则应确保仅从配置文件中调用 env 函数。配置缓存后,将不会加载 .env 文件;因此,env 函数将仅返回外部的系统级环境变量。

配置发布

Laravel 的大多数配置文件已经发布在应用程序的 config 目录中;但是,某些配置文件(如 cors.phpview.php)默认情况下未发布,因为大多数应用程序永远不需要修改它们。

但是,您可以使用 config:publish Artisan 命令来发布默认情况下未发布的任何配置文件

1php artisan config:publish
2 
3php artisan config:publish --all

调试模式

config/app.php 配置文件中的 debug 选项确定实际向用户显示多少错误信息。默认情况下,此选项设置为遵循 APP_DEBUG 环境变量的值,该变量存储在您的 .env 文件中。

对于本地开发,您应将 APP_DEBUG 环境变量设置为 true在您的生产环境中,此值应始终为 false。如果该变量在生产环境中设置为 true,您可能会将敏感配置值暴露给应用程序的最终用户。

维护模式

当您的应用程序处于维护模式时,将为所有进入您应用程序的请求显示自定义视图。这使得在更新或执行维护时可以轻松“禁用”您的应用程序。维护模式检查包含在应用程序的默认中间件堆栈中。如果应用程序处于维护模式,则会抛出状态代码为 503 的 Symfony\Component\HttpKernel\Exception\HttpException 实例。

要启用维护模式,请执行 down Artisan 命令

1php artisan down

如果您希望 Refresh HTTP 标头与所有维护模式响应一起发送,您可以在调用 down 命令时提供 refresh 选项。Refresh 标头将指示浏览器在指定的秒数后自动刷新页面

1php artisan down --refresh=15

您还可以为 down 命令提供 retry 选项,该选项将设置为 Retry-After HTTP 标头的值,尽管浏览器通常会忽略此标头

1php artisan down --retry=60

绕过维护模式

要允许使用密钥令牌绕过维护模式,您可以使用 secret 选项来指定维护模式绕过令牌

1php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"

将应用程序置于维护模式后,您可以导航到与此令牌匹配的应用程序 URL,Laravel 将向您的浏览器颁发维护模式绕过 Cookie

1https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515

如果您希望 Laravel 为您生成密钥令牌,您可以使用 with-secret 选项。密钥将在应用程序处于维护模式后显示给您

1php artisan down --with-secret

访问此隐藏路由时,您将被重定向到应用程序的 / 路由。一旦 Cookie 颁发给您的浏览器,您就可以像应用程序未处于维护模式一样正常浏览应用程序。

您的维护模式密钥通常应包含字母数字字符,并且可以选择使用破折号。您应避免使用在 URL 中具有特殊含义的字符,例如 ?&

多服务器上的维护模式

默认情况下,Laravel 使用基于文件的系统来确定您的应用程序是否处于维护模式。这意味着要激活维护模式,必须在托管应用程序的每台服务器上执行 php artisan down 命令。

或者,Laravel 提供了一种基于缓存的方法来处理维护模式。此方法只需要在一台服务器上运行 php artisan down 命令。要使用此方法,请将应用程序的 config/app.php 文件中的“driver”设置修改为 cache。然后,选择一个所有服务器都可以访问的缓存 store。这确保了维护模式状态在每台服务器上都保持一致。

1'maintenance' => [
2 'driver' => 'cache',
3 'store' => 'database',
4],

预渲染维护模式视图

如果您在部署期间使用 php artisan down 命令,则如果用户在 Composer 依赖项或其他基础结构组件正在更新时访问应用程序,则用户仍可能偶尔遇到错误。发生这种情况是因为必须启动 Laravel 框架的很大一部分,才能确定您的应用程序处于维护模式并使用模板引擎渲染维护模式视图。

因此,Laravel 允许您预渲染维护模式视图,该视图将在请求周期的最开始返回。此视图在加载任何应用程序依赖项之前呈现。您可以使用 down 命令的 render 选项预渲染您选择的模板

1php artisan down --render="errors::503"

重定向维护模式请求

在维护模式下,Laravel 将为用户尝试访问的所有应用程序 URL 显示维护模式视图。如果您愿意,您可以指示 Laravel 将所有请求重定向到特定 URL。这可以使用 redirect 选项完成。例如,您可能希望将所有请求重定向到 / URI

1php artisan down --redirect=/

禁用维护模式

要禁用维护模式,请使用 up 命令

1php artisan up

您可以通过在 resources/views/errors/503.blade.php 定义自己的模板来自定义默认维护模式模板。

维护模式和队列

当您的应用程序处于维护模式时,将不会处理任何队列任务。一旦应用程序退出维护模式,这些任务将继续像往常一样处理。

维护模式的替代方案

由于维护模式需要您的应用程序停机几秒钟,请考虑在完全托管的平台(如 Laravel Cloud)上运行您的应用程序,以实现 Laravel 的零停机部署。

Laravel 是构建、部署和监控软件的最有效方式。
构建、部署和监控软件的最有效方式。