PHP error_logパフォーマンスの問題
-
05-07-2019 - |
質問
私は、サイトで使用できるエラー処理クラスを作成しようとしており、エラーが発生した場合にメールで通知します。問題は、アプリケーションのプロファイルを作成すると、error_log関数が窒息することです。ここに私のコードがあります(クラスを省略します:
class ErrorHandler
{
private static $instance;
private static $mail;
private function __clone(){}
private function __construct()
{
error_reporting( E_ALL | E_STRICT );
if(!defined('ENV')){
if(私は、サイトで使用できるエラー処理クラスを作成しようとしており、エラーが発生した場合にメールで通知します。問題は、アプリケーションのプロファイルを作成すると、error_log関数が窒息することです。ここに私のコードがあります(クラスを省略します:
<*>
何がそれを殺しているのか理解するのを手伝ってもらえますか?
SERVER['SERVER_ADDR']=='127.0.0.1' || 私は、サイトで使用できるエラー処理クラスを作成しようとしており、エラーが発生した場合にメールで通知します。問題は、アプリケーションのプロファイルを作成すると、error_log関数が窒息することです。ここに私のコードがあります(クラスを省略します:
<*>
何がそれを殺しているのか理解するのを手伝ってもらえますか?
SERVER['SERVER_NAME']=='localhost')
{
#echo"local environment<br>";
DEFINE('ENV','LOCAL');
ini_set('display_errors', 1);
}
else
{
#echo"live environment";
DEFINE('ENV','LIVE');
ini_set('display_errors', 0);
}
}
}
public function setErrorConfig($error_level,$mail='',$mode='production')
{
error_reporting($error_level);
switch($mode)
{
case 'development':
ini_set('display_errors', '1');
break;
case 'production':
ini_set('display_errors', '0');
if($mail != ''){
self::$mail = $mail;
set_error_handler(array('ErrorHandler', 'handleError'));
}
break;
default:
ini_set('display_errors', '0');
error_reporting( E_ERROR );
break;
}
}
public function handleError($e_num,$e_msg,$e_file,$e_line,$e_vars)
{
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$headers .= 'From: DC_Research Site' . "\r\n";
$msg = '';
$msg .= '<html><head></head><body>';
$msg .= '<STYLE>h2{font-family:verdana;}</STYLE>';
$msg .= '<h2>Error Description:</h2>';
$msg .= '<h2>Script:</h2><p>'.$e_file.'</p>';
$msg .= '<h2>Line:</h2><p>'.$e_line.'</p>';
$msg .= '<h2>Message:</h2><p>'.$e_msg.'</p>';
$msg .= '<h2>Variables:</h2><p>'.$e_vars.'</p>';
$msg .= '</html></body>';
#mail(self::$mail,'Error Report',$msg,$headers);
error_log($msg,1,self::$mail,$headers);
}
}
何がそれを殺しているのか理解するのを手伝ってもらえますか?
解決 3
ようやくこの問題を解決しました。メールにログを記録するようにエラーハンドラーを設定しようとすると、スクリプトはローカルセットアップでのみ動作します-メールサーバーが見つからないためです(私は推測します)。ロケーションを検出する条件でメソッド呼び出しをラップすると、問題が停止します。
他のヒント
定義上、メールの送信は高価な操作です(SMTPサーバーに接続する必要がある可能性が非常に高いため)。したがって、プログラムのプロファイルを作成すると、error_logで費やされる時間はプログラムの他の行で費やされる時間に比べて膨大になります。
エラー情報をデータベースに保存してから、cronスクリプトにその内容をメールで送信できます。ユーザーがメールを送信するよりも、DBに保存する方が速くなると思います