1. 程式人生 > >PHP程式報錯處理---記錄日誌,發郵件

PHP程式報錯處理---記錄日誌,發郵件

<?php
# 防止檔案直接被訪問
/*if( !defined( 'ERROR_MAIL' ) ){
    header("HTTP/1.0 404 Not Found");
    exit;
}*/

var_dump(ERROR_MAIL);exit;
//錯誤郵件
if( ERROR_MAIL ){

    headers_sent() ?  '' : header('content-type:text/html;charset=utf-8');

    //程式的錯誤處理方法

    /**
     * 程式錯誤時候會提示的錯誤資訊
     * @todo 需要單獨記錄日誌或者是傳送報錯郵件
     */
    function shutdown_func(){

        $log_content = "\r\n請求介面" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . '發生錯誤';

        $error_info = error_get_last();
        //需要記錄的錯誤級別
        $error_level = array(
            1,
            2,
            4,
//            8,
            16,
            32,
            64,
            128,
            256,
            512
        );

        //記錄致命性的錯誤
        if( in_array(  $error_info['type'] , $error_level )  ) {
            $error_info = print_r( $error_info , true );
        }else{
            return '';
        }
        $err_obj = new ErrorMail();
        $err_obj -> doWriteLog( $error_info );
    }

    #註冊錯誤函式
    register_shutdown_function( 'shutdown_func' );

    # 自定義錯誤
    function userError( $errno, $errstr, $errfile, $errline ) {

        $log_content = "\r\n請求介面" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . '發生錯誤';

        $not_write_log = array( 2 , 8 , 1024 , 2048 , 4096, 8191 );
        if( in_array( $errno , $not_write_log ) ){
            return '';
        }
        $log =  "\r\n" . '----------------------------------------------------'."\r\n Error: \r\n 錯誤編碼:[$errno] \r\n 錯誤資訊:$errstr";
        $log .=" Error on line $errline in $errfile";
        $log .="\r\n ---------------------------------------------------- \r\n";
        $err_obj = new ErrorMail( './log/');
        $err_obj -> doWriteLog( $log_content . $log );
    }
    set_error_handler('userError');
}
# 郵件的配置
$conf = array(

    //日誌檔案大小
    'log_size' => 10000000 ,

    //發生郵件頻率
    'send_time' => 300 ,

    //郵件傳送人
    'EMAIL_CONF' => array(
        //傳送郵件的使用者
        'send_user' => '***@****.com' ,
        'send_psd' => '*****' ,
        'send_smtp' => 'smtp.****.com',

        //接收郵件的Email
        'receive' => array(
            '
[email protected]
' , ), 'mail_title' => '[ANDROID_API_ERROR]API發生異常' ) ); /** * Class ErrorMail * 錯誤處理以及郵件傳送類 */ class ErrorMail{ //錯誤檔案的大小 [位元組] public $error_log_size = ''; //發生郵件的頻率 public $error_mail_send_time = '' ; //檔案控制代碼 public $handle = ''; //日誌檔案 public $Log_file_path = ''; /** * 構造方法 * ErrorMail constructor. */ public function __construct( $file_path = ''){ if( !empty( $file_path ) ){ $this -> Log_file_path = str_replace( '\\' , '/' , $file_path ); }else{ $this -> Log_file_path = str_replace( '\\' , '/' , dirname( __FILE__ ) . '/accessLog/errorLog/api_Error.log' ); } if( !is_file( $this -> Log_file_path ) ){ $dir = substr( $this -> Log_file_path , 0 , strrpos( $this -> Log_file_path , '/' ) ); //遞迴建立資料夾 if( !is_dir( $dir ) ){ mkdir( $dir , 0777 , true ); } //生成資料夾 if( !is_file( $this -> Log_file_path ) ){ $this -> handle = fopen( $this -> Log_file_path , 'a+' ); } } //檔案控制代碼 if( empty( $this -> handle ) ){ $this -> handle = fopen( $this -> Log_file_path , 'a+' ); } } /** * 記錄錯誤日誌 */ public function doWriteLog( $log = '' ){ $error_time = '[' . sprintf( '%s' , date('Y-m-d H:i:s') ) . ']'; $error_info = $log; if( !empty( $log ) ){ $error_info = $log; }else{ $error_info = print_r( $error_info ,true ) ; } $error_msg = $error_info ; $log = $error_time . $error_msg; fwrite( $this -> handle , $log ); $this -> sendApiErrorMail(); } /** * 判斷是否需要傳送郵件 */ public function sendApiErrorMail(){ #宣告全域性變數 global $conf; //檔案建立時間超過五分鐘,並且不為空 或者是 檔案超過10M 就傳送錯誤郵件 $file_u_time = filectime( $this -> Log_file_path ); //獲取檔案大小 $file_size_byte = filesize( $this -> Log_file_path ); if( ( time() - $file_u_time >= $conf['send_time'] && $file_size_byte > 0 ) || $file_size_byte >= $conf['log_size']){ //傳送郵件 $log_content = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; $log_time = $_SERVER['REQUEST_TIME']; $send_result = $this -> __send_mail__( $conf['EMAIL_CONF']['receive'] , '' , $log_content . '介面發生問題,請求時間:' . $log_time . '請及時排查問題' ); //刪除錯誤日誌檔案 if( $send_result['mark'] == true ){ fclose( $this -> handle ); $this -> handle = ''; //刪除日誌檔案 unlink( $this -> Log_file_path ); } } } /** * 傳送郵件 */ public function __send_mail__( $email_addr_arr , $reply_to , $mail_content ){ #宣告全域性變數 global $conf; //include_once __DIR__ . '/ThinkPHP/Library/Vendor/Mail/class.phpmailer.php'; //例項化郵件傳送類 $mail = new PHPMailer(); // 使用SMTP方式傳送 $mail->IsSMTP(); // 設定郵件的字元編碼 $mail->CharSet='UTF-8'; // 企業郵局域名 $mail->Host = $conf['EMAIL_CONF']['send_smtp']; // 啟用SMTP驗證功能 $mail->SMTPAuth = true; // //郵件傳送人的使用者名稱(請填寫完整的email地址) $mail->Username = $conf['EMAIL_CONF']['send_user']; // 郵件傳送人的密碼 $mail->Password = $conf['EMAIL_CONF']['send_psd']; //郵件傳送者email地址 $mail->From = $conf['EMAIL_CONF']['send_user']; //傳送郵件人的標題 $mail->FromName = $conf['EMAIL_CONF']['send_user']; //收件人地址,可以替換成任何想要接收郵件的email信箱,格式是AddAddress("收件人email","收件人姓名") foreach( $email_addr_arr as $k => $v){ $mail->AddAddress("$v", substr( $v, 0 , strpos($v ,'@'))); } if( !empty( $reply_to ) ){ foreach( $reply_to as $kk => $vv){ //收件人地址,可以替換成任何想要接收郵件的email信箱,格式是AddCC("收件人email","收件人姓名") $mail->AddCC("$vv", substr( $vv, 0 , strpos($vv ,'@'))); } } //回覆的地址 $mail->AddReplyTo( $conf['EMAIL_CONF']['send_user'] , "" ); //$mail->AddAttachment("./mail.rar"); // 新增附件 // set email format to HTML //是否使用HTML格式 $mail->IsHTML(true); //郵件標題 $mail->Subject = $conf['EMAIL_CONF']['mail_title']; //郵件內容 $mail->Body = "<p style='color:red'>" . $mail_content . '</p>'; //附加資訊,可以省略 $mail->AltBody = ''; // 新增附件,並指定名稱 $mail->AddAttachment( $this -> Log_file_path ,'api_error.log'); //設定郵件中的圖片 //$mail->AddEmbeddedImage("shuai.jpg", "my-attach", "shuai.jpg"); if( !$mail->Send() ){ $mail_return_arr['mark'] = false ; $str = "郵件傳送失敗. <p>"; $str .= "錯誤原因: " . $mail->ErrorInfo; $mail_return_arr['info'] = $str ; }else{ $mail_return_arr['mark'] = true ; $str = "郵件傳送成功"; $mail_return_arr['info'] = $str ; } return $mail_return_arr; } /** * 解構函式 */ public function __destruct( ){ if( is_resource( $this -> handle ) ){ //關閉檔案控制代碼 fclose( $this -> handle ); } } }


相關推薦

PHP程式處理---記錄日誌郵件

<?php # 防止檔案直接被訪問 /*if( !defined( 'ERROR_MAIL' ) ){ header("HTTP/1.0 404 Not Found"); exit; }*/ var_dump(ERROR_MAIL);exit; /

nginx搭建php程式解決---TP框架

1、TP框架中 出現如下錯誤:      訪問網站 http://192.168.0.204/ STORAGE_WRITE_ERROR_:./Runtime/Cache/Home/51620d75af91aa77adc53082d1113d54.php錯誤

部署php程式:站點已關閉

場景: 之前把公司線上的php原始碼包拿到筆記本的虛擬機器上測試部署,部署完成後通過瀏覽器訪問總是出現站點已關閉 原因:把線上php程式配置檔案config.php裡面的資料庫連線資訊改成了筆記本虛擬機器的資料庫連線資訊,所有報錯 解決:把config.php裡面的資料庫連線資訊 重新改回來即可,就是說拿

tikv節點擴容NTP處理記錄

之前已經使用ansible 批量安裝部署啟動過ntp 安裝:ansible -i sms_addtikv.txt all -m shell -a "sudo yum install ntp ntpdate -y" -b 啟動:ansible -i sms_addtikv.

使用WinDbg抓取程式的Dump檔案例如抓取IE崩潰的Dump

 前幾天分享了一個關於如何抓藍屏Dump的帖子,今天再和大家分享一個使用WinDbg來抓取程式崩潰的Dump。有了Dump後,我們可以很迅速的解決問題,比如說IE崩潰,QQ崩潰,很多時候我們是一點頭緒都沒有的,但是有了WinDbg後,這一切將變的簡單!雖然WinDbg

寫給菜鳥如何使用logback記錄日誌郵件

一、簡易使用logback,不含有logback.xml 下載 logback和slf4j的幾個jar包,包括3個即可:logback-core-1.1.7.jar 、logback-classic-

linux寫一個監控日誌郵件的shell

back_day=`date -d '1 day ago' +%Y-%m-%d` finance_linux_log_user=/home/admin/output/logs/user TARGET_SERVER="crmfinance1 crmfinance2 crm-f

vue-cli 專案執行時報處理'webpack-dev-server' 不是內部或外部命令也不是可執行的程式更換電腦執行本地的vue-cli專案處理

在做vue-cli 腳手架搭建專案時,把本地專案拷回自己的電腦上執行報錯,後來經查閱解決, 報錯資訊 'webpack-dev-server' 不是內部或外部命令,也不是可執行的程式 或批處理檔案。 npm ERR! code ELIFECYCLE npm ERR! er

騰訊Bugly錯誤日誌上傳實時監測程式問題

https://bugly.qq.com/docs/user-guide/instruction-manual-android/?v=201801191058421.新建專案異常上報:ECLIPES:Android Studio:檢視錯誤:首頁-立即接入-雙擊我們的專案,檢視

Oracle11g靜默安裝dbcanetca處理--直接跟換操作系統

update npr 處理 grep gist net flags button been 最近給一個客戶安裝oracle 11gr2 概述: 操作系統:linux 32位操作系統 [oracle@nbsrfx response]$ uname -aLinux nb

CentOS7安裝過程中磁盤大於2T的處理

系統問題描述 服務器磁盤單盤空間大於2TB,在安裝CentOS7時出現下圖報錯: Boot failure.Reboot and Select proper Boot device... 問題原因: 安裝CentOS 7時,如果硬盤容量小於2TB,系統默認會使用MBR格式來安裝。如果大於2TB則需要使

在flask框架中對wtforms的SelectMultipleField的一個處理

pre inf req ESS multi bmi 其中 ews IT 先粘貼代碼: form.py文件: users = SelectMultipleField( label="請選擇用戶", validators=[ DataRequired(

CSDN程式碼內容複製後在程式中格式處理方法

很多人遇到程式程式碼複製後格式問題報錯後,往往都是直接一行一行的調節格式內容,可能程式碼量不多,一般花費10-40分鐘都可以調節過來,但其實不需要這麼麻煩,可以總結一些簡單的方法: 1、拷貝程式程式碼 2、程式設計軟體中整體報錯

程式404xxx.css或xxx.js找不到伺服器快取問題

小程式報錯如下: 1.小程式報404錯誤,xxx.css或xxx.js檔案找不到,是伺服器快取問題。伺服器需要清理快取,不然會出現小程式後臺管理系統內容已經更新,可是訪問不了 2.我是用vue框架寫的小程式後臺管理系統,npm run build之後把dist裡面的stat

藍鯨平臺本地上傳大檔案ERR_CONNECTION_RESE處理client intended to send too large body:server: paas.blueking.com

[[email protected] etc]# pwd /data/bkce/etc [[email protected] etc]# vim nginx.conf [[email protected] nginx]# pw

curl: (35) SSL connect error處理更新nss版本;Linux版本centos7下載樹

處理 請求命令 curl -O https:// xxx 時候,報錯curl: (35) SSL connect error 原因是nss版本有點舊了,yum -y update nss更新一下 Linux7下載樹地址: http://mirrors.163.com/centos

記錄sk-video的安裝以及處理

遇到一個專案的程式碼是使用sk-video讀取視訊資料,在使用pip install sk-video命令完成安裝之後,卻發現無法讀取視訊。後來發現需要使用ffmpeg作為後端。但是使用使用pip install ffmpeg之後,安裝完成ffmpeg之後,卻還是無法實現。 在github上

mysql儲存emoji表情處理qq互聯mysql儲存暱稱中帶表情的資料時報

前言      做qq互聯登入時發現一個問題,如果qq暱稱中有表情時存入mysql資料庫會報錯。 java.sql.SQLException: Incorrect string value: "ð" for colum n "name" at row 1 a

微信小程式最新的騰訊外掛處理和例項程式碼

出門在外,免不了查詢地圖的需求!為了幫助開發者們進一步“減負”,騰訊地圖的外掛添加了路線規劃的能力,主要解決“向用戶展示從A到B路線”的問題。使用外掛的正確姿勢究竟是什麼呢?今天我們給大家介紹——騰訊地圖外掛的能力。小程式最近推出了一個騰訊地圖的外掛,地址:騰訊地圖外掛說明。

入手mpvue之一:快速搭建一個mpvue結構並新建一個元件後程式未正確呼叫page 或page[]未發現元件

背景:  公司專案重構,要把之前用wepy做的小程式重新用mpvue來做,短期來說又是一次陣痛,又需要一個過渡期來適應新的框架,但長期來說還是值得的,因為以後要做多端適配的時候可以只用一套程式碼,微調下就行了,相對來說成本更低。實戰:快速構建專案:# 1. 先檢查下 Node