PHP-Funktion für Wake-on-LAN
Mal wieder eine kleine aber feine PHP-Funktion. Diesmal geht es darum, einen Rechner per Wake-on-LAN-Signal (WOL) über das Netzwerk aufzuwecken. Prinzipiell muss dazu nur eine Verbindung zu einem anderen Rechner im Netzwerk oder einem Router aufgebaut werden, der dann das entsprechende Signal im Netzwerk herumschickt und so den gewünschten Computer aufweckt, sobald dieser das Signal empfängt.
Das Signal ist relativ einfach aufgebaut: 6 Mal der Hexwert FF und anschließend 16 Mal die MAC-Adresse der Netzwerkkarte des zu weckenden Rechners. Dieses sogenannte MagicPacket wird via UDP an Port 0, 7 oder 9 gesendet.
Wenn man die IP-Adresse des Routers nicht kennt, kann auch ein Broadcast (Signal an alle Geräte im Netzwerk) gesendet werden, sofern der Router dies zulässt.
<?php
# MAC-Adresse des zu weckenden Rechners
$mac = '00:00:00:00:00:00';
# IP des Routers (255.255.255.255 für Broadcast)
$ip = 'udp://255.255.255.255';
function wakeup($mac, $router) {
if(strlen($mac) !== 17)
return FALSE;
if(filter_var($router, FILTER_VALIDATE_URL) === FALSE)
return FALSE;
$raw = sscanf($mac, '%2x:%2x:%2x:%2x:%2x:%2x');
$func = create_function('$v', 'return isset($v);');
$raw = array_filter($raw, $func);
if(sizeof($raw) !== 6)
return FALSE;
# Router-Verbindung aufbauen auf Port 9 mit 4 Sekunden Timeout
$fp = fsockopen($router, 9, $errnum, $errstr, 4);
if(is_resource($fp) === FALSE) {
trigger_error('['.$errnum.'] '.$errstr, E_USER_ERROR);
return FALSE;
}
# Beginn des MagicPacket
$magicp = "\xFF\xFF\xFF\xFF\xFF\xFF";
# MAC in ASCII-Zeichen umwandeln
$hexmac = '';
foreach($raw AS $c) {
$hexmac .= chr($c);
}
# 16 Mal MAC an MagicPacket anhängen
$magicp .= $hexmac.$hexmac.$hexmac.$hexmac.$hexmac.$hexmac.$hexmac.$hexmac.$hexmac.$hexmac.$hexmac.$hexmac.$hexmac.$hexmac.$hexmac.$hexmac;
fwrite($fp, $magicp);
fclose($fp);
printf('Wake-Up-Signal an %02X:%02X:%02X:%02X:%02X:%02X übertragen!', $raw[0], $raw[1], $raw[2], $raw[3], $raw[4], $raw[5]);
return TRUE;
}
wakeup($mac, $ip);
?>Ich benutze diese Funktion um den Server aus der Ferne aus dem Ruhezustand zu holen, um mit ihm arbeiten zu können.

