本文目录导读:

- 方式一:轮询或长轮询(最简单,适合局域网/内部工具)
- 方式二:WebSocket 实时推送(推荐,适合在线聊天/协同工具)
- 方式三:Service Worker + Web Push(最专业,离线也能收到)
- 方式四:Node.js 辅助(PHP 只做业务逻辑)
- 总结建议:
在 PHP 中推送桌面通知,通常不能直接由 PHP 单独完成,因为 PHP 是服务端语言,而桌面通知是客户端(浏览器或操作系统)的功能。
PHP 需要充当后端调度者,通过推送数据到前端,再由前端(JavaScript)调用浏览器的 Notification API 或 Web 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 服务器(如 Workerman、Swoole 或第三方服务 Pusher)主动向已连接的客户端推送消息,无需轮询。
核心流程:
- 前端 JS 连接 WebSocket 服务。
- PHP 收到业务逻辑(如收到新邮件)后,通过 WebSocket 推送给指定用户。
- 前端收到推送后,调用
NotificationAPI。
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)。
流程:
- PHP 端通过 API 调用 Web Push 服务(如
web-push-php库)。 - 浏览器注册 Service Worker,并向推送服务订阅(得到订阅信息)。
- 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 开发环境除外),否则浏览器的权限请求会被拦截。