博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
websocket账号密码登录php,PHP实现微信扫码登陆(四)--使用workerman搭建websocket服务器...
阅读量:5011 次
发布时间:2019-06-12

本文共 2946 字,大约阅读时间需要 9 分钟。

因为使用laravel, 所以使用artisan编写服务,

也可以使用其他文件编写, 直接用php 命令执行, 参照博客

PHP使用workerman实现后端消息推送前端, 完成微信登录

建议先读一下上边这边博客, 有助于读者理解整个推送过程

代码如下

app/Console/Commands/WebsocketServer

namespace App\Console\Commands;

use Illuminate\Console\Command;

use Workerman\Worker;

use Log;

class WebsocketServer extends Command

{

private $worker = null;

/**

* The name and signature of the console command.

*

* @var string

*/

protected $signature = 'websocket {action}';

/**

* The console command description.

*

* @var string

*/

protected $description = 'start websocket server for accept client connect';

/**

* Create a new command instance.

*

* @return void

*/

public function __construct()

{

parent::__construct();

}

/**

* Execute the console command.

*

* @return mixed

*/

public function handle()

{

global $argv;

$arg = $this->argument('action');

$argv[1] = $argv[2];

$argv[2] = isset($argv[3]) ? "-{$argv[3]}" : '';

switch ($arg) {

case 'start':

$this->start();

break;

case 'stop':

break;

case 'restart':

break;

case 'reload':

break;

case 'status':

break;

case 'connections':

break;

}

}

private function start(){

// 使用websocket协议, 监听端口, 等待客户端发起websocket连接

$this->worker = new Worker('websocket://0.0.0.0:18888');

// 保存客户端连接

$this->worker->uidConnections = [];

$this->worker->count = 1;

$this->worker->onWorkerStart = function ($worker) {

// 创建内部连接, 用于接收扫码后, php服务器推送的消息

$inner_text_worker = new Worker('tcp://0.0.0.0:18889');

$inner_text_worker->onMessage = function ($connection, $buffer) {

Log::alert('workerman inner accept message : ' . $buffer);

$data = json_decode($buffer, true);

$uid = $data['scene'];

$token = $data['token'];

// 向浏览器推送用户标识

$res = $this->sendMessageByUid($uid, $token);

Log::alert('workerman reply message to uid : '. $uid .'..$openid..'. $token);

$mess = $res ? 'ok' : 'fail';

Log::alert('workerman reply message : ' . $mess);

// 通知php客户端推送结果

$connection->send($mess);

};

$inner_text_worker->listen();

};

$this->worker->onMessage = function ($connection, $data) {

Log::alert('workerman accept browser data : ' . $data);

if (!isset($connection->uid)) {

$connection->uid = $data;

$this->worker->uidConnections[$connection->uid] = $connection;

return;

}

};

$this->worker->onClose = function ($connection) {

if (isset($connection->uid)) {

Log::alert('workerman close browser : ' . $connection->uid);

unset($this->worker->uidConnections[$connection->uid]);

}

};

Worker::runAll();

}

/**

* 消息广播

* @param $message

*/

private function broadCast($message)

{

global $worker;

foreach ($worker->uidConnections as $connection) {

$connection->send($message);

}

}

private function sendMessageByUid($uid, $message)

{

Log::alert(json_encode($this->worker->uidConnections));

if (isset($this->worker->uidConnections[$uid])) {

$connection = $this->worker->uidConnections[$uid];

$connection->send($message);

return true;

}

return false;

}

}

在app/Console/Kernel.php中注册

protected $commands = [

//

WebsocketServer::class,

];

进入到项目根目录, 启动, 等待连接

php artisan websocket start

转载地址:http://umggp.baihongyu.com/

你可能感兴趣的文章
EasyUI datagrid 的多条件查询
查看>>
Mac升级bash到最新版本
查看>>
利用vagrant打包系统--制作自己的box
查看>>
美女与硬币问题
查看>>
计算几何算法概览 (转)
查看>>
Notepad++的ftp远程编辑功能
查看>>
数据库多对多关联表(Python&MySQL)
查看>>
[实变函数]1.2 集合的运算
查看>>
第06天
查看>>
设计模式的征途—5.原型(Prototype)模式
查看>>
iOS10 app连接不上网络的问题
查看>>
结对开发之电梯调度最终稿(徐梦迪&刘博)
查看>>
simple java mail
查看>>
信息建模
查看>>
Mybatis 数据库物理分页插件 PageHelper
查看>>
虚函数、纯虚函数详解
查看>>
z-stack中数据的发送,广播、组播、点对点
查看>>
Practial Vim 学习笔记一
查看>>
.NET中使用js实现百度搜索下拉提示效果[不是局部刷新,呜呜。。]
查看>>
ITCAST视频-Spring学习笔记(使用Spring的注解方式实现AOP入门)
查看>>