Workerman怎么做点餐系统的后厨小票机实时出单分发?

花韻仙語

花韻仙語

2026-05-25

789人浏览

原创

websocket连接建立后,需让后厨小票机带printer_id等唯一标识主动连接workerman服务器,并在onconnect中解析参数存入$connections[printer_id]=$connection;下单时查该数组精准单播推送,配合formatforkitchen()结构化转换订单字段,区分打印场景,避免原样透传冗余数据。

workerman怎么做点餐系统的后厨小票机实时出单分发?

WebSocket 连接建立后,如何把订单推给指定后厨小票机?

Workerman 本身不内置“打印机驱动”或“硬件协议”,它只负责把订单数据实时推送到连接在后厨的终端设备(比如运行了 WebSocket 客户端的打印服务)。关键在于:你得让后厨小票机主动连上你的 Workerman WebSocket 服务器,并带上唯一标识(如 printer_idkitchen_area),这样你才能按需广播或单播。

常见错误是所有小票机都用同一个连接 ID,结果改单、加菜时全店乱打。正确做法是在客户端连接时就传参:

  • 小票机端用 JS 或 PHP 客户端连接 ws://your-domain:8080?printer_id=kitchen_a
  • 服务端在 $ws_worker->onConnect 中解析 $connection->getRemoteIp() 和 query 参数,存进全局数组或 Redis,例如:$connections[$printer_id] = $connection
  • 下单时查 $connections['kitchen_b'],只推给对应区域的小票机

订单结构怎么设计,才能兼容一菜一单、套餐拆单、打包分组?

后厨小票不是简单 dump 订单 JSON。不同厨房场景对字段粒度要求差异很大:凉菜间要看到“去皮、少冰”,打包台要看到“牛皮纸袋+泡沫盒”,主厨要看“先炸后炒”。所以不能把前端下单的 order 原样转发,必须做结构化转换。

建议在推送前走一层 formatForKitchen() 函数,按配置动态生成字段:

  • 启用“一菜一单”时,把一个订单拆成多条消息,每条含 item_nameqtynotesprint_group
  • 遇到套餐,检查是否开启“套餐明细打印”,若开启,则展开子项并标记 is_sub_item: true
  • 外卖单需提取 packaging_group 字段(来自天财商龙等系统的扩展字段),并确保该字段随消息一起下发

别直接透传小程序原始 payload——里面可能混着营销券、用户地址等后厨完全不需要的信息。

Workerman
Workerman

最新主版本,继续强化高性能异步网络能力,适合 WebSocket、HTTP 服务、长连接、IM、IoT 等场景。 本次版本主要围绕稳定性、协议兼容以及连接处理能力优化,依旧保持超轻量和纯 PHP 特性。 适用于 PHP 8.x 环境,可配合 webman、GatewayWorker 等生态使用。

下载

为什么加菜/退菜消息总比前台晚半秒,甚至漏发?

根本原因是没区分“事件类型”和“连接状态”。Workerman 的 onMessage 是纯通道,如果你在处理加菜逻辑时用了同步 MySQL 查询 + 多次 $connection->send(),而某个小票机刚好网络抖动断连又重连,旧连接句柄还在内存里但已失效,就会卡住整个 loop。

必须做两件事:

  • 所有推送操作包在 try...catch 里,捕获 Connection reset by peer 类错误后,从 $connections 数组中清理掉失效句柄
  • 加菜/退菜这类变更消息,统一走异步队列(如 Redis Pub/Sub)中转,Workerman 的 Worker 进程只负责监听队列、校验权限、再精准投递,避免业务逻辑阻塞 IO 线程
  • 前端触发加菜后,不要等后厨返回 success 才更新 UI;而是本地乐观更新,后厨失败时再 toast 提示“厨房未收到,请重试”

多台小票机共用一台打印机,怎么避免并发打印错乱?

这不是 Workerman 的问题,是硬件层的串行控制问题。即使你用 printer_id 区分了逻辑路由,如果多台小票机最终都连向同一台 USB 打印机(比如通过 Windows 共享或 CUPS),物理层没有排队机制,就会出现 A 单还没打完、B 单内容插进来,打出半张乱码单。

解决方案只有两个方向:

  • 硬件上:换支持网络协议(如 ESC/POS over TCP)的热敏打印机,每台小票机直连独立 IP,由 Workerman 分发到不同 IP 地址,彻底隔离通路
  • 软件上:在小票机本地起一个轻量打印代理(如 Python + escpos 库),Workerman 只发 JSON 给它,由它自己做队列、加锁、重试,不依赖系统打印池

别指望靠 sleep(1) 或文件锁解决——高并发下毫秒级竞争,锁粒度不对等于没锁。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

workerman

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

5550

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

3630

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

1808

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

2295

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

2832

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

2021

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

3097

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

2363

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

10932

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman中文手册
Webman中文手册

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

ThinkPHP5.1完全开发手册
ThinkPHP5.1完全开发手册

共0课时 | 0人学习