php 原生 `stream_socket_server()` 不支持直接绑定到广播地址(如 `255.255.255.255`),需改用底层 `socket_*` 扩展,并配合防火墙放行、套接字选项配置及正确绑定才能可靠接收 udp 广播。
在 PHP 中接收 UDP 广播(如 DHCP 请求、服务发现消息等)是一个常见但易出错的任务。许多开发者尝试使用 stream_socket_server() 配合 SO_BROADCAST 上下文选项,却始终收不到广播包——即使 tcpdump 明确显示数据已到达网卡。根本原因在于:stream_socket_server() 无法绑定到广播地址(如 255.255.255.255 或子网广播地址如 10.88.0.255),它仅支持单播地址绑定;而广播接收必须显式绑定到广播地址或 0.0.0.0(配合 SO_BROADCAST 选项)。
正确的解决方案是使用 PHP 的底层 socket 扩展(需启用 sockets 扩展),并按以下关键步骤配置:
✅ 1. 创建 UDP 套接字
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if (!$socket) {
throw new RuntimeException('Failed to create socket: ' . socket_strerror(socket_last_error()));
}
✅ 2. 设置必要套接字选项
立即学习“PHP免费学习笔记(深入)”;