当前位置:首页 > 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可以通过结合其他技术和工具来实现直播功能。以下是几种常见的方法: 使用流媒体服务器 配置流媒体服务器如Nginx-RTMP、Red5或Wowza。这些服务器支持RTMP协…

php实现博客

php实现博客

使用PHP实现博客系统 数据库设计 创建数据库表存储博客文章和用户信息。常见的表包括posts(文章)和users(用户)。 CREATE TABLE users ( id INT AUTO…

php 实现队列

php 实现队列

PHP 实现队列的方法 PHP 可以通过多种方式实现队列功能,以下是几种常见的实现方法: 使用数组实现队列 PHP 数组可以通过 array_push 和 array_shift 函数模拟队列的先进…

php 实现单点登录

php 实现单点登录

PHP 实现单点登录的方法 单点登录(SSO)允许用户通过一次登录访问多个相互信任的系统。以下是基于 PHP 的实现方案: 基于共享 Session 的方案 在同一个主域名下的子域名间可以通过共享…

php mvc 实现

php mvc 实现

PHP MVC 实现方法 MVC(Model-View-Controller)是一种设计模式,用于分离应用程序的逻辑、数据和界面。以下是实现PHP MVC框架的关键步骤。 目录结构 创建以下目录结构…

php 实现无限分类

php 实现无限分类

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、菜单管理等。以下是几种常见的实现方式: 邻接列表模型(Adjacency List) 这是最简单的实现方式,每个分类记录存储其父…