主动推送实现
平常我们采取 swoole 来写 WebSocket 做事可能最多的用到的是open,message,close这三个监听状态,但是切切没有看下下面的onRequest回调的利用,没错,办理这次主动推送的便是须要用onRequest回调。
官方文档:正由于swoole_websocket_server继续自swoole_http_server,以是在 websocket 中有onRequest回调。

详细实现:
# 这里是一个laravel中Commands
# 运行php artisan swoole start 即可运行
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use swoole_websocket_server;
class Swoole extends Command
{
public $ws;
/
The name and signature of the console command.
@var string
/
protected $signature = 'swoole {action}';
/
The console command description.
@var string
/
protected $description = 'Active Push Message';
/
Create a new command instance.
@return void
/
public function __construct()
{
parent::__construct();
}
/
Execute the console command.
@return mixed
/
public function handle()
{
$arg = $this->argument('action');
switch ($arg) {
case 'start':
$this->info('swoole server started');
$this->start();
break;
case 'stop':
$this->info('swoole server stoped');
break;
case 'restart':
$this->info('swoole server restarted');
break;
}
}
/
启动Swoole
/
private function start()
{
$this->ws = new swoole_websocket_server("0.0.0.0", 9502);
//监听WebSocket连接打开事宜
$this->ws->on('open', function ($ws, $request) {
});
//监听WebSocket事宜
$this->ws->on('message', function ($ws, $frame) {
$this->info("client is SendMessage\n");
});
//监听WebSocket主动推送事宜
$this->ws->on('request', function ($request, $response) {
$scene = $request->post['scene']; // 获取值
$this->info("client is PushMessage\n".$scene);
});
//监听WebSocket连接关闭事宜
$this->ws->on('close', function ($ws, $fd) {
$this->info("client is close\n");
});
$this->ws->start();
}
}
前面说的是 swoole 中onRequest的实现,下面实现下在掌握器中主动触发onRequest回调。实现方法便是我们熟习的curl要求。
# 调用activepush方法往后,会在cmd中打印出
# client is PushMessage 主动推送 字眼
/
CURL要求
@param $data
/
public function curl($data)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "http://127.0.0.1:9502");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_exec($curl);
curl_close($curl);
}
/
主动触发
/
public function activepush()
{
$param['scene'] = '主动推送';
$this->curl($param); // 主动推送
用场onRequest 回调特殊适用于须要在掌握器中调用的推送,比如模板之类,在掌握器中调用。