本文目录导读:

在 PHP 项目中配置站点访问日志,主要有以下几种方法,具体取决于你的 Web 服务器(Apache 或 Nginx)和需求。
以下是针对 Apache、Nginx 的配置方法,以及 PHP 自带的处理方式。
配置 Nginx 访问日志(推荐)
Nginx 本身提供了非常强大且高效的访问日志功能。
修改站点配置文件
通常位于 /etc/nginx/sites-available/your-site.conf 或 /usr/local/nginx/conf/vhost/。
示例配置:
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.php index.html;
# 访问日志配置(关键部分)
access_log /var/log/nginx/example_access.log main;
error_log /var/log/nginx/example_error.log;
# 定义日志格式(通常放在 http 块或 server 块)
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# PHP 处理(通过 fastcgi_pass)
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
}
重启 Nginx
sudo nginx -t # 测试配置语法 sudo systemctl restart nginx # 或 sudo service nginx restart
查看日志
日志会写入 /var/log/nginx/example_access.log,每行记录一个请求。
常见字段说明:
$remote_addr:客户端 IP$time_local:请求时间$request:请求行(GET /index.php HTTP/1.1)$status:HTTP 状态码$body_bytes_sent:返回给客户端的内容大小$http_user_agent:浏览器 UA$http_x_forwarded_for:如果使用代理(如 CDN),记录真实 IP
配置 Apache 访问日志
修改站点配置(VirtualHost)
通常在 /etc/apache2/sites-available/000-default.conf 或自定义配置中。
示例配置:
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/html
# 自定义日志格式(可选)
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
# 访问日志和错误日志
CustomLog ${APACHE_LOG_DIR}/example_access.log combined
ErrorLog ${APACHE_LOG_DIR}/example_error.log
# PHP 处理
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
</VirtualHost>
启用模块并重启
sudo a2enmod log_config # 确保日志模块启用 sudo systemctl restart apache2
查看日志
日志写入 /var/log/apache2/example_access.log。
使用 PHP 内置函数记录日志
如果无法修改 Web 服务器配置,或者只需要记录特定 PHP 页面的访问,可以直接在 PHP 代码中实现。
示例代码(error_log 方式):
<?php
// 记录访问日志到自定义文件
$logFile = '/var/log/myapp/access.log';
$logDir = dirname($logFile);
// 确保日志目录存在
if (!is_dir($logDir)) {
mkdir($logDir, 0755, true);
}
// 组装日志内容
$logData = sprintf(
"[%s] %s %s %s %s\n",
date('Y-m-d H:i:s'),
$_SERVER['REMOTE_ADDR'] ?? 'unknown',
$_SERVER['REQUEST_METHOD'] ?? 'GET',
$_SERVER['REQUEST_URI'] ?? '/',
$_SERVER['HTTP_USER_AGENT'] ?? 'unknown'
);
// 写入日志
file_put_contents($logFile, $logData, FILE_APPEND | LOCK_EX);
?>
优点: 高度可定制,可以记录你想记录的任何信息。
缺点: 性能较差(每次请求都需要 fwrite),且如果代码有 exit 或 die,可能会遗漏记录。
使用框架或中间件(推荐用于复杂项目)
如果项目使用了 Laravel、Symfony、ThinkPHP 等框架,它们通常自带日志系统,可以配置访问日志。
以 Laravel 为例:
- 框架默认记录所有 HTTP 请求到
storage/logs/laravel.log。 - 可以通过中间件 HTTP Logging 自定义请求和响应日志。
安装并启用后,Laravel 会自动按天或按大小记录包含请求方法、URL、响应状态等信息的日志。
分析工具(可选)
如果只是为了分析流量,而不是为了故障排查,可以考虑使用更高级的工具:
- GoAccess:实时解析 Nginx/Apache 日志,提供 Web 界面统计。
- AWStats:生成静态 HTML 报表。
- ELK Stack (Elasticsearch, Logstash, Kibana):适合海量日志分析。
总结建议
- 生产环境:优先使用 Nginx 或 Apache 自带的日志功能,性能最好,不会影响 PHP 执行。
- 调试开发:可以使用 PHP error_log 或框架日志。
- 安全审计:建议同时记录
$http_x_forwarded_for(真实 IP),防止代理伪造。
配置完成后,记得通过 tail -f /var/log/nginx/access.log 实时查看日志,确保数据正常写入。