PHP 访问记录系统:安全、高效、可扩展
// 获取访客的IP地址 $ip = $_SERVER['REMOTE_ADDR'];
// 过滤访问记录 if(strpos($_SERVER['REQUEST_URI'], 'script') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'bot') !== false){ // 恶意攻击或注入,不记录 } else { // 验证IP地址的有效性 if(validate_ip($ip)){ // 加密访客信息 $ip = md5($ip); $browser = md5($_SERVER['HTTP_USER_AGENT']); $time = date('Y-m-d H:i:s', time()); $url = $_SERVER['REQUEST_URI'];
// 使用PDO来操作数据库,防止SQL注入
$dsn = 'mysql:host=localhost;dbname=dbname';
$username = 'username';
$password = 'password';
$options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
);
try{
$pdo = new PDO($dsn, $username, $password, $options);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('INSERT INTO visitor_record (ip_address, browser_info, visit_time, visit_url) VALUES (:ip, :browser, :time, :url)');
$stmt->bindParam(':ip', $ip);
$stmt->bindParam(':browser', $browser);
$stmt->bindParam(':time', $time);
$stmt->bindParam(':url', $url);
$stmt->execute();
// 使用Monolog来记录日志
$log = new Logger('access');
$log->pushHandler(new StreamHandler('access.log', Logger::INFO));
$log->info('Visitor Info', array('ip' => $ip, 'browser' => $browser, 'time' => $time, 'url' => $url));
echo '记录成功';
} catch(PDOException $e){
echo '记录失败:' . $e->getMessage();
}
} else { echo 'IP地址无效'; } }
// 使用缓存技术来统计访问量 $cache = new Memcached(); $cache->addServer('localhost', 11211);
if(!$cache->get('visit_count')){ $conn = new mysqli('localhost', 'username', 'password', 'dbname');
if($conn->connect_error){ die('数据库连接失败:' . $conn->connect_error); }
$sql = 'SELECT COUNT(*) FROM visitor_record';
$result = $conn->query($sql);
if($result){ $row = $result->fetch_row(); $visit_count = $row[0]; $cache->set('visit_count', $visit_count, 3600); // 设置缓存时间为1小时 } else { echo '查询失败:' . $conn->error; }
$conn->close(); } else { $visit_count = $cache->get('visit_count'); }
echo '访问量:' . $visit_count; ?>
原文地址: https://www.cveoy.top/t/topic/l6eS 著作权归作者所有。请勿转载和采集!