You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP餐厅结账系统:如何用PHP或JavaScript同时在两台打印机打印?

最优实现方案推荐

嘿,这个场景我刚好帮几家餐饮客户解决过——前端JS受限于浏览器的安全机制,确实没法直接控制多台本地打印机,最优的方案肯定是让后端(PHP)来处理打印逻辑,下面给你分两种靠谱的实现路径:

方案一:后端调用系统原生打印命令(最通用)

这种方式适用于所有支持系统打印的打印机,不管是USB还是网络打印机,核心思路是:

  1. 在收银机/服务器上提前配置好两台打印机,给它们设置好唯一的名称(比如Kitchen-Printer和Customer-Printer)
  2. PHP生成对应两张票据的内容(可以是纯文本、HTML转PDF,或者餐饮常用的ESC/POS指令)
  3. 调用系统的打印命令,指定打印机名称完成打印

代码示例(以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端口发送打印指令,速度更快、格式更精准。

实现步骤

  1. 安装PHP的ESC/POS扩展库,比如mike42/escpos-php(可以用Composer安装)
  2. 找到两台打印机对应的系统端口:Windows下是COMx,Linux下是/dev/usb/lp0、/dev/usb/lp1这类
  3. 分别连接两台打印机,发送不同的打印内容

代码示例

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:50:29