It checks for ping domains or IP addresses and displays them in your browser. The good ones are in green boxes and the bad ones are in red boxes. It refreshes the page every two minutes. After that it sends you a email when a host is down and sends you another mail when the host is up. It uses one txt file to store the array of down hosts, so that you don't receive mail every two minutes with downed hosts.
First of all for this script to work you have to download phpmailer from here:
https://github.com/PHPMailer/PHPMailer
Then edit the setting and you are ready to go:
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'phpmailer/src/Exception.php';
require 'phpmailer/src/PHPMailer.php';
require 'phpmailer/src/SMTP.php';
// List of IP addresses/hostnames to monitor
$addresses = [
'192.168.1.1' => 'Local Network',
'google.com' => 'Google',
];
// Function to check reachability (OS-aware)
function pingAddress($address) {
$os = strtoupper(substr(PHP_OS, 0, 3));
if ($os === 'WIN') {
$command = "ping -n 1 " . escapeshellarg($address); // Windows command
} else {
// Linux/Unix command with IPv4 and timeout
$command = "ping -4 -c 1 -W 2 " . escapeshellarg($address);
}
exec($command, $output, $result);
// Analyze output
if ($os === 'WIN') {
foreach ($output as $line) {
if (strpos($line, 'Destination host unreachable') !== false ||
strpos($line, 'Request timed out') !== false) {
return false;
}
}
return $result === 0;
} else {
// For Linux, check exit code and packet loss
foreach ($output as $line) {
if (strpos($line, '100% packet loss') !== false) {
return false;
}
}
return $result === 0;
}
}
// Email notification function
function sendEmail($subject, $body) {
$mail = new PHPMailer(true);
try {
// SMTP configuration
$mail->isSMTP();
$mail->Host = ''; // SMTP server address
$mail->SMTPAuth = true;
$mail->Username = ''; // SMTP username
$mail->Password = ''; // SMTP password
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // Encryption
$mail->Port = 587; // TCP port
// Encoding settings
$mail->CharSet = 'UTF-8';
// Sender information
$mail->setFrom('sonik@webleit.eu', 'Ping Monitor');
// Recipient list
$recipients = [
'user@mail.com' => 'User name 1',
'user2@mail.com' => 'User name 2',
];
foreach ($recipients as $email => $name) {
$mail->addAddress($email, $name);
}
// Email content
$mail->isHTML(true);
$mail->Subject = $subject;
$mail->Body = $body;
$mail->send();
echo 'Notification email sent successfully.';
} catch (Exception $e) {
echo "Email delivery failed: {$mail->ErrorInfo}";
}
}
// Read previous failures
$previousFailedAddresses = [];
if (file_exists('failed_addresses.txt')) {
$fileContent = file_get_contents('failed_addresses.txt');
if (!empty($fileContent)) {
$previousFailedAddresses = json_decode($fileContent, true);
if (!is_array($previousFailedAddresses)) {
$previousFailedAddresses = []; // Reset if invalid JSON
}
}
}
// Track current failures
$currentFailedAddresses = [];
// HTML output with auto-refresh
echo "<html><head>";
echo "<meta http-equiv='refresh' content='120'>"; // Auto-refresh every 2 minutes
echo "</head><body>";
echo "<table border='1' cellpadding='5' cellspacing='0'>";
$index = 0;
foreach ($addresses as $address => $description) {
if ($index % 5 == 0) echo "<tr>";
$isReachable = pingAddress($address);
$status = $isReachable ? 'Online' : 'Offline';
$color = $isReachable ? 'green' : 'red';
echo "<td style='background-color: $color; padding: 10px;'>";
echo "<strong>$address</strong><br>$description<br><em>$status</em>";
echo "</td>";
if (!$isReachable) {
$currentFailedAddresses[$address] = $description;
}
if (($index + 1) % 5 == 0) echo "</tr>";
$index++;
}
// Detect new outages
$newFailedAddresses = array_diff_key($currentFailedAddresses, $previousFailedAddresses);
if (!empty($newFailedAddresses)) {
$subject = "New Service Outages Detected";
$body = "New unreachable services:";
foreach ($newFailedAddresses as $address => $description) {
$body .= "- <strong>$address</strong> ($description)
";
}
$body .= "";
sendEmail($subject, $body);
}
// Detect recoveries
$recoveredAddresses = array_diff_key($previousFailedAddresses, $currentFailedAddresses);
if (!empty($recoveredAddresses)) {
$subject = "Service Restorations Detected";
$body = "Recovered services:";
foreach ($recoveredAddresses as $address => $description) {
$body .= "- <strong>$address</strong> ($description)
";
}
$body .= "";
sendEmail($subject, $body);
}
// Save current status
file_put_contents('failed_addresses.txt', json_encode($currentFailedAddresses));
// Close HTML table
echo "</table>";
echo "</body></html>";
This script and this article are in the process of development ask your questions here.