에러 디버깅

아래 부분을 복사해서 저장한 후 include해서 사용하시면 됩니다. 파일 3갠데요. 중요한 것은 common.php뿐입니다. 나머지 두개는 앞글에서 보여드렸던 에러를 만들어 내기 위한 파일들입니다.

testerror.php
include(‘./common.php’);
include(‘./garbage.php’);
$h = ‘test’;
foreach($h as $key=>$val) {
echo $val;
}
?>

garbage.php
$a = ‘hihi’;
$b = join(”, $a);
?>

common.php
//by hwang@yesnic.com
//error report file version 1.0
//사용후 문제점이나, 수정되었으면하는 사항이 있을 때는 메일 주시기 바랍니다.
//이 파일을 include하면, 좀더 구체적인 에러가 메일로 리포팅됩니다.

//이 파일을 무조건 include만 하면 됩니다. 고칠값은 딱 두가지인데,
//첫째는 $__err_report값이고, 둘째는 $__admin_email 값입니다.
//자세한 설명은 각 해당 부분의 주석을 참고 하시기 바랍니다.

//$__err_report
//1. ‘all’로 설정하면, 화면에도 보여주고 메일로도 에러 보고를 합니다.
//2. ‘mail’ 로 설정하면, 메일만 보냅니다.
//3. ‘show’ 로 설정하면, 화면에만 보여줍니다.
//4. ‘hide’ 에러를 무시합니다.
//이 파일을 include하기 전에 파일에 따라 설정을 바꿀 수 있게 하기 위해서 아래와 같이
//했습니다. 미리 설정을 한 후 include를 하면, 미리 설정한 값이 우선권을 가집니다.
if(empty($__err_report)) {
$__err_report = ‘show’;
}

//에러가 발생했을 때, 에러를 보고할 이메일 주소. 역시 미리 설정한 값이 우선권을 가집니다.
if(empty($__admin_email)) {
$__admin_email = “”;
}

//추가정보들.
//필요한 것들이 있으면, arr형태로 아래와 같이 추가하십시오.
$__err_array[“time”] = date(‘Y-m-d H:i:s’, time());
$__err_array[“SERVER_NAME”] = $_SERVER[“SERVER_NAME”];
$__err_array[“PHP_SELF”] = $_SERVER[“PHP_SELF”];
$__err_array[“REMOTE_ADDR”] = $_SERVER[“REMOTE_ADDR”];
$__err_array[“SESSION”] = $_SESSION;
$__err_array[“POST”] = $_POST;
$__err_array[“GET”] = $_GET;

//필요에 따라 넣으셔도 되지만, 이거 넣으면, 페이지 로딩시간이 꽤나 길어집니다.
//$__err_array[“REMOTE_HOST”] = gethostbyaddr($_SERVER[“REMOTE_ADDR”]);

//error handler와 shutdown function을 등록합니다.
set_error_handler(“_errorHandler”);
register_shutdown_function(“_funClose”);

function _funClose() {
global $__err_content;
//에러가 있을 경우에는 에러메시지를 만들어 주고 그렇지 않을 때는 프로그램이 종료됩니다.
if(isset($__err_content)) {
global $__admin_email, $__err_report, $__err_array;
$buf_arr = “

“;
//$__err_array에서 설정한 값들을 테이블로 만듭니다.
foreach($__err_array as $key=>$val) {
$buf_arr .= “

“;
}
$buf_arr .= “

“;
if(is_array($val)) {
ob_start();
echo “

";
var_dump($val);
$val = ob_get_contents();
echo "

“;
ob_end_clean();
$buf_arr .= $key . “

” . $val;
}elseif(empty($val)) {
$buf_arr .= $key . “
null“;

}else{
$buf_arr .= $key . “

” . $val;
}
$buf_arr .= “

“;
$__err_content = “

” . $__err_content. $buf_arr . “

“;

//__err_report의 값에 따라 메일을 보내거나 화면에 뿌려줍니다.
if($__err_report === ‘all’ || $__err_report === ‘mail’) {
if(!empty($__err_content)) {
mail($__admin_email, “ErrorReport”, $__err_content, “from:errorRepoter
Content-Type: text/html;charset=EUC-KRn”);
}
}
if($__err_report === ‘all’ || $__err_report === ‘show’) {
echo $__err_content;
}
}
}

function _errorHandler ($errno, $errstr, $errfile, $errline) {
global $__err_report, $__admin_email, $__err_content, $__err_array;
$__err_array[‘filename’][] = $errfile;
//$__err_report이 ‘hide’가 아닐경우, 에러 메시지를 만듭니다.
if (!($__err_report === ‘hide’)) {
$str = “

“;
switch ($errno) {
case E_NOTICE :
case E_USER_NOTICE :
$str .= “Notice: “;
break;
case E_USER_WARNING :
case E_WARNING :
$str .= “Warning: “;
break;
case E_USER_ERROR :
case E_ERROR :
$str .= “ERROR: “;
break;
default :
$str .= “Unknown Error($errno): “;
break;
}
$str .= “$errstr in $errfile on line $errline
“;
$str .= highlightFile($errfile, $errline, 5);
$str .= “

“;
$str .= “
“;
//생성된 메시지를 global변수에 저장합니다. 여러개의 에러가 있을 때를 대비하는 것입니다.
$__err_content .= $str;
}
}

function highlightFile($file, $err_line, $count)
{
$ret = ”;
$file = trim($file);
if (isset($file) && file_exists($file)){
// highlight_file로 지정된 파일을 $data값에 저장합니다.
ob_start();
highlight_file($file);
$data = ob_get_contents();
ob_end_clean();
// new line으로 각각을 구분하여 배열에 저장합니다.
$data_lines = explode(‘
‘,$data);

// 보여줄 파일의 시작 라인과 끝 라인을 지정합니다.
$from = $err_line – round($count/2);
$to = $from + $count;
if ($from < 0) {
$from = 0;
}
if ($to > count($data_lines)) {
$to = count($data_lines);
}
//지정된 라인만큼을 $ret에 저장합니다.
for ($i = $from; $i < $to; $i++) {
$k = $i + 1;
if($k==$err_line) {
$data_lines[$i] = ““.$data_lines[$i].”“;
}
$ret .= ‘

'.$k.'‘. $data_lines[$i] .”

“;
// 행의 글자수가 너무 많으면, 적당히 짤라냅니다.
if (strlen($data_lines[$i]) > 1000) {
$ret .= ‘
‘;
}
}
}
return $ret;
}

?>

PHP와 메이저도모를 이용한 대량메일 발송

리눅서

안녕하세요 리눅서 입니다.

QnA 게시판을 보다가 많은분이 대량메일 발송에 대한 문제를 가지고 있어 간단하게 제가 사용하는 팁을 올릴까 합니다.

먼저 PHP에서 MAIL함수나 소켓을 이용해서 대량의 메일을 발송할때 클라이언트 브라우저가 지속적으로 연결되어 있어야 하는 문제가 있습니다. 이러한 경우 브라우저의 타임아웃이나 기타의 이유로 메일을 발송하지 못하는 경우가 발생합니다.

먼저 필요한 프로그램은 아래와 같습니다.

1. majordomo
2. builk_mailer

컴파일 설치및 RPM 설치 어떠한 종류를 하셔도 됩니다.

메이저도모는 그룹 메일발송을 하는 기능을 가지고 있으며 관리자만 메일을 보낼수 있도록 하는 기능도 가지고 있습니다. 여러개의 그룹을 만들어 남자회원, 여자회원등로 구분하여 보낼수 있으며 상당한 빠른 처리능력을 가지고 있습니다.

벌크메일은 그룹회원에게 메일발송할때 도메인별로 소트를 하여 같은 도메인에 있는 회원에게는 한번의 접속으로 여러명에게 메일을 발송하는 기능을 가지고 있습니다.

두가지를 사용하면 하루 150,000통의 대량 메일이 가능할것 같습니다. 요즈음 처럼 성능이 좋은 환경이라면 300,000통 이상도 가능할것으로 보여 집니다.

예를들어 info 라는 그룹을 만들고 회원을 모두 파일에 위치하도록 합니다. 그리고 관리자만 메일을 보낼수 있도록 설정을 하시면 됩니다.

PHP 프로그램에서 메일을 보낼때는 info@xxx.com 으로 그룹에게 메일을 한통만 발송하면 메이저도모가 자동으로 메일을 발송해 줍니다. 메일이 정상적으로 발송되었는지 관리자에게 확인메일도 발송해 주고 메일을 발송하지 못한 회원의 리스트나 메일을 별도로 관리하는 기능도 있어 편리하다고 볼수 있습니다.

그리고 간단하게 대량 메일을 발송하고자 하는분은 개인계정을 이용하시면 될것 같습니다.

서버에 개인 계정을 두시고 .forward 파일을 만들어 회원의 전자우편주소를 기록합니다. 그리고 PHP에서 개인 계정으로 한통의 메일을 발송하고는 메일 발송이 끝나면 .forward 내용을 삭제하시기 바랍니다. 타인이 .forward 설정이된 계정으로 메일을 발송하면 똑같이 대량으로 메일이 발송되므로 심각한 트래픽을 유발할 수 있습니다.

또한 큐메일을 사용하는것도 좋은 방법중에 하나니다. 큐메일은 자동으로 도메인 소트 기능이 있어 현재 많은 사용자가 있는것으로 알고있습니다.

위의 내용은 98년도 부터 사용하든 방식이라 현재는 어떻게 사용하는지 모르겠지만 저는 개인적으로 대량 메일발송시 위의 방법을 사용하고 있습니다.

추운 겨울날씨 모두 따뜻하게 보내시와요

특정한 IP주소대역이면 인증시키기

안녕하세요?
처음으로 이곳에다가 팁이란 것을 만들어 올리네요…
간단한 것인데 응용하면 좋을 것 같아서요…
원래는 인증후에 특정한 주소대역이면 다른 화면을 보여주는 그런 것을 만들려고 구현해본 것입니다.

소스는
—————————————————————————-
$UserIP = $REMOTE_ADDR;
echo $UserIP;
echo “
“;

$ip_extract = explode(“.”,$UserIP); //.로 분리해서 배열로 저장
$UserIP_trim = $ip_extract[0].”.”.$ip_extract[1]; //총4개의 값이 저장되겠죠?
echo $UserIP_trim;

$ip_block_1 = 200.100;
$ip_block_2 = 200.110;
$ip_block_3 = 200.120;

if(($UserIP_trim == $ip_block_1) or ($UserIP_trim == $ip_block_2) or ($UserIP_trim == $ip_block_3)) {
// 인증시키는 창으로 이동시킨다.
$url = $PHP_SELF;
$url = urlencode($url);
echo (““);
exit;
}

else {
echo(“





“);
}

?>
———————————————————————————–
이상 허접한 IP주소를 이용한 팁이었습니다.

세라핌 $UserIP = $REMOTE_ADDR;
이부분은 수정해야 될꺼같네요..^^; 12/08 22:49:26

전승기 네..
물론 없어도 됩니다.
바로 $ip_extract = explode(“.”,$REMOTE_ADDR); 로 해도 되겠죠… 12/08 23:28:51

sh. 정규표현식을 쓰는것도 괜찮습니다
if(!ereg(“$(200.100|200.110|200.120)”, $REMOTE_ADDR)) {
exit;
}
이런식으로… 12/09 0:31:47

s $REMOTE_ADDR 은 getenv(“REMOTE_ADDR”) 로 고쳐야될듯 합니다. 12/09 0:59:53

전영규 $ip = ip2long($REMOTE_ADDR);
if(($ip & $mask) == $mask)
{
die(“블럭된 ip 입니다.”);
}

대단한 건 아니지만… 참고하세요..

애니메이션 GIF 이미지 애니메이션 축소하기

리눅서

안녕하세요 리눅서 입니다.

많은분이 포토 이미지 축소를 하면서 GIF파일의 애니메이션을 그대로 축소하기를 원하시는것 같아 올려둡니다.

리눅스용이며 먼저 필요한 파일은 아래와 같습니다.

gifsicle-xxx.rpm

컴파일 보다는 RPM 버전을 권장합니다.

사용법은 포토 이미지 축소시 pnmscale 을 사용하지 마시고 아래와 같이 사용하세요

exec(“gifsicle –resize $width_s”.”x”.”$height_s /tmp/$image_name > /tmp/small_$image_name”);
$smallimage = addslashes(fread(fopen(“/tmp/small_$image_name”, “r”), filesize(“/tmp/small_$image_name”)));
unlink(“/tmp/small_$image_name”);

마당 야경

눈으로 보는 것을 카메라로 그대로 담아낸다는 것은 정말 어렵겠죠?
마당 화분위에 쌓인 눈이 정말 소담스럽네요.
내일 아침에 보면 더 예쁘겠네요.