第九部分:日志与监控
9.1 操作日志中间件
// app/Middleware/LogMiddleware.php
<?php
namespace App\Middleware;
use App\Models\OperationLog;
use App\Services\AuthService;
class LogMiddleware
{
private AuthService $auth;
public function __construct()
{
$this->auth = new AuthService();
}
public function handle(callable $next)
{
$startTime = microtime(true);
// 执行请求
$response = $next();
$responseTime = (microtime(true) - $startTime) * 1000;
// 记录日志
$this->log($responseTime);
return $response;
}
private function log(float $responseTime): void
{
// 排除健康检查等接口
$excludePaths = ['/health', '/metrics'];
if (in_array($_SERVER['REQUEST_URI'], $excludePaths)) {
return;
}
$user = $this->auth->getUser();
$log = new OperationLog();
$log->user_id = $user->id ?? null;
$log->username = $user->username ?? 'guest';
$log->method = $_SERVER['REQUEST_METHOD'];
$log->url = $_SERVER['REQUEST_URI'];
$log->ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
$log->user_agent = $_SERVER['HTTP_USER_AGENT'] ?? '';
$log->request_data = $this->getRequestData();
$log->response_code = http_response_code();
$log->response_time = (int) $responseTime;
$log->save();
}
private function getRequestData(): ?array
{
$data = [];
// GET参数
if (!empty($_GET)) {
$data['query'] = $_GET;
}
// POST数据(排除密码)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$input = json_decode(file_get_contents('php://input'), true) ?: $_POST;
if (isset($input['password'])) {
$input['password'] = '***';
}
$data['body'] = $input;
}
return empty($data) ? null : $data;
}
}
第十部分:部署与运维
10.1 Docker部署配置
# Dockerfile
FROM php:8.2-fpm-alpine
# 安装依赖
RUN apk add --no-cache \
nginx \
supervisor \
redis \
mysql-client \
libpng-dev \
libjpeg-turbo-dev \
freetype-dev \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd pdo_mysql bcmath opcache
# 安装Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# 复制应用代码
COPY . /var/www/html
WORKDIR /var/www/html
# 安装依赖
RUN composer install --no-dev --optimize-autoloader
# 设置权限
RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/public/uploads
RUN chmod -R 755 /var/www/html/storage /var/www/html/public/uploads
# 复制配置文件
COPY docker/nginx.conf /etc/nginx/nginx.conf
COPY docker/php.ini /usr/local/etc/php/conf.d/app.ini
COPY docker/supervisord.conf /etc/supervisord.conf
EXPOSE 80
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]
10.2 性能优化配置
; php.ini - 生产环境配置
memory_limit = 256M
upload_max_filesize = 20M
post_max_size = 20M
max_execution_time = 60
max_input_time = 60
; OPcache配置
opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 60
opcache.fast_shutdown = 1
; Session配置
session.save_handler = redis
session.save_path = "tcp://redis:6379"
session.gc_maxlifetime = 86400
session.cookie_httponly = 1
session.cookie_secure = 1
session.cookie_samesite = Strict
本文通过构建一个完整的企业级用户管理系统,全面展示了PHP在实际项目中的应用。从环境搭建、数据库设计、核心架构实现,到业务逻辑、控制器路由、安全防护、性能优化,再到部署运维,涵盖了PHP实战开发的各个方面。
来源:
https://htnus.cn/category/tech-trends.html