php远程电脑开机启动不了,PHP - 网络唤醒(WOL)功能的实现

a839ecad4b5aab88a276b4a4c1a93c8e.png

要实现网络唤醒,特别是通过 Internel唤醒。除了电脑主板要支持这个功能并开启外,路由器设置相关的端口转发规则。这些操作可以看我之前的文章,这里就再多讲了:群晖NAS实现广域网开机办法(附pc,苹果电脑远程开机方法)

1,PHP实现网络唤醒原理

过去我在外面要唤醒家里的设备都是通过 App。这里介绍如何使用 PHP实现同样的功能,它的原理和那些网络唤醒 App都是一样,就是给目标的地址发送一个唤醒数据包(Magic Packet)。当然发送除了目标地址外,还要有端口和目标设备的 MAC地址。

2,功能实现

(1)为方便使用这里定义一个网络唤醒类 WOL(在 wol.php 文件中)

/**

* 实现网络唤醒功能

*/

class WOL

{

private $hostname; // 唤醒设备的url地址

private $mac; // 唤醒设备的mac地址

private $port; // 唤醒设备的端口

private $ip; // 唤醒设备的ip地址(不是必须的,程序会自动根据$hostname来获取对应的ip)

private $msg = array(

0 => "目标机器已经是唤醒的.",

1 => "socket_create 方法执行失败",

2 => "socket_set_option 方法执行失败",

3 => "magic packet 发送成功!",

4 => "magic packet 发送成功!"

);

function __construct($hostname,$mac,$port,$ip = false)

{

$this->hostname = $hostname;

$this->mac = $mac;

$this->port = $port;

if (!$ip)

{

$this->ip = $this->get_ip_from_hostname();

}

}

public function wake_on_wan()

{

if ($this->is_awake())

{

return $this->msg[0]; // 如果设备已经是唤醒的就不做其它操作了

}

else

{

$addr_byte = explode(':', $this->mac);

$hw_addr = '';

for ($a=0; $a<6; $a++) $hw_addr .= chr(hexdec($addr_byte[$a]));

$msg = chr(255).chr(255).chr(255).chr(255).chr(255).chr(255);

for ($a=1; $a<=16; $a++) $msg .= $hw_addr;

// 通过 UDP 发送数据包

$s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

if ($s == false)

{

return $this->msg[1]; // socket_create 执行失败

}

$set_opt = @socket_set_option($s, 1, 6, TRUE);

if ($set_opt < 0)

{

return $this->msg[2]; // socket_set_option 执行失败

}

$sendto = @socket_sendto($s, $msg, strlen($msg), 0, $this->ip, $this->port);

if ($sendto)

{

socket_close($s);

return $this->msg[3]; // magic packet 发送成功!

}

return $this->msg[4]; // magic packet 发送失败!

}

}

private function is_awake()

{

$awake = @fsockopen($this->ip, 80, $errno, $errstr, 2);

if ($awake)

{

fclose($awake);

}

return $awake;

}

private function get_ip_from_hostname()

{

return gethostbyname($this->hostname);

}

}

?>

(2)下面是一个测试代码(index.php),使用时只要传入相关的参数即可。

include("wol.php");

$WOL = new WOL("wake.hangge.com","00:21:32:56:E2:E8","9090");

$status = $WOL->wake_on_wan();

echo $status;

?>

(3)访问上面的 index.php页面,可以看到返回数据包发送成功的信息。如果我们电脑那边相关配置正确的话,此时应该就已经被唤醒了。

cd8c4179f279856e0fab7346b683dc36.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值