У меня есть PHP-скрипт, который может подключаться к любому компьютеру в моей сети с помощью WoL, проверять его подключение и затем выводить статус. Он проверяет подключение, пытаясь подключиться к порту - например, 3389/RDP, и когда соединение выполняется, оно выводит «УСПЕХ», иначе «FAILED». Чтобы получить возможность проверить подключение более чем за один раз, он использует метатег, который обновляет страницу.PHP/html: Альтернатива обновлению
Чтобы он выглядел красиво, у меня есть JS, который загружает и отображает вывод PHP-скрипта. Но когда он проверяет подключение компьютера, он обновляет всю страницу, тем самым демонстрируя только выход php-скрипта и ничего больше.
Как заставить PHP-скрипт повторить соединение каким-либо другим способом?
Это PHP скрипт:
<?php
##################################################
## php WoL with port check - PRThomasUK. ##
## blog.pete-thomas.me.uk ##
##################################################
//
// ################## user variables... ##################
// Friendly name for device, example "My Computer".
$device = "roadrunner";
// IP address of device, example "x.x.x.x".
$deviceip = "10.0.0.20";
// TCP Port on device to check, example "3389" = RDP, "80" = WebServer.
$deviceport = "3389";
// MAC address of NIC1 on device, example "00:00:00:00:00:00" or "00-00-00-00-00-00".
$devicemac1 = "00-11-22-33-44-55";
// MAC address of NIC2 on device, example "00:00:00:00:00:00" or "00-00-00-00-00-00". - Optional set to "" if NIC2 not required.
$devicemac2 = "";
// Number of times to attempt to connect to port on device after magic packet sent, example "10"
$maxtries = "10";
// Broadcast address of network, example ""x.x.x.x". ("255.255.255.255" works in most cases.)
$broadcast = "255.255.255.255";
// ICMP port number, default "7".
$udport = "7";
// Timeout value for re-tries (in seconds), default "10".
$timeout = "2";
// #######################################################
//
// ##### Read in variables from url #####
//
// $frame - used to determine which content to display when executed.
$frame = "1";
// $tries - used to determine number of attempts at checking port beetween reloads, compared with maxtries.
$tries = $_GET[ "tries" ];
// $pageurl - obtain URL used to access file, used when creating frameset & setting reloads.
$pageurl = pageurl();
// Process variables used in frame2, increments tries & sets status to Success(1) or Failed(2)
if ($frame == 1) {
processurl();
}
// ###### Functions ######
//
// function pageurl() - Returns URL of page via PHP variables.
function pageurl()
{
$pageurl = "HTTP";
if ($_SERVER[ "HTTPS" ] == "on") {
$pageurl .= "S";
}
$pageurl .= "://";
if ($_SERVER[ "SERVER_PORT" ] != "80") {
$pageurl .= $_SERVER[ "SERVER_NAME" ] . ":" . $_SERVER[ "SERVER_PORT" ] . $_SERVER[ "REQUEST_URI" ];
} else {
$pageurl .= $_SERVER[ "SERVER_NAME" ] . $_SERVER[ "REQUEST_URI" ];
}
$urlarts = explode("?", $pageurl);
$pageurl = $urlarts[ "0" ];
return $pageurl;
}
// function processurl() - Processes variables used in frame2, increments tries & sets status to Success(1) or Failed(2)
function processurl()
{
global $status, $tries, $maxtries;
if ($status == 0 && $tries < $maxtries - 1) {
$tries = $tries + 1;
} else {
$status = 2;
}
if (portcheck() == 0) {
$status = 1;
}
}
// function wakeonlan() - Attempts to send WoL packet and returns outcome.
function wakeonlan($device, $mac)
{
global $broadcast, $udport;
$mac = preg_replace("/[^A-Za-z0-9]/", ":", $mac);
$broadcast_byte = explode(':', $mac);
$hw_addr = '';
for ($a = 0; $a < 6; $a++)
$hw_addr .= chr(hexdec($broadcast_byte[ $a ]));
$msg = chr(255) . chr(255) . chr(255) . chr(255) . chr(255) . chr(255);
for ($a = 1; $a <= 16; $a++)
$msg .= $hw_addr;
$s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($s == false) {
$content = "Error creating socket!\n";
} else {
// setting a broadcast option to socket:
$opt_ret = socket_set_option($s, 1, 6, true);
if ($opt_ret < 0) {
$content = "setsockopt() failed, error: " . strerror($opt_ret) . "\n";
}
if (socket_sendto($s, $msg, strlen($msg), 0, $broadcast, $udport)) {
$content = "WoL packet sent to mac address " . $mac . "...\n";
socket_close($s);
} else {
$content = "Failed to send WoL packet!";
}
}
return $content;
}
// function portcheck() - Attempts to connect to TCP port on the device via a Socket, returns $errno.
function portcheck()
{
global $deviceip, $deviceport;
$file = fsockopen($deviceip, $deviceport, $errno, $errstr, 50);
if ($errno == 0) {
fclose($file);
}
return $errno;
}
// function htmlheader() - Returns HTML Header for TITLE and if Frame2 REFRESH set.
function htmlheader()
{
global $device, $frame, $tries, $maxtries, $status, $pageurl, $timeout;
// global "custom" header settings
$content = "<TITLE>PHP WoL ($device) - by PRThomasUK </TITLE>\n";
//generate refresh header for frame2.
if ($status == 0) {
$content .= "<META HTTP-EQUIV=\"refresh\" CONTENT=\"$timeout;url=$pageurl?&tries=$tries\">\n";
}
return $content;
}
// function htmlheader() - Returns HTML content for mainpage, frame1 & frame2 based on value of $frame.
function htmlcontent()
{
global $pageurl, $device, $deviceip, $deviceport, $devicemac1, $devicemac2, $frame, $tries, $maxtries, $status;
if ($frame == 1) {
if ($status == 0) {
$content = "<p>$tries/$maxtries retries failed.</p>\n";
} elseif ($status == 1) {
$content .= "<p>SUCCESS</p>\n";
} else {
$content .= "<p>FAILED</p>\n"; }
} else {
$content = "<FRAMESET rows=\"10,*\" frameborder=0 border=0>\n";
$content .= "<FRAME SRC=\"$pageurl?frame=2\">\n";
$content .= "<NOFRAMES>\n";
if ($devicemac2) {
$content .= "<BR>\n";
$content .= wakeonlan($device, $devicemac2);
}
$content .= "<BR>\n";
$content .= "<BR>\n";
$content .= "<FONT COLOR=\"red\">\n";
$content .= "<H2>Your browser does not support frames...</H2>\n";
$content .= "</FONT>\n";
$content .= "<H3>Status of $device will not be monitored!</H3>\n";
$content .= "</NOFRAMES>\n";
$content .= "</FRAMESET>\n";
} return $content;
}
?>
<?php
echo htmlheader();
echo htmlcontent();
?>
И это мой index.php:
<html>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>WOL</title>
<script type="text/javascript" src="jquery-1.9.1.min.js"></script>
<script type="text/javascript">
function doSomething() {
$('#mydiv').load('status1.php', function() {alert('Loaded!');});
}
</script>
<?php
echo "10.0.0.20 roadrunner ";
echo '<a href="#" onclick="doSomething()">power on</a>';
?>
<div id="mydiv"></div>
</html>
Но это не будет вызвано ссылкой или кнопкой, который просто запускает php-скрипт на загрузке родительской страницы. И я попытался использовать target = "framename" с href, но это не будет работать по какой-то причине. – dnn
Используйте javascript для установки src iframe. Пример проверки: http://jsfiddle.net/gCzqf/ – ghost
Я переключился на использование iframe. Но вместо того, чтобы использовать JS для установки src iframe, я просто использовал «target» в href/button, поскольку это работает с кросс-фреймами, а не только внутри активной страницы/фрейма. Спасибо :-) – dnn