php 怎么实现门禁
实现门禁系统的基本思路
门禁系统的核心功能包括身份验证、权限管理和记录日志。PHP 可以通过数据库、硬件接口(如 RFID 读卡器)和 Web 服务实现这些功能。
数据库设计
创建必要的数据库表存储用户信息、权限和访问记录。
用户表(users)字段:id, name, card_id(卡号), role(角色)。
访问记录表(access_logs)字段:id, user_id, access_time, status(成功/失败)。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
card_id VARCHAR(20) UNIQUE,
role VARCHAR(20)
);
CREATE TABLE access_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
access_time DATETIME,
status VARCHAR(10)
);
硬件接口集成
通过串口或网络 API 与 RFID 读卡器通信。PHP 可使用 fopen 或 curl 读取设备数据。
示例代码读取串口数据(需服务器权限):
$device = "/dev/ttyUSB0";
$handle = fopen($device, "r");
if ($handle) {
$card_id = trim(fgets($handle));
fclose($handle);
}
身份验证逻辑
验证卡号是否在数据库中并检查权限:
$pdo = new PDO("mysql:host=localhost;dbname=access_control", "user", "password");
$stmt = $pdo->prepare("SELECT * FROM users WHERE card_id = ?");
$stmt->execute([$card_id]);
$user = $stmt->fetch();
if ($user) {
$log_stmt = $pdo->prepare("INSERT INTO access_logs (user_id, access_time, status) VALUES (?, NOW(), 'success')");
$log_stmt->execute([$user['id']]);
echo "Access granted for " . $user['name'];
} else {
$log_stmt = $pdo->prepare("INSERT INTO access_logs (user_id, access_time, status) VALUES (NULL, NOW(), 'failed')");
$log_stmt->execute();
echo "Access denied";
}
门锁控制
通过 GPIO 或继电器控制物理门锁。PHP 可调用外部脚本(如 Python)或发送 HTTP 请求到硬件控制器:
exec("python control_lock.py unlock");
// 或通过 HTTP API
file_get_contents("http://192.168.1.100/unlock?key=API_KEY");
日志与报警
记录所有访问尝试并设置异常报警(如多次失败尝试):

$failed_attempts = $pdo->query("SELECT COUNT(*) FROM access_logs WHERE status = 'failed' AND access_time > NOW() - INTERVAL 5 MINUTE")->fetchColumn();
if ($failed_attempts > 3) {
mail("admin@example.com", "Security Alert", "Multiple failed access attempts detected");
}
扩展功能
- 多因素认证:结合密码或生物识别(需额外硬件)。
- 时间限制:在 SQL 查询中添加
AND CURRENT_TIME() BETWEEN '08:00' AND '18:00'限制访问时段。 - Web 管理界面:用 PHP 框架(如 Laravel)构建管理后台,管理用户和权限。
安全注意事项
- 使用预处理语句防止 SQL 注入。
- 加密敏感数据(如卡号)。
- 限制硬件接口的访问权限。






