PHP餐厅结账系统:如何用PHP或JavaScript同时在两台打印机打印?
最优实现方案推荐
嘿,这个场景我刚好帮几家餐饮客户解决过——前端JS受限于浏览器的安全机制,确实没法直接控制多台本地打印机,最优的方案肯定是让后端(PHP)来处理打印逻辑,下面给你分两种靠谱的实现路径:
方案一:后端调用系统原生打印命令(最通用)
这种方式适用于所有支持系统打印的打印机,不管是USB还是网络打印机,核心思路是:
- 在收银机/服务器上提前配置好两台打印机,给它们设置好唯一的名称(比如
Kitchen-Printer和Customer-Printer) - PHP生成对应两张票据的内容(可以是纯文本、HTML转PDF,或者餐饮常用的ESC/POS指令)
- 调用系统的打印命令,指定打印机名称完成打印
代码示例(以Linux为例)
假设你已经用wkhtmltopdf把HTML格式的票据转成了PDF文件:
// 生成厨房单和客户单的PDF文件 $kitchenPdfPath = '/tmp/kitchen_order.pdf'; $customerPdfPath = '/tmp/customer_order.pdf'; // 调用Linux打印命令,指定打印机 exec("lp -d Kitchen-Printer {$kitchenPdfPath}"); exec("lp -d Customer-Printer {$customerPdfPath}"); // Windows环境可以用lpr命令: // exec("lpr -S localhost -P Kitchen-Printer {$kitchenPdfPath}");
注意事项
- 要确保运行PHP的用户(比如www-data)有打印权限,Linux下可以把用户加入
lp组 - 如果是纯文本票据,直接打印文本文件更高效,不需要转PDF:
exec("lp -d Kitchen-Printer /tmp/kitchen_order.txt")
方案二:直接向ESC/POS打印机发送指令(餐饮场景首选)
大部分餐饮用的小票打印机都是支持ESC/POS指令的(比如爱普生、佳博的机型),这种方式可以绕过系统打印服务,直接通过USB端口发送打印指令,速度更快、格式更精准。
实现步骤
- 安装PHP的ESC/POS扩展库,比如
mike42/escpos-php(可以用Composer安装) - 找到两台打印机对应的系统端口:Windows下是
COMx,Linux下是/dev/usb/lp0、/dev/usb/lp1这类 - 分别连接两台打印机,发送不同的打印内容
代码示例
require __DIR__ . '/vendor/autoload.php'; use Mike42\Escpos\PrintConnectors\FilePrintConnector; use Mike42\Escpos\Printer; // 连接厨房打印机(假设端口是/dev/usb/lp0) $kitchenConnector = new FilePrintConnector("/dev/usb/lp0"); $kitchenPrinter = new Printer($kitchenConnector); // 打印厨房单内容 $kitchenPrinter->text("=== 厨房订单 ===\n"); $kitchenPrinter->text("菜品:宫保鸡丁 x2\n"); $kitchenPrinter->text("备注:少辣\n"); $kitchenPrinter->cut(); $kitchenPrinter->close(); // 连接客户打印机(假设端口是/dev/usb/lp1) $customerConnector = new FilePrintConnector("/dev/usb/lp1"); $customerPrinter = new Printer($customerConnector); // 打印客户单内容 $customerPrinter->text("=== 结账小票 ===\n"); $customerPrinter->text("宫保鸡丁 x2:¥60\n"); $customerPrinter->text("总价:¥60\n"); $customerPrinter->text("支付方式:微信\n"); $customerPrinter->cut(); $customerPrinter->close();
注意事项
- 要确保PHP有访问USB端口的权限,Linux下可以给端口文件设置权限:
chmod 666 /dev/usb/lp0 - 不同品牌的打印机ESC/POS指令可能略有差异,需要参考对应机型的手册
不推荐的前端方案(应急可用)
如果暂时没法改后端,前端可以尝试用Web USB API,但这个需要用户手动授权选择打印机,而且兼容性差(只有Chrome系浏览器支持),没法自动完成双打印,适合临时过渡用,不推荐作为长期方案。
内容的提问来源于stack exchange,提问作者Marcelo Soares
相关产品推荐
相关产品推荐

