如何用PHP获取页面加载与离开时的UNIX时间戳并保存到文本文件
如何记录用户进入和离开页面的时间戳
首先得明确一点:纯PHP没法直接捕获用户“离开页面”的事件,因为PHP是服务器端脚本,只有当用户向服务器发送请求时才会执行。而用户离开页面(比如关闭标签、跳转到其他页)是客户端行为,所以我们需要前端JavaScript配合后端PHP来实现这个需求。
下面是一套可行的实现方案,兼顾可靠性和易用性:
1. 改进进入时间的记录逻辑
你之前的代码用fopen("w")会覆盖整个文件,这显然不是我们想要的——我们需要追加记录,而不是每次清空。另外,最好给每个页面加上标识,方便区分不同页面的访问记录。
创建一个track_entry.php脚本,用来处理页面进入的记录:
<?php session_start(); // 获取当前要访问的页面标识(从URL参数传入) $page_id = $_GET['page'] ?? 'unknown_page'; $entry_timestamp = time(); // 把进入时间追加到日志文件(用LOCK_EX避免并发写入问题) $log_content = sprintf("ENTRY|%s|%d|%s\n", $page_id, $entry_timestamp, $_SERVER['REMOTE_ADDR']); file_put_contents('temp/access_log.txt', $log_content, FILE_APPEND | LOCK_EX); // 把当前页面的进入时间存入Session,方便后续关联离开时间 $_SESSION["entry_{$page_id}"] = $entry_timestamp; // 跳转到目标HTML页面 header("Location: {$page_id}.html"); exit; ?>
之后,用户访问页面时,不要直接打开main1.html,而是通过track_entry.php?page=main1跳转,这样就能记录进入时间。
2. 用JavaScript捕获页面离开事件并记录时间
用户离开页面时,我们可以用浏览器的beforeunload事件触发一个请求,把离开时间发送给PHP脚本。这里推荐用navigator.sendBeacon,它比普通AJAX更可靠——浏览器会确保请求完成,不会因为页面卸载而中断。
在每个HTML页面(比如main1.html)的末尾加入这段JS代码:
<script> window.addEventListener('beforeunload', function() { const pageId = 'main1'; // 对应页面标识 const exitTimestamp = Math.floor(Date.now() / 1000); // 转换为UNIX时间戳 // 用sendBeacon发送数据到记录脚本 navigator.sendBeacon('track_exit.php', new URLSearchParams({ page: pageId, exit_time: exitTimestamp })); }); </script>
3. 处理离开时间的PHP脚本
创建track_exit.php,用来接收前端发送的离开时间并写入日志:
<?php session_start(); $page_id = $_POST['page'] ?? 'unknown_page'; $exit_timestamp = $_POST['exit_time'] ?? time(); $entry_timestamp = $_SESSION["entry_{$page_id}"] ?? 'unknown'; // 记录离开时间,同时关联进入时间(如果有的话) $log_content = sprintf("EXIT|%s|%d|%s|%d\n", $page_id, $exit_timestamp, $_SERVER['REMOTE_ADDR'], $entry_timestamp); file_put_contents('temp/access_log.txt', $log_content, FILE_APPEND | LOCK_EX); // 不需要返回任何内容,sendBeacon不关心响应 exit; ?>
一些注意事项
- 确保
temp目录有写入权限,否则PHP无法创建/写入日志文件。 beforeunload事件在用户关闭标签、刷新页面、跳转到其他链接时都会触发,但如果浏览器崩溃或强制关闭,可能无法触发,这种极端情况目前没有完美的解决方案。- 如果需要区分不同用户,可以结合Session ID或用户标识,把它也写入日志,方便后续分析。
内容的提问来源于stack exchange,提问作者Rulli Smith
相关产品推荐
相关产品推荐

