当前位置:首页 > PHP

php实现推送

2026-04-02 20:51:58PHP

PHP 实现推送的方法

使用 PHP 实现推送功能可以通过多种方式实现,包括服务器推送(Server-Sent Events)、WebSocket、长轮询(Long Polling)或第三方推送服务(如 Firebase Cloud Messaging)。以下是几种常见的方法:

服务器推送(Server-Sent Events, SSE)

SSE 是一种基于 HTTP 的轻量级推送技术,适合单向服务器到客户端的消息推送。

// PHP 服务器端代码
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');

while (true) {
    $data = json_encode(['message' => 'New update']);
    echo "data: {$data}\n\n";
    ob_flush();
    flush();
    sleep(1);
}

客户端 JavaScript 代码:

const eventSource = new EventSource('sse.php');
eventSource.onmessage = function(e) {
    console.log(e.data);
};

WebSocket 实现

WebSocket 提供全双工通信,适合实时性要求高的场景。可以使用 Ratchet 等 PHP 库实现 WebSocket 服务器。

安装 Ratchet:

composer require cboden/ratchet

WebSocket 服务器代码:

use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

class MyWebSocket implements MessageComponentInterface {
    public function onOpen(ConnectionInterface $conn) {
        echo "New connection: {$conn->resourceId}\n";
    }

    public function onMessage(ConnectionInterface $conn, $msg) {
        $conn->send("Received: $msg");
    }

    public function onClose(ConnectionInterface $conn) {
        echo "Connection closed: {$conn->resourceId}\n";
    }

    public function onError(ConnectionInterface $conn, \Exception $e) {
        echo "Error: {$e->getMessage()}\n";
        $conn->close();
    }
}

$server = new \Ratchet\App('localhost', 8080);
$server->route('/push', new MyWebSocket());
$server->run();

长轮询(Long Polling)

长轮询通过客户端发起请求,服务器在有新数据时返回响应。

PHP 服务器端代码:

$lastUpdate = $_GET['lastUpdate'] ?? 0;
while (true) {
    $newData = checkForNewData($lastUpdate);
    if ($newData) {
        echo json_encode($newData);
        break;
    }
    sleep(1);
}

客户端 JavaScript 代码:

function poll() {
    fetch('poll.php?lastUpdate=' + lastUpdate)
        .then(response => response.json())
        .then(data => {
            console.log(data);
            poll();
        });
}
poll();

第三方推送服务(如 Firebase Cloud Messaging)

使用 Firebase Cloud Messaging (FCM) 实现跨平台推送。

PHP 发送推送代码:

php实现推送

$url = 'https://fcm.googleapis.com/fcm/send';
$headers = [
    'Authorization: key=YOUR_SERVER_KEY',
    'Content-Type: application/json'
];
$data = [
    'to' => '/topics/all',
    'notification' => [
        'title' => 'New Message',
        'body' => 'Hello from PHP!'
    ]
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
$result = curl_exec($ch);
curl_close($ch);
echo $result;

注意事项

  • 性能优化:SSE 和 WebSocket 适合高并发场景,长轮询适用于简单需求。
  • 安全性:使用 HTTPS 确保数据传输安全,避免敏感信息泄露。
  • 兼容性:SSE 不支持 IE,WebSocket 需要现代浏览器支持。

以上方法可根据具体需求选择,SSE 和 WebSocket 适合实时性要求高的场景,而长轮询和第三方推送服务适合简单或跨平台需求。

标签: php
分享给朋友:

相关文章

php实现socket

php实现socket

PHP 实现 Socket 通信 PHP 可以通过 socket 扩展实现网络通信,支持 TCP/UDP 协议。以下是实现 Socket 通信的核心步骤和代码示例。 创建 TCP 服务器 // 创建…

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HTTP…

php实现的分页

php实现的分页

PHP 实现分页的方法 基本分页逻辑 分页的核心在于计算总页数、当前页码以及数据偏移量。假设每页显示 10 条数据: $current_page = isset($_GET['page']) ? (…

php无限分类的实现

php无限分类的实现

PHP无限分类的实现 无限分类是一种常见的树形结构数据组织方式,适用于商品分类、菜单管理、地区选择等场景。以下是几种实现方法: 递归实现法 递归是最直观的实现方式,通过函数自身调用来遍历子分类。数据…

php实现统计

php实现统计

PHP 实现统计功能 在 PHP 中实现统计功能通常涉及数据的收集、处理和展示。以下是一些常见的统计实现方法: 数据库数据统计 通过 SQL 查询可以直接从数据库中获取统计结果: $conn =…

php 函数实现

php 函数实现

PHP 函数实现基础 PHP 函数的定义使用 function 关键字,后跟函数名和参数列表。函数名不区分大小写,但建议保持一致。 function functionName($param1, $p…