PHP云原生应用与12Factor方法论

12Factor是构建云原生应用的方法论。它提供了让应用可移植、可扩展的最佳实践。今天说说PHP应用如何遵循12Factor方法论。

12Factor的基准代码原则要求每个应用有独立的版本控制仓库。

```php
// 基准代码:一个应用对应一个代码仓库
// 不同环境使用不同部署,不修改代码
// config/
// production.php
// staging.php
// development.php

// 依赖声明:使用Composer管理依赖
// composer.json 声明所有依赖
// composer.lock 锁定版本

// 配置:将配置存储在环境变量中
class Config
{
public static function get(string $key, mixed $default = null): mixed
{
$value = getenv($key);
if ($value === false) {
return defined($key) ? constant($key) : $default;
}

return match (strtolower($value)) {
'true', '(true)' => true,
'false', '(false)' => false,
'null', '(null)' => null,
default => $value,
};
}

public static function database(): array
{
$url = self::get('DATABASE_URL');
if ($url) {
$parts = parse_url($url);
return [
'driver' => $parts['scheme'] ?? 'mysql',
'host' => $parts['host'] ?? 'localhost',
'port' => $parts['port'] ?? 3306,
'database' => ltrim($parts['path'] ?? '', '/'),
'username' => $parts['user'] ?? 'root',
'password' => $parts['pass'] ?? '',
];
}

return [
'driver' => self::get('DB_CONNECTION', 'mysql'),
'host' => self::get('DB_HOST', 'localhost'),
'port' => self::get('DB_PORT', 3306),
'database' => self::get('DB_DATABASE', 'app'),
'username' => self::get('DB_USERNAME', 'root'),
'password' => self::get('DB_PASSWORD', ''),
];
}
}

// 后端服务:将后端服务视为附加资源
$config = Config::database();
$pdo = new PDO(
"{$config['driver']}:host={$config['host']};port={$config['port']};dbname={$config['database']}",
$config['username'],
$config['password']
);

// 构建、发布、运行:严格分离构建、发布和运行阶段
class AppRelease
{
public static function build(): void
{
exec('composer install --no-dev --optimize-autoloader');
exec('php artisan optimize');
}

public static function release(): void
{
exec('php artisan migrate --force');
}

public static function run(): void
{
exec('php-fpm');
}
}
// 无状态进程:应用进程无状态,状态存储在后端服务中
class StatelessApp
{
private Redis $session;
private PDO $database;

public function __construct(Redis $session, PDO $database)
{
$this->session = $session;
$this->database = $database;
}

public function handleRequest(): void
{
// 不使用本地文件存储
// Session存储在Redis中
// 数据存储在数据库中
// 上传文件存储在对象存储中
}
}

// 端口绑定:应用通过端口提供服务
// php -S 0.0.0.0:8080 -t public
// 或通过Nginx反向代理到PHP-FPM的9000端口

// 并发:通过进程模型扩展
// PHP-FPM的进程池可以处理多个并发请求
// pm.max_children = 50
// pm.start_servers = 10

// 可处置性:快速启动和优雅关闭
register_shutdown_function(function () {
// 关闭数据库连接
// 关闭Redis连接
// 刷新日志缓冲
});

// 开发/生产环境一致性:尽可能保持环境一致
// 使用Docker确保一致的环境
// 使用Composer确保一致的依赖

// 日志:将日志作为事件流
class Logger
{
public static function info(string $message, array $context = []): void
{
$entry = json_encode([
'time' => date('c'),
'level' => 'info',
'message' => $message,
'context' => $context,
]);
fwrite(STDOUT, $entry . "\n");
}

public static function error(string $message, array $context = []): void
{
$entry = json_encode([
'time' => date('c'),
'level' => 'error',
'message' => $message,
'context' => $context,
]);
fwrite(STDERR, $entry . "\n");
}
}

// 管理进程:将管理任务作为一次性进程执行
// php artisan migrate
// php artisan cache:clear
// php artisan queue:work
// 这些管理任务与Web进程共享相同的代码库和配置

echo "12Factor应用方法论已实现\n";
?>

遵循12Factor方法论可以让PHP应用更好地适应云环境。配置环境变量化、无状态设计、日志事件流、后端服务解耦,这些原则让应用在容器和Kubernetes环境中运行更顺畅。

更多推荐