PHP怎样监听视频播放结束事件_PHP监听播放结束事件办法【监听】

10次阅读

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

PHP怎样监听视频播放结束事件_PHP监听播放结束事件办法【监听】

PHP 无法直接监听视频播放结束事件——这是前端行为,必须由 javascript浏览器中完成。

为什么 PHP 做不到?

PHP 是服务端语言,视频在用户浏览器里播放时,PHP 进程早已响应完毕、连接关闭。播放结束这个事件根本不会自动传回服务器,除非你主动发起请求。

  • video 元素的 ended 事件只在 DOM 中触发,PHP 完全感知不到
  • 试图用 file_get_contents()fopen() 检查视频文件是否“播完了”是无效思路——服务端没有播放上下文
  • 所有“监听播放结束”的需求,本质是「前端检测 + 主动上报」

JavaScript 怎么监听并通知 PHP?

在页面中给 绑定 ended 事件,用 fetchXMLhttpRequest 向 PHP 接口发请求。

 

  • track_end.php 需要自己编写,接收 POST 数据并写入数据库或触发后续逻辑
  • 注意加防重:用户可能刷新页面或重复触发,建议在 PHP 端校验 video_id + user_id + timestamp 是否已记录
  • 移动端 safariended 事件支持稳定,但部分安卓 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 事件未必能发出或抵达。

text=ZqhQzanResources