为同一台服务器上的多个 HTTP 主机部署相同的 Laravel 代码库
Deploying the same Laravel codebase for multiple HTTP hosts on the same server
我在 Laravel 中编写了一个后端,我需要在同一台物理服务器上部署两次。我需要为此使用两个不同的数据库,但由于它们在同一台服务器上,我无法在 Laravel.
中使用 built-in 主机检测
目前,我通过将我的配置文件包装在这段代码中来解决"fixed"问题:
if ($_SERVER["HTTP_HOST"] === "example.com") {
return config array...
} else if ($_SERVER["HTTP_HOST"] === "example.net") {
return config array...
}
但这打破了 artisan,所以不再有 php artisan down|up
或 php artisan cache:clear
。
一定有更好的方法来实现这一点,不是吗?
默认情况下 Laravel 使用您的主机名,如您所说 - 但是您也可以将闭包传递给 detectEnvironment
方法以使用更复杂的逻辑来设置您的环境。
类似这样的东西,例如:
$env = $app->detectEnvironment(function()
{
// if statements because staging and live used the same domain,
// and this app used wildcard subdomains. you could compress this
// to a switch if your logic is simpler.
if (isset($_SERVER['HTTP_HOST']))
{
if (ends_with($_SERVER['HTTP_HOST'], 'local.dev'))
{
return 'local';
}
if (ends_with($_SERVER['HTTP_HOST'], 'staging.server.com'))
{
return 'staging';
}
if (ends_with($_SERVER['HTTP_HOST'], 'server.com'))
{
return 'production';
}
// Make sure there is always an environment set.
throw new RuntimeException('Could not determine the execution environment.');
}
});
这与 artisan 无关,但是 - HTTP_HOST
不会设置在那里。如果不同的站点 运行 在不同的用户下,您可以使用 $_SERVER['USER']
做另一个单独的 switch 语句。如果不是,您也可以使用安装路径作为区分方式。
我在 Laravel 中编写了一个后端,我需要在同一台物理服务器上部署两次。我需要为此使用两个不同的数据库,但由于它们在同一台服务器上,我无法在 Laravel.
中使用 built-in 主机检测目前,我通过将我的配置文件包装在这段代码中来解决"fixed"问题:
if ($_SERVER["HTTP_HOST"] === "example.com") {
return config array...
} else if ($_SERVER["HTTP_HOST"] === "example.net") {
return config array...
}
但这打破了 artisan,所以不再有 php artisan down|up
或 php artisan cache:clear
。
一定有更好的方法来实现这一点,不是吗?
默认情况下 Laravel 使用您的主机名,如您所说 - 但是您也可以将闭包传递给 detectEnvironment
方法以使用更复杂的逻辑来设置您的环境。
类似这样的东西,例如:
$env = $app->detectEnvironment(function()
{
// if statements because staging and live used the same domain,
// and this app used wildcard subdomains. you could compress this
// to a switch if your logic is simpler.
if (isset($_SERVER['HTTP_HOST']))
{
if (ends_with($_SERVER['HTTP_HOST'], 'local.dev'))
{
return 'local';
}
if (ends_with($_SERVER['HTTP_HOST'], 'staging.server.com'))
{
return 'staging';
}
if (ends_with($_SERVER['HTTP_HOST'], 'server.com'))
{
return 'production';
}
// Make sure there is always an environment set.
throw new RuntimeException('Could not determine the execution environment.');
}
});
这与 artisan 无关,但是 - HTTP_HOST
不会设置在那里。如果不同的站点 运行 在不同的用户下,您可以使用 $_SERVER['USER']
做另一个单独的 switch 语句。如果不是,您也可以使用安装路径作为区分方式。