0

我有一个 PHP 脚本,它能够使用 WoL 启动我网络中的任何计算机,检查它的连接性,然后输出状态。它通过尝试连接到一个端口来检查连接——比如 3389/RDP,当建立连接时,它输出“SUCCESS”,否则输出“FAILED”。为了让它不止一次地检查连接性,它使用了一个刷新页面的元标记。

为了让它看起来不错,我有一个 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>
4

2 回答 2

0

将 php 页面的某些部分拆分为部分或封装在函数中(例如 checkStatus($server="all"); )然后当您要加载页面时,默认情况下,如果您不提供计算机,则正常加载页面, 否则你可以说只是刷新这部分。

于 2013-04-27T21:43:32.763 回答
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 语法的知识。你的代码很垃圾。

于 2013-04-27T22:59:40.183 回答