PHP实现wol
实现WOL(Wake-on-LAN)功能的PHP方法
WOL(Wake-on-LAN)是一种通过网络远程唤醒处于休眠或关机状态的计算机的技术。以下是使用PHP实现WOL功能的详细方法:
构造Magic Packet
Magic Packet是WOL的核心,它是一个特殊格式的网络数据包,包含目标计算机的MAC地址重复16次,前缀为6个FF(十六进制)。PHP中可通过以下代码构造:
$macAddress = '00:11:22:33:44:55'; // 替换为目标MAC地址
$macAddress = str_replace(':', '', $macAddress); // 移除分隔符
$macBinary = hex2bin($macAddress);
$magicPacket = str_repeat("\xFF", 6) . str_repeat($macBinary, 16);
发送UDP数据包
Magic Packet通常通过UDP协议发送到目标网络的广播地址(如192.168.1.255)或子网定向广播地址,端口一般为7或9:
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1);
socket_sendto($socket, $magicPacket, strlen($magicPacket), 0, '192.168.1.255', 9);
socket_close($socket);
完整PHP函数示例
以下是整合后的完整WOL函数实现:
function wakeOnLan($macAddress, $broadcastIp = '192.168.1.255', $port = 9) {
// 清理MAC地址格式
$macAddress = str_replace([':', '-', ' '], '', $macAddress);
// 验证MAC地址格式
if (!preg_match('/^[0-9A-Fa-f]{12}$/', $macAddress)) {
throw new Exception('Invalid MAC address format');
}
// 构造Magic Packet
$macBinary = hex2bin($macAddress);
$magicPacket = str_repeat("\xFF", 6) . str_repeat($macBinary, 16);
// 创建并发送UDP包
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($socket === false) {
throw new Exception('Socket creation failed');
}
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;
}
使用注意事项
目标计算机必须满足以下条件才能响应WOL:
- BIOS/UEFI中已启用WOL功能
- 网卡驱动支持并已配置WOL
- 计算机处于软关机状态(非完全断电)
- 发送端与目标机在同一局域网,或路由器支持端口转发和WOL包转发
跨子网唤醒方案
对于跨子网唤醒需求,可以考虑:
- 在目标网络的路由器上设置端口转发(UDP 7/9)
- 使用支持WOL的中继服务
- 通过VPN连接到目标网络后发送WOL包
以上方法提供了在PHP环境下实现WOL功能的完整方案,可根据实际网络环境调整广播地址和端口参数。







