2013-04-27 4 views
0

У меня есть 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 &nbsp;&nbsp;&nbsp; roadrunner &nbsp;&nbsp;&nbsp;"; 
echo '<a href="#" onclick="doSomething()">power on</a>'; 
?> 
<div id="mydiv"></div> 

</html> 

ответ

0

Использование iframe.

<html> 
<head> 
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"> 
<title>WOL</title> 
</head> 
<body> 

<iframe src="status1.php"></iframe> 

</body> 
</html> 

Кстати, вы должны немного узнать о синтаксисе HTML. Ваш код дерьмо.

+0

Но это не будет вызвано ссылкой или кнопкой, который просто запускает php-скрипт на загрузке родительской страницы. И я попытался использовать target = "framename" с href, но это не будет работать по какой-то причине. – dnn

+0

Используйте javascript для установки src iframe. Пример проверки: http://jsfiddle.net/gCzqf/ – ghost

+0

Я переключился на использование iframe. Но вместо того, чтобы использовать JS для установки src iframe, я просто использовал «target» в href/button, поскольку это работает с кросс-фреймами, а не только внутри активной страницы/фрейма. Спасибо :-) – dnn

0

прекращаться части страницы PHP как секции или Encaps в функции (например, checkStatus ($ server = "all");) Затем, когда вы хотите загрузить страницу, по умолчанию, если вы не предоставляете компьютер, вы загружаете страницу как обычно, иначе вы можете просто обновить эту часть.

+0

Я не уверен, правильно ли я понял ваш ответ. PHP по-прежнему необходимо каким-то образом обновить, даже если я установил проверку подключения в свой «раздел»? И если я создам отдельный JS для этого, вывод не будет отображаться в том же месте на веб-сайте, что и первый JS (насколько я могу понять) – dnn