PHP 怎么推送桌面通知

wen PHP项目 2

本文目录导读:

PHP 怎么推送桌面通知

  1. 方式一:轮询或长轮询(最简单,适合局域网/内部工具)
  2. 方式二:WebSocket 实时推送(推荐,适合在线聊天/协同工具)
  3. 方式三:Service Worker + Web Push(最专业,离线也能收到)
  4. 方式四:Node.js 辅助(PHP 只做业务逻辑)
  5. 总结建议:

在 PHP 中推送桌面通知,通常不能直接由 PHP 单独完成,因为 PHP 是服务端语言,而桌面通知是客户端(浏览器或操作系统)的功能。

PHP 需要充当后端调度者,通过推送数据到前端,再由前端(JavaScript)调用浏览器的 Notification APIWeb Push API 来显示通知。

以下是几种常见的实现方式,按应用场景从简单到复杂排列:

轮询或长轮询(最简单,适合局域网/内部工具)

PHP 端提供数据接口,前端 JS 定时请求 PHP 获取新数据,然后弹窗。

PHP 文件 (check_notify.php):

<?php
// 从数据库或缓存中获取是否有新通知
$newMessage = get_from_database(); 
if ($newMessage) {
    // 返回 JSON 数据给前端
    echo json_encode(['status' => 'ok', 'data' => $newMessage]);
} else {
    echo json_encode(['status' => 'empty']);
}
?>

前端 HTML (index.html):

<script>
// 1. 先请求用户授权
if (Notification.permission !== "granted") {
    Notification.requestPermission();
}
// 2. 每隔 5 秒请求一次 PHP
setInterval(() => {
    fetch('check_notify.php')
        .then(res => res.json())
        .then(data => {
            if (data.status === 'ok' && Notification.permission === "granted") {
                new Notification('新消息提醒', { body: data.data.message });
            }
        });
}, 5000);
</script>

注意:这种方式仅在你浏览器标签页打开时才有效,且切换后台定时器可能被浏览器节流。


WebSocket 实时推送(推荐,适合在线聊天/协同工具)

PHP 通过 WebSocket 服务器(如 WorkermanSwoole 或第三方服务 Pusher)主动向已连接的客户端推送消息,无需轮询。

核心流程:

  1. 前端 JS 连接 WebSocket 服务。
  2. PHP 收到业务逻辑(如收到新邮件)后,通过 WebSocket 推送给指定用户。
  3. 前端收到推送后,调用 Notification API。

PHP 端(使用 Workerman 示例伪代码):

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
$worker = new Worker('websocket://0.0.0.0:2346');
$worker->onMessage = function ($connection, $data) {
    // 处理客户端发来的消息,并广播或指定发送
    $connection->send('{"type":"new_order","msg":"您有新的订单"}');
};
Worker::runAll();

前端 JS 核心代码:

// 连接 WebSocket (ws 协议)
const ws = new WebSocket('ws://your-server.com:2346');
ws.onmessage = function(event) {
    const data = JSON.parse(event.data);
    if (data.type === 'new_order') {
        // 弹出系统桌面通知
        if (Notification.permission === "granted") {
            new Notification('新订单', { body: data.msg });
        }
    }
};

Service Worker + Web Push(最专业,离线也能收到)

这是标准做法,类似 Chrome 浏览器收到的新闻推送,即使浏览器完全关闭,也能收到通知,这需要借助第三方推送服务(如 FCM 或 Apple APNs)。

流程:

  1. PHP 端通过 API 调用 Web Push 服务(如 web-push-php 库)。
  2. 浏览器注册 Service Worker,并向推送服务订阅(得到订阅信息)。
  3. PHP 存储订阅信息,需要时发送数据。

PHP 端安装库:

composer require minishlink/web-push

PHP 发送代码片段:

<?php
use Minishlink\WebPush\WebPush;
use Minishlink\WebPush\Subscription;
$auth = [
    'VAPID' => [
        'subject' => 'mailto:admin@example.com',
        'publicKey' => '你的公钥',
        'privateKey' => '你的私钥',
    ],
];
$webPush = new WebPush($auth);
$subscription = Subscription::create([
    'endpoint' => '用户的endpoint地址',
    'publicKey' => '用户的公钥',
    'authToken' => '用户的authToken',
]);
$webPush->queueNotification($subscription, '这是推送的内容');
$webPush->send();
?>

此方式前端需要编写 service-worker.js 来捕获 push 事件并显示通知。


Node.js 辅助(PHP 只做业务逻辑)

如果你的项目是 PHP 为主,可以安装一个 Node.js 进程作为“消息中介”,PHP 通过 exec(curl)Redis 发布到 Node.js,Node.js 再推送给桌面客户端。


总结建议:

场景 推荐方式
后台管理面板/内部系统 方式一(轮询) 最简单,改动最小。
需要在同一网页内实时提醒 方式二(WebSocket) 延迟最低。
类似短视频/邮件/新闻的离线推送 方式三(Web Push) 但配置最复杂,需要 HTTPS + VAPID。
只想在本机测试一下 方式一,在 localhost 下配合浏览器即可测试。

特别注意: 使用 Notification API 必须要求网站是 HTTPS 协议(localhost 开发环境除外),否则浏览器的权限请求会被拦截。

抱歉,评论功能暂时关闭!