PHP 简单消息推送

php做消息推送

今天我们使用 workerman 的 PHPSocket.IO 来实现。
PHPSocket.IO是PHP版本的Socket.IO服务端实现,基于workerman开发,用于替换node.js版本Socket.IO服务端。PHPSocket.IO底层采用websocket协议通讯,如果客户端不支持websocket协议, 则会自动采用http长轮询的方式通讯。PHPSocket.IO实现的Polling通信机制包括Adobe Flash Socket、AJAX长轮询、JSONP轮询等。具体采用哪种机制通讯对于开发者完全透明, 开发者使用的是统一的接口。

安装

composer require workerman/phpsocket.io

步骤

安装 socket 的服务端

<?php
require_once("./vendor/autoload.php");
use Workerman\Worker;
use PHPSocketIO\SocketIO;

$io = new SocketIO(2021);
$io->on('connection', function ($socket) use ($io) {
    //登录监听
    $socket->on('login', function ($user_id) use ($io) {
        $io->emit('login', $user_id."登录了");//这个是发送消息
    });
    //接受消息监听
    $socket->on('msg', function ($msg) use ($io) {
        $io->emit('msg', $msg);//回传消息
    });
});
?>

前端部署 socket.io.js

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>接受消息</title>
</head>
<body>
<script src='https://cdn.bootcss.com/socket.io/2.0.3/socket.io.js'></script>
<script>
  // 如果服务端不在本机,请把127.0.0.1改成服务端ip
  var socket = io('http://127.0.0.1:2021');
  // 当连接服务端成功时触发connect默认事件
  socket.on('login', function(server_msg){
    console.log('服务器回传消息:'+server_msg);
  });
  socket.emit('login', new Math.random()*100);
  // 服务端通过emit('chat message from server', $msg)触发客户端的chat message from server事件
  socket.on('msg', function(msg){
    console.log(msg);
  });
</script>
</body>
</html>

这个时候访问我们的前端页面,就能看到消息,多打开几个就知道推送了
黑白课堂
黑白课堂

现在我们来控制台触发发送消息
黑白课堂
这样就可以实现简单的交互信息传递,那么我们有时候需要通过URL传递消息进行推送,那么我们现在需要一个 http 服务了。

创建http服务来完成url推送消息

phpsocket.io提供了workerStart事件回调,也就是当进程启动后准备好接受客户端链接时触发的回调。 一个进程生命周期只会触发一次。可以在这里设置一些全局的事情,比如开一个新的Worker端口等等。

<?php
require_once("./vendor/autoload.php");

use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Worker;
use PHPSocketIO\SocketIO;

$io = new SocketIO(2021);
$io->on('connection', function ($socket) use ($io) {
    //登录监听
    $socket->on('login', function ($user_id) use ($io) {
        $io->emit('login', $user_id . "登录了");//这个是发送消息
    });
    //接受消息监听
    $socket->on('msg', function ($msg) use ($io) {
        $io->emit('msg', $msg);//回传消息
    });
});

// 当$sender_io启动后监听一个http端口
$io->on('workerStart', function () {
    // 监听一个http端口
    $inner_http_worker = new Worker('http://0.0.0.0:2121');
    // 当http客户端发来数据时触发
    $inner_http_worker->onMessage = function (TcpConnection $http_connection, Request $request) {
        $post = $request->post();
        $post = $post ? $post : $request->get();
        // 推送数据的url格式 type=publish&to=uid&content=xxxx
        switch (@$post['type']) {
            case 'login':
                global $io;
                $post['content'] = htmlspecialchars(@$post['content']);
                $io->emit('msg', @$post['content']);
                return $http_connection->send('ok');

        }
        return $http_connection->send('fail');
    };
    // 执行监听
    $inner_http_worker->listen();

});

Worker::runAll();

这样我们就可以使用web推送消息了

黑白课堂

知识点

发送消息

$io是SocketIO对象。$socket是客户端连接

  • 当前客户端发送事件
$socket->emit('event name', $data);
  • 向所有客户端发送事件
$io->emit('event name', $data);
  • 向所有客户端发送事件,但不包括当前连接。
$socket->broadcast->emit('event name', $data);
  • 向某个分组的所有客户端发送事件
$io->to('group name')->emit('event name', $data);

分组

$socket->join('group name');//加入

$socket->leave('group name'); //分离

获取ip

$socket->conn->remoteAddress

关闭

$socket->disconnect();

评论区 (0)

没有记录
支持 markdown,图片截图粘贴拖拽都可以自动上传。
黑白课堂

黑白课堂 · 技术专家

专业PHP开发

年度VIP 站长创业者玉树凌风每天醒来0收入
查看更多

最新视频课程

钻级赞助商