PHP实现wol
PHP实现WOL(Wake-on-LAN)功能
WOL(Wake-on-LAN)是一种通过网络唤醒处于休眠或关机状态计算机的技术。以下是使用PHP实现WOL功能的详细方法:
发送魔术包的基本原理
WOL通过发送包含目标设备MAC地址的"魔术包"(Magic Packet)实现唤醒。魔术包是一个广播帧,包含6字节的FF(十六进制)前缀,后跟16次重复的目标MAC地址。
使用PHP的socket函数发送魔术包
function wakeOnLan($macAddress, $broadcastIp = '255.255.255.255', $port = 9) {
// 清理MAC地址格式
$macAddress = str_replace([':', '-'], '', $macAddress);
// 验证MAC地址
if (!ctype_xdigit($macAddress) || strlen($macAddress) != 12) {
throw new InvalidArgumentException('无效的MAC地址格式');
}
// 创建魔术包
$magicPacket = str_repeat(chr(0xFF), 6);
for ($i = 0; $i < 16; $i++) {
$magicPacket .= hex2bin($macAddress);
}
// 创建UDP socket
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($socket === false) {
throw new RuntimeException('无法创建socket: ' . 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
socket_close($socket);
return $result !== false;
}
使用示例
try {
$mac = '00:11:22:33:44:55'; // 替换为目标设备的MAC地址
$success = wakeOnLan($mac);
echo $success ? '唤醒信号已发送' : '发送失败';
} catch (Exception $e) {
echo '错误: ' . $e->getMessage();
}
注意事项
目标计算机必须支持WOL功能并在BIOS/UEFI中启用。网卡和操作系统也需要正确配置WOL设置。
路由器通常需要允许局域网广播。某些网络环境可能需要在同一子网中发送魔术包。
对于跨子网唤醒,需要配置路由器的端口转发或使用专用工具。PHP脚本通常需要在与目标设备相同的局域网中运行。
替代方案:使用exec调用外部工具
如果系统允许执行外部命令,可以使用如wakeonlan或etherwake等工具:
function wakeOnLanExec($macAddress) {
$macAddress = escapeshellarg($macAddress);
exec("wakeonlan $macAddress 2>&1", $output, $returnVar);
return $returnVar === 0;
}
此方法需要系统已安装相关工具,且PHP有执行权限。







