laravel 通过PHPSocket.io 与前端socket.io通信
目标:laravel后台通过command启动socket.io服务与前台连接推送消息
一、后台服务
protected $signature = 'socket-message-server {action=status}';
protected $description = 'WebSocket server controller';
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
// 指定文件路径
@unlink(storage_path('socket-message-server.pid'));
@unlink(storage_path('socket-message-server.log'));
Worker::$pidFile = storage_path('socket-message-server.pid');
Worker::$logFile = storage_path('socket-message-server.log');
$this->formatArgv();
$io = new SocketIO(6010);
$io->on('workerStart', function () use ($io) {
Log::debug('socket-message-server start.');
// 创建全局定时器
$this->loopPushMessageDing($io);
});
$io->on('connection', function ($socket) use ($io) {
// 连接事件回调 可在此增加业务验证逻辑和自定义事件
// 自定义事件示例 auth
$socket->on('auth', function(array $data) use ($socket){
// 自定义事件 业务逻辑
});
$socket->on('disconnect', function () use ($socket) {
// 处理断开连接事件代码
});
});
Worker::runAll();
}
protected function loopPushMessageDing(SocketIO $io): void
{
// 设置全局定时器
Timer::add(5, function () use ($io) {
// 业务逻辑
}
}
二、docker配置
// docker-compose.yml
socket_message:
build:
context: ./docker
dockerfile: Dockerfile-socket-message
restart: always
depends_on:
- app
ports:
- "${APP_IP}:${APP_SOCKET_PORT}:6010"
volumes:
- ./:/srv/app
// Dockerfile-socket-message
FROM image
EXPOSE 6010
ENTRYPOINT ["php", "artisan", "socket-message-server", "start"]
三、Nginx配置
upstream server-message {
server 172.17.0.1:8888;
location server-message {
proxy_pass http://server-message;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $remote_addr;
}
四、前端连接示例
async connect() {
let res = await getData('通过后台接口区分线上线下ip,方便调试');
let notifyUrl = res.notify_url;
const notifyWs = io(notifyUrl, {
path: `server-print`,
transports: ['websocket'] // 不设置可能轮询建立连接
});
let _this = this;
// 处理连接事件
notifyWs.on('connect', function () {
notifyWs.emit('auth', {
// auth参数传递
});
_this.onConnect();
});
}
小结
一、回顾
1、此项目致力于优化之前的socket通知服务,所以没有过多创新,功能包和大体结构还是沿用之 前的设计。在原先的基础上增加了redis缓存,将消息推送逻辑重写的更加合理。并对功能进行拆分。
2、完成效果和刚接手原型时思考的有些许出入,实际业务并没有想象中的复杂和庞大,如此结构已经可以适用了。
3、学习到了docker的一些知识
二、小结
1、在此项目组了解了些许功能,虽然业务逻辑上不适用但是感觉很有意思,私下可以尝试下。如:phpsocket.io启动后开内部http端口通过phpsocket.io向客户端推送数据
还有文中没有写出来的一些子功能如:通过菜鸟打印组件自定义一维码,二维码模板,再通过ws通信本地菜鸟打印组件进行自定义面单打印
2、最近在学习深入剖析nginx这本书,下次希望能写一篇关于nginx的博文。
3、行情不好,还有老赖欠钱。 情绪有点混乱
推荐文章: