wol php实现
PHP 实现 Wake-on-LAN (WoL)
Wake-on-LAN (WoL) 是一种网络协议,允许通过发送魔术包(Magic Packet)远程唤醒处于关机或休眠状态的计算机。以下是使用 PHP 实现 WoL 功能的详细方法。
魔术包的结构
魔术包是一个 UDP 数据包,包含目标设备的 MAC 地址重复 16 次,前缀为 6 个字节的 0xFF。格式如下:
6 bytes of 0xFF + 16 * MAC address
PHP 实现代码
以下是一个完整的 PHP 函数,用于发送 WoL 魔术包:
function wakeOnLan($macAddress, $broadcastIp = '255.255.255.255', $port = 9) {
// 验证 MAC 地址格式
if (!preg_match('/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/', $macAddress)) {
throw new InvalidArgumentException("Invalid MAC address format");
}
// 去除 MAC 地址中的分隔符
$macAddress = str_replace([':', '-'], '', $macAddress);
// 创建魔术包
$magicPacket = str_repeat(chr(0xFF), 6);
for ($i = 0; $i < 16; $i++) {
$magicPacket .= hex2bin($macAddress);
}
// 创建 UDP 套接字
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($socket === false) {
throw new RuntimeException("Socket creation failed: " . socket_strerror(socket_last_error()));
}
// 设置广播选项
socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1);
// 发送魔术包
$result = socket_sendto($socket, $magicPacket, strlen($magicPacket), 0, $broadcastIp, $port);
socket_close($socket);
return $result !== false;
}
使用示例
try {
$macAddress = '00:1A:2B:3C:4D:5E'; // 替换为目标设备的 MAC 地址
$success = wakeOnLan($macAddress);
echo $success ? "WoL packet sent successfully" : "Failed to send WoL packet";
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}
注意事项
- 目标计算机必须支持 WoL 功能,并且在 BIOS/UEFI 中已启用。
- 网络设备(如路由器、交换机)需允许广播流量通过。
- 如果目标设备位于不同子网,需指定正确的广播地址或网关地址。
- 某些网络环境可能阻止 UDP 广播包,需检查防火墙设置。
替代实现
对于无法使用 socket 扩展的环境,可以使用 fsockopen 实现:
function wakeOnLanFsockopen($macAddress, $broadcastIp = '255.255.255.255', $port = 9) {
$macAddress = str_replace([':', '-'], '', $macAddress);
$magicPacket = str_repeat("\xFF", 6) . str_repeat(hex2bin($macAddress), 16);
$fp = fsockopen("udp://$broadcastIp", $port, $errno, $errstr, 2);
if ($fp) {
fwrite($fp, $magicPacket);
fclose($fp);
return true;
}
return false;
}
调试建议
- 使用网络抓包工具(如 Wireshark)验证魔术包是否被正确发送。
- 检查目标设备的网络接口指示灯是否在收到魔术包后闪烁。
- 确保 MAC 地址输入正确,大小写不敏感但格式需一致。







