[PHP] $_SERVERの中身を見る

phpでリクエストを処理するとき、$_SERVERを使って次のようにリクエストの詳細情報を参照することができる。

  • REQUEST_TIME:2024/10/30 09:34:32
  • HTTP_REFERER:https://henatips.com/page/13
  • REQUEST_URI:/page/13/?id=13
  • REMOTE_ADDR:18.222.110.138
  • REMOTE_HOST:ec2-18-222-110-138.us-east-2.compute.amazonaws.com
  • gethostbyaddr:ec2-18-222-110-138.us-east-2.compute.amazonaws.com
  • HTTP_USER_AGENT:Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)

画像URLに対するアクセスログをDBに収集することをやってみようと思う。

DB定義

使うRDBMSはMySQL。

CREATE TABLE ACCESS_LOG (
  ID int(10) NOT NULL AUTO_INCREMENT,
  REQUEST_TIME int(10),
  HTTP_REFERER varchar(2048),
  REQUEST_URI varchar(2048),
  REMOTE_ADDR varchar(19),
  REMOTE_HOST varchar(63),
  GETHOSTBYADDR varchar(63),
  HTTP_USER_AGENT varchar(200),
  PRIMARY KEY (ID)
);

PHP

まずは画像を表示する処理。画像を読み込んだ後にアクセスログの登録を行っている。

<?php
$file = 'image.jpg';
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime_type = $finfo->file($file);
header('Content-Type: '.$mime_type);
readfile($file);
 
//$_SERVERを読み取る処理
include('register-access-log.php');
?>

register-access-log.phpの中に$_SERVERを読み取る処理を書く。(2-4行目に自分の環境に合った接続設定を書く)

<?php
$dsn = '(データソース名)';
$username = '(ユーザー名)';
$pass = '(パスワード)';
$pdo = new PDO($dsn, $username, $pass);

$query = 'INSERT INTO ACCESS_LOG (REQUEST_TIME, HTTP_REFERER, REQUEST_URI, REMOTE_ADDR, REMOTE_HOST, GETHOSTBYADDR, HTTP_USER_AGENT) VALUES (?, ?, ?, ?, ?, ?, ?)';
try{
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $pdo->beginTransaction();
  
  $gethostbyaddr = gethostbyaddr($_SERVER['REMOTE_ADDR']);
  
  $stmt = $pdo->prepare($query);
  $stmt->bindParam(1, $_SERVER['REQUEST_TIME'], PDO::PARAM_INT);
  $stmt->bindParam(2, $_SERVER['HTTP_REFERER']);
  $stmt->bindParam(3, $_SERVER['REQUEST_URI']);
  $stmt->bindParam(4, $_SERVER['REMOTE_ADDR']);
  $stmt->bindParam(5, $_SERVER['REMOTE_HOST']);
  $stmt->bindParam(6, $gethostbyaddr);
  $stmt->bindParam(7, $_SERVER['HTTP_USER_AGENT']);
  $stmt->execute();
  $stmt = null;
  
  $pdo->commit();
}catch(Exception $e){
  echo $e->getMessage();
  $pdo->rollBack();
}
$pdo = null;
?>

.htaccess

.htaccessでURLの見た目を整える。

RewriteEngine on
RewriteRule ^test/[^/]*?\.jpg$ page/13/src/sample.php [L]

結果

.htaccessに書いた画像URLにアクセスするとアクセスログが登録される。(/test/aaaaa.jpgなど)

必要がなくなったらテーブルは消す。

DROP TABLE ACCESS_LOG;

参考