当前位置:首页 > PHP

wol php实现

2026-01-30 00:33:54PHP

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

wol php实现

标签: wolphp
分享给朋友:

相关文章

php实现分页

php实现分页

PHP实现分页的基本方法 使用原生PHP实现分页功能需要结合数据库查询和HTML展示。以下是核心实现步骤: 数据库查询与分页逻辑 // 连接数据库 $conn = new mysqli('loca…

php实现文件下载

php实现文件下载

PHP 实现文件下载的方法 使用 header() 函数强制下载 设置正确的 HTTP 头信息,强制浏览器下载文件而不是直接打开。 $file = 'path/to/file.pdf'; if (f…

php实现递归

php实现递归

递归的基本概念 递归是一种函数调用自身的技术,适用于解决可以分解为相同子问题的问题。在PHP中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n!…

php实现上传

php实现上传

PHP 文件上传实现 HTML 表单设置 创建一个包含文件上传字段的 HTML 表单,确保表单的 enctype 属性设置为 multipart/form-data,这是文件上传必需的设置。 &l…

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面…