当前位置:首页 > PHP

php实现推送

2026-02-13 13:25:18PHP

PHP 实现推送功能的方法

使用 WebSocket 实现实时推送

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适合实现实时推送功能。

// 服务端代码示例(使用 Ratchet 库)
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

class PushServer implements MessageComponentInterface {
    protected $clients;

    public function __construct() {
        $this->clients = new \SplObjectStorage;
    }

    public function onOpen(ConnectionInterface $conn) {
        $this->clients->attach($conn);
    }

    public function onMessage(ConnectionInterface $from, $msg) {
        foreach ($this->clients as $client) {
            $client->send($msg);
        }
    }

    public function onClose(ConnectionInterface $conn) {
        $this->clients->detach($conn);
    }

    public function onError(ConnectionInterface $conn, \Exception $e) {
        $conn->close();
    }
}

// 启动服务器
$app = new Ratchet\App('localhost', 8080);
$app->route('/push', new PushServer);
$app->run();

客户端可以使用 JavaScript 连接 WebSocket 接收推送消息。

使用 Server-Sent Events (SSE)

SSE 是一种服务器向客户端推送数据的轻量级技术。

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

while (true) {
    $data = getNewData(); // 获取新数据
    echo "data: " . json_encode($data) . "\n\n";
    ob_flush();
    flush();
    sleep(1);
}

客户端使用 EventSource API 接收推送:

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

使用第三方推送服务

对于移动端推送,可以使用 Firebase Cloud Messaging (FCM) 或 Apple Push Notification Service (APNS)。

FCM 推送示例:

function sendFCMPush($token, $title, $body) {
    $url = 'https://fcm.googleapis.com/fcm/send';
    $serverKey = 'YOUR_SERVER_KEY';

    $notification = [
        'title' => $title,
        'body' => $body,
        'sound' => 'default'
    ];

    $fields = [
        'to' => $token,
        'notification' => $notification,
        'priority' => 'high'
    ];

    $headers = [
        'Authorization: key=' . $serverKey,
        'Content-Type: application/json'
    ];

    $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($fields));

    $result = curl_exec($ch);
    curl_close($ch);

    return $result;
}

使用长轮询技术

长轮询是一种模拟实时推送的技术,客户端发送请求后,服务器保持连接直到有新数据。

// 长轮询服务端代码
$timeout = 30; // 超时时间
$start = time();

while (true) {
    $data = checkForNewData(); // 检查新数据

    if ($data !== false || (time() - $start) > $timeout) {
        echo json_encode($data ? $data : ['timeout' => true]);
        break;
    }

    usleep(500000); // 暂停0.5秒
}

使用消息队列

对于高并发场景,可以使用消息队列系统如 RabbitMQ 或 Redis 实现推送。

Redis 发布/订阅示例:

// 发布消息
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->publish('notification_channel', json_encode(['message' => 'Hello']));

// 订阅消息(通常运行在单独进程)
$redis->subscribe(['notification_channel'], function($redis, $channel, $message) {
    echo "Received: $message\n";
});

每种方法都有其适用场景,选择哪种技术取决于项目需求、性能要求和目标平台。

php实现推送

标签: php
分享给朋友:

相关文章

php实现分页

php实现分页

PHP实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (in…

php实现websocket

php实现websocket

PHP 实现 WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过多种方式实现 WebSocket 功能,以下是几种常见的方法: 使用 Rat…

php实现上传

php实现上传

PHP 文件上传实现 HTML 表单设置 创建一个包含文件上传字段的 HTML 表单,确保表单的 enctype 属性设置为 multipart/form-data,这是文件上传必需的设置。 <…

基于php的设计与实现

基于php的设计与实现

PHP 设计与实现的关键要素 环境搭建与框架选择 PHP开发需配置服务器环境(如Apache/Nginx)、PHP版本(建议7.4+)及数据库(MySQL/MariaDB)。主流框架包括Laravel…

php实现接口

php实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不实现具体功能。类可以实现一个或多个接口,并必须实现接口中定义的所有方法。 定义接口 接口使用 inte…

php实现推送

php实现推送

PHP 实现推送功能的方法 PHP 实现推送功能可以通过多种方式完成,包括 WebSocket、Server-Sent Events (SSE)、长轮询或第三方推送服务。以下是几种常见的方法: 使…