PHP无法监听视频播放结束事件,因其是服务端语言,无浏览器DOM上下文;须由JavaScript监听video的ended事件并主动通过fetch向PHP接口上报,PHP端需校验参数、防重、预处理入库。

PHP 无法直接监听视频播放结束事件——这是前端行为,必须由 JavaScript 在浏览器中完成。
为什么 PHP 做不到?
PHP 是服务端语言,视频在用户浏览器里播放时,PHP 进程早已响应完毕、连接关闭。播放结束这个事件根本不会自动传回服务器,除非你主动发起请求。
-
video元素的ended事件只在 DOM 中触发,PHP 完全感知不到 - 试图用
file_get_contents()或fopen()检查视频文件是否“播完了”是无效思路——服务端没有播放上下文 - 所有“监听播放结束”的需求,本质是「前端检测 + 主动上报」
JavaScript 怎么监听并通知 PHP?
在页面中给 绑定 ended 事件,用 fetch 或 XMLHttpRequest 向 PHP 接口发请求。
-
track_end.php需要自己编写,接收 POST 数据并写入数据库或触发后续逻辑 - 注意加防重:用户可能刷新页面或重复触发,建议在 PHP 端校验
video_id + user_id + timestamp是否已记录 - 移动端 Safari 对
ended事件支持稳定,但部分安卓 WebView 可能延迟或丢失,可加timeupdate+duration - currentTime 辅助判断
PHP 接口怎么安全接收这个事件?
track_end.php 不只是 echo “ok”,得做基础防护和业务落地:
立即学习“PHP免费学习笔记(深入)”;
// 验证必要参数
if (!isset($_POST['video_id'], $_POST['user_id'])) {
http_response_code(400);
exit;
}$video_id = (int)$_POST['video_id'];
$user_id = (int)$_POST['user_id'];
// 可选:验证 Referer 或加简单 token(如前端带时间戳+md5签名)
// 防止被批量刷接口
// 写入数据库示例(PDO)
try {
$pdo = new PDO("mysql:host=localhost;dbname=test", $user, $pass);
$stmt = $pdo->prepare("INSERT INTO video_play_log (video_id, user_id, ended_at) VALUES (?, ?, NOW())");
$stmt->execute([$video_id, $user_id]);
} catch (PDOException $e) {
error_log($e->getMessage());
}
?>
- 不要依赖
$_SESSION判断登录态——ended事件可能在会话过期后触发,需前端传user_id或 token - 避免直接拼接 SQL,务必用预处理语句
- 不返回敏感数据,HTTP 状态码 204(No Content)比 200 更合适
真正的难点不在“怎么监听”,而在于如何让前端上报可靠、服务端去重严谨、整个链路可追溯——尤其是用户中途关闭页面、网络中断、或反复点击播放时,ended 事件未必能发出或抵达。











