当前位置:首页 > PHP

wol php实现

2026-01-30 00:33:54PHP

PHP 实现 Wake-on-LAN (WoL)

Wake-on-LAN (WoL) 是一种网络协议,允许通过发送魔术包(Magic Packet)远程唤醒处于关机或休眠状态的计算机。以下是使用 PHP 实现 WoL 功能的详细方法。

wol php实现

魔术包的结构

魔术包是一个 UDP 数据包,包含目标设备的 MAC 地址重复 16 次,前缀为 6 个字节的 0xFF。格式如下:

wol php实现

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 地址输入正确,大小写不敏感但格式需一致。

标签: wolphp
分享给朋友:

相关文章

php实现文件上传

php实现文件上传

PHP 文件上传实现方法 在 PHP 中实现文件上传需要处理 HTML 表单和服务器端脚本。以下是详细步骤: 创建 HTML 表单 使用 enctype="multipart/form-data"…

php实现验证码

php实现验证码

PHP实现验证码的方法 使用GD库生成验证码 GD库是PHP中处理图像的扩展,可用于生成验证码图片。 <?php session_start(); $width = 120; $height…

git php实现

git php实现

Git 与 PHP 的集成实现 使用 PHP 执行 Git 命令 通过 PHP 的 exec()、shell_exec() 或 passthru() 函数可以直接调用 Git 命令,适用于服务器端操作…

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证码…

php实现静态

php实现静态

静态化实现方法 PHP实现静态化主要通过生成HTML文件或缓存机制来减少服务器动态解析的开销。以下是几种常见方法: 生成静态HTML文件 通过file_put_contents()将动态内容保存为H…

php实现短信验证

php实现短信验证

PHP实现短信验证的步骤 选择合适的短信服务提供商 国内常见的短信服务提供商包括阿里云短信、腾讯云短信、云片等。注册账号并获取API密钥和签名模板是第一步。这些平台通常提供详细的开发文档和SDK。…