[Chia sẻ] Code PHP kiểm tra server down và gửi mail thông báo

Discussion in 'Chia Sẻ Tool & Bot' started by Dang, Apr 14, 2021.

  1. Dang

    Dang Bang Chúng

    Chào anh em,
    Mạn phép chia sẻ với anh em đoạn code php cùi mía của em, dùng để kiểm tra server có bị down hay không và gửi mail thông báo nếu bị lỗi. Cách triển khai như sau :
    1. Tạo thư mục tùy ý trên máy chủ hoặc 1 host riêng (phải ổn định)
    2. Tạo file .php với nội dung là đoạn code của em bên dưới
    3. Tạo "domains.txt", với mỗi IP hoặc domain (hợp lệ - có thể dùng # ở trước để ghi chú) trên 1 dòng
    4. Tùy chỉnh chức năng gửi mail bằng cách tải PHP Mailer và tùy chỉnh trong file .php từ dòng 140 - 147
    5. Tạo Crobjon đến file .php vừa tạo ở trên. Thời gian kiểm tra có thể để từ 30 - 60 phút tùy ý
    Code tham khảo, anh em góp ý hoặc có tool thì chia sẻ để mọi người học hỏi thêm nhé!
    Tks anh em!

    PHP:
    <?php

    @set_time_limit(-1);

    @
    date_default_timezone_set('Asia/Bangkok');

    if (!
    headers_sent())
    {
        
    header('Cache-Control: no-cache, no-store, must-revalidate, max-age=0, post-check=0, pre-check=0');
        
    header('Pragma: no-cache');
        
    header('Expires: 0');
    }



    /**
    * Kiểm tra url "vẫn còng sống" nếu HTTP CODE trả về : 200, 301, 302, 403, 404
    * @return : true | false
    */
    function check_url_live($url '')
    {

        
    $response = array('http_code' => 0);

        if (
    $ch = @curl_init())
        {

            
    $curl_setopt_array = array(
                
    CURLOPT_URL => $url,
                
    CURLOPT_RETURNTRANSFER => true,
                
    CURLOPT_SSL_VERIFYPEER => false,
                
    CURLOPT_FOLLOWLOCATION => true,
                
    CURLOPT_CONNECTTIMEOUT => 30,
                
    CURLOPT_TIMEOUT => 30,
                
    CURLOPT_MAXREDIRS => 10,
                
    CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36',
                
    CURLOPT_AUTOREFERER => false,
                
    CURLOPT_HTTPHEADER => array('Cache-Control: no-cache'),
                
    CURLOPT_FRESH_CONNECT => true,
                
    CURLOPT_HEADER => false,
                
    CURLOPT_NOBODY => true,
                
    CURLOPT_CUSTOMREQUEST => 'HEAD',
                );

            
    $curl_setopt_array[CURLOPT_ENCODING] = '';

            
    curl_setopt_array($ch$curl_setopt_array);

            @
    curl_exec($ch);

            
    $response = @curl_getinfo($ch);

            @
    curl_close($ch);

            unset(
    $ch);

        }

        
    $http_code = (!empty($response['http_code'])) ? (intval($response['http_code'])) : (0);

        return ((
    $http_code == 200) || ($http_code == 301) || ($http_code == 302) || ($http_code == 403) || ($http_code == 404));

    }



    /**
    * Kiểm tra server theo IP hoặc tên miền có bị down
    * Kiểm tra tối đa 3 lần liên tiếp nếu bị down
    * @return true (vẫn sống, hoặc ip / tên miền sai định dạng thì bỏ qua) | string (là tên miền nếu false)
    */
    function check_server_live($domain ''$max 3)
    {

        if (
    preg_match('/^(?:[a-z0-9\-]+\.)+[a-z]{2,6}$/i'$domain) || preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/'$domain))
        {

            
    $false 0;

            for (
    $i 0$i $max$i++)
            {

                if (
    false === check_url_live("http://{$domain}"))
                {

                    
    $false++;

                    
    sleep(1);

                }
                else
                {
                    break;
                }

            }

            if (
    $false >= $max)
            {
                return 
    $domain;
            }

        }

        return 
    true;

    }



    /**
    * Lấy danh dách IP / tên miền từ file "domains.txt" để kiểm tra
    */
    $lines array_map('trim'array_unique(array_filter(file('domains.txt'))));

    if (!empty(
    $lines))
    {

        
    $err = array();

        foreach (
    $lines as $line)
        {

            
    $check check_server_live($line);

            if ((!empty(
    $check)) && (is_string($check)))
            {
                
    $err[] = $check;
            }

        }

        if (!empty(
    $err))
        {

            
    $list sprintf('<b>%s</b>'implode('</b>, <b>'$err));

            
    $mail_body sprintf('<div style="font-family:Tahoma,Arial,sans-serif;font-size:16px;line-height:24px">Chào quản trị viên,<br/>Hệ thống đã phát hiện lỗi truy cập đến %s vào %s. Vui lòng kiểm tra và khắc phục lỗi!<br /><span style="font-size:11px;font-style:italic;color:#CC0000">* Nếu lỗi đã được khắc phục, vui lòng bỏ qua cảnh báo này!</span><br /><span style="font-size:11px;font-style:italic;color:#CC0000">* Đây là hệ thống mail tự động, vui lòng không phản hồi!</span><br />.</div>'$listdate('H:i d/m/Y'));

            
    // TÙY CHỈNH GỬI MAIL Ở ĐÂY

            // api_send_mail(array(
            // 'to' => '[email protected]',
            // 'subject' => sprintf('BÁO LỖI TRUY CẬP %s', date('H:i d/m/Y')),
            // 'message' => $mail_body,
            // 'name' => 'Server Down Warning',
            // ));

        
    }

        
    print_r($err);

    }



    /**
    * EOF
    */
     
    money, catd3vjl, nhat.itsuper and 2 others like this.
  2. sincos

    sincos Bang Chúng

    App uptimerobot có hết rồi bạn. Đừng cố phát minh lại cái bánh xe.

    Còn nếu bạn cần tự động hoá gì đó khi server gặp vấn đề thì hãy viết script.
     
    money, automan, firefox and 2 others like this.
  3. Phan Thị

    Phan Thị Bang Chúng

    uptimerobot best cmnr . Mấy cái này lại để chung với cái host cần check thì fun.
     
    Dang likes this.
  4. Dang

    Dang Bang Chúng

    Tks bác, em mới biết món này!

    Em có nói "để trên máy chủ hoặc 1 host riêng (phải ổn định)" mà bác :D

    Kiến thức hạn hẹp, bác @Hoa Mãn Lâu xóa hộ em cái thớt, để tốn tài nguyên quá {feel_good}
     
    Hoa Mãn Lâu likes this.
  5. EDM

    EDM Sơ Nhập Giang Hồ

    Hay mà bác, cứ để đó ai không biết thì vào xem. Mình hay viết noti qua telegram hay discord cũng ok
     
    Dang likes this.
  6. Hoa Mãn Lâu

    Hoa Mãn Lâu Trưởng Môn

    Ko sao, để ae học hỏi thêm code của pác củng dc mà.
     
    Dang likes this.
  7. bmt511

    bmt511 Khách Qua Đường

    đây là ý tưởng tốt. nếu làm chủ nhiều server sẽ tự cấu hình check quản trị theo ý mình.
    còn uptime robot dành cho người it server.
     
  8. baihehn

    baihehn Khách Qua Đường

    Hay quá. Đã up thử rồi.