'인터넷관련'에 해당되는 글 1181건

  1. 2008.02.20 내 사진을 3D 아바타로 만들어보세요.
  2. 2008.02.20 실시간 메모 보내기, 실시간 쪽지 보내기
  3. 2008.02.20 UTF-8 encoding table and Unicode characters
  4. 2008.02.20 셀렉트박스(Select Box) 그 달의 마지막 날짜, 마지막 일 자동 출력
  5. 2008.02.20 PHP 달력 소스
  6. 2008.02.20 플래시8을 이용한 파일업로드(프로그래스 바)
  7. 2008.02.20 자신의 아이피 및 국가별 아이피 출력 국기 포함
  8. 2008.02.20 PHP 업로드진행바(Pregress Bar) 구현
  9. 2008.02.20 동적인 다중셀렉트 샘플
  10. 2008.02.20 nl2br
  11. 2008.02.20 한글도메인 퓨니코드 변환기 - 한글도메인.kr PunyCode Converter
  12. 2008.02.20 아이피 32비트 10진수로 바꾸기
  13. 2008.02.20 KTF전용 - php와 문자메시지 무료로 연동하기
  14. 2008.02.20 PHP 함수는 몇개나 될까?
  15. 2008.02.20 PHP 최적화 기술
  16. 2008.02.20 Shoutcast 음악방송의 방송 히스토리를 재정렬후 보기 좋게 뿌려줍니다.
  17. 2008.02.20 정규표현식 ( Learning to Use Regular Expressions )
  18. 2008.02.20 UTF-8 문자열 자르기
  19. 2008.02.20 프레임 페이지 새로고침[F5] 후에도 현재 페이지 계속 보이기
  20. 2008.02.20 지정 또는 특정 년도의 특정 달,월의 주 계산
  21. 2008.02.20 오픈마켓 갤러리 광고..
  22. 2008.02.20 실시간 채팅 대화방 - ajax
  23. 2008.02.20 check_agent - 방문자의 os와 browser를 체크하는 함수
  24. 2008.02.20 갤러리(최근 or 랜덤) 슬라이드 + 새창(이미지크기로..) + 해당글 이동
  25. 2008.02.20 19금 - 성인인증 소스
  26. 2008.02.20 제로보드4 에 무료 휴대폰 알림기능 추가
  27. 2008.02.20 특정한 달의 생일인 사람 리스트 가져오기
  28. 2008.02.20 히라가나/가타카나를 한글 발음으로 변환/일본어 번역/일본어 한국어 번역/한국어 일본어 번역
  29. 2008.02.20 이미지 리사이즈(resize) 및 새창
  30. 2008.02.20 PHP의 sleep()과 비슷한 함수



최근 들어 웹기술력이 어디까지 가는지 새로운 사이트를 볼 때마다 그 끝을 알 수가 없습니다.
오늘 소개해드릴 서비스는 내 사진을 3D아바타로 만들어내는 GIZMOZ입니다.
얼굴을 인식하여 자동으로 3D 아바타를 설정해주며 목소리나 키워드를 보이스로 변환하여
생성한 아바타에 음성을 입힐 수도 있습니다.

http://www.gizmoz.com/
여기가 해당 사이트 주소이며 제 사이트에도 리뷰글을 올려놨으니 많이들 읽어주세요^^;;
난 설명이 필요없다~ 라는 분들은 매뉴얼 방문은 스킵하셔도 됩니다. ^^;;

사이트 리뷰 설명보기
http://neoearly.com/bbs/zboard.php?id=webforum&no=60
Posted by 알 수 없는 사용자
,

mysql 디비로 하려다 걍 파일디비로 했구요.


테스트 주소 :

                   팝   업 - http://oxtag.com/php/reChat/

                   레이어 - http://oxtag.com/php/reChat/index2.php


메모는 읽음과 동시에 자동 삭제처리 했습니다.

태그 : 접속자 아이피, 실시간 메모, 실시간 쪽지 보내기


Posted by 알 수 없는 사용자
,
Posted by 알 수 없는 사용자
,
Posted by 알 수 없는 사용자
,

PHP 달력 소스

인터넷관련 2008. 2. 20. 10:27
달력 소스

<?php
/* 빈칸을 출력한다.
* @param $count : 출력할 빈칸(<td> tag) 의 갯수
*/
function tdN($count){
for ($i=0; $i<$count; $i++) {
echo '<td>  </td>';
}
}

/* 달력 출력함수
* @param $month : 해당 월
* @param $year        : 해당 년
*/
function calendar($month, $year, $mode=0){

// 기본 설정값으로 현재 달을 설정
if ($month=="" and $year =="") {
$month=date('m');
$year=date('Y');
}

// 여기서 달과 년도를 바꾼다. 꽁수죠..^^
if ($mode == 1) $month= $month-1;
else if ($mode == 2) $month = $month+1;
else if ($mode == 3) $year = $year-1;
else if ($mode == 4) $year = $year+1;

// 한계치 설정
if ($month == 0) {
$month = 12;
$year = $year-1;
} else if ($month == 13) {
$month = 1;
$year = $year+1;
}

// 변수
$date=01;
$day=01;
$off=0;
$td_end = "</td>";
$td_normal = "<td> ";
$td_head = "<td align=center height='40' width='14%' bgcolor='#FFEBCA'>";
$td_show = "<td align=center height='40' width='14%' bgcolor='#FCFBF3' onMouseOut=this.style.backgroundColor='' onMouseOver=this.style.backgroundColor='#F6F0F3' style='word-break:break-all;padding:0px;' align='center'>";

// header
echo "<meta http-equiv=Content-Type content=text/html; charset=EUC-KR>";
echo "<style type=\"text/css\">";
echo "<!--";
echo "td { font-weight:600; font-family: \"굴림\", \"굴림체\", \"바탕\"; font-size: 9pt; line-height: 16px}";
echo "a:link {font-size:10pt; font-family:굴림; text-decoration:none; color:000000;}";
echo "a:visited {font-size:10pt; font-family:굴림; text-decoration:none; color:000000;}";
echo "a:hover {font-size:10pt; font-family:굴림; text-decoration:none; color:0000ff;}";
echo "a:active {font-size:10pt; font-family:굴림; text-decoration:none; color:0000ff;}";
echo "-->";
echo "</style>";

// 전월, 이월 링크
echo "<table border=0 align=center cellpadding=3 >";
echo "<tr><td> </td></tr>";
echo "<tr bgcolor='#ffffff' ><td align=center>";
echo "<a href='$PHP_SELF?year=$year&month=$month&mode=3'>▼</a>";
echo "<a href='$PHP_SELF?year=$year&month=$month&mode=1'>◀</a>";
echo $year.'년 '.$month.'월';
echo "<a href='$PHP_SELF?year=$year&month=$month&mode=2'>▶</a>";
echo "<a href='$PHP_SELF?year=$year&month=$month&mode=4'>▲</a>";
echo "</td></tr></table>";

// table
echo "<table bgcolor='#ffffff' cellspacing=0 cellpadding=1 bordercolorlight='#c0c0c0' bordercolordark='#ffffff' width='600' border=1 align='center'>";
echo "<tr>";

// 제목 줄 출력
echo "$td_head<font class=ver9 color='red'><b>일<b></font>$td_end";
echo "$td_head<b>월</b></font>$td_end";
echo "$td_head<font class=ver9 color='black'><b>화</b></font>$td_end";
echo "$td_head<font class=ver9 color='black'><b>수</b></font>$td_end";
echo "$td_head<font class=ver9 color='black'><b>목</b></font>$td_end";
echo "$td_head<font class=ver9 color='black'><b>금</b></font>$td_end";
echo "$td_head<font class=ver9 color='#a6a6a9'><b>토</b></font>$td_end";
echo "<tr>";

// 이번달의 마지막 날을 $date에 저장한다.
while (checkdate($month,$date,$year)):
$date++;
endwhile;

// $day 를 $date(이번달의 마지막날)까지 증가하면서 출력한다.
while ($day<$date):
// 첫번째 날이 무슨요일인지 확인하여 앞의 빈칸과 같이 출력한다.
if ($day == '01') {
$temp = date("w", mktime(0,0,0,$month,$day,$year));
echo tdN($temp);
echo $td_show.$day.$td_end;
$off = $temp+1;
} else // 그외 경우는 날짜만 출력한다.
echo $td_show.$day.$td_end;

// $day와 $off 증가
$day++;
$off++;

// 요일($off)가 토요일(7)까지 가면 줄을 바꾼다.
if ($off>7) {
echo "</tr><tr>";
$off='01';
}
endwhile;

// 마지막 남은 빈칸들 출력
while($off<8 && $off!='01'):
$off++;
echo "$td_normal$td_end";
endwhile;

// tailer
echo "</tr></table>";
}
?>
<? echo calendar($month,$year,$mode); ?>
Posted by 알 수 없는 사용자
,
 
http://www.ziwoo.net/fu/
http://www.ziwoo.net/zb/view.php?uid=6&boardid=zb_ziwoo_actionscript

플래시 원본은 플래시8 에서 편집되었습니다.
그냥 써보는 데는 버전 상관 없지만, 원본을 수정하시려면 버전 8 이후를 설치하시고요..
기본적으로 라이센스는 없습니다. (어차피 플래시 홈피에 다 공개된 소스인데요..)

[설치/사용법]
압축파일을 풀면 fu폴더 안에 다음과 같이 파일이 들어있습니다.

fu
- files 디렉토리 : 임시업로드 파일이 저장되는곳. (필히 chmod 777로 조정)
- index.php 테스트를 할 수있는 메인페이지.
- multi_upload.fla 다중업로드가 가능한 플래시 원본
- multi_upload.swf 다중업로드가 가능한 쇽웨이브 파일
- single_upload.fla 싱글업로드만 가능한 플래시 원본
- single_upload.swf 싱글업로드만 가능한 쇽웨이브 파일
- swf_upload.js 플래시가 호출하는 자바스크립트 함수 모음
- upload.php 플래시 업로드가 필요로하는 php 업로드 파일

서버의 적당한곳에 압축풀고..
files 폴더에 쓰기 가능하도록 접근권한 변경하시고..
http://위의 적당한URL/fu 로 접속해보시면 됩니다.

코딩을 하다보면 멀티업로드만 필요한 경우도 있지만,
싱글업로드가 여러개 필요한 경우도 많지요..
상황에 알맞게 index.php를 참고하여 수정해서 쓰시면 됩니다.

Posted by 알 수 없는 사용자
,
Posted by 알 수 없는 사용자
,

사용자 삽입 이미지


▨▨▨▨ PHP 업로드진행바(Pregress Bar) 구현. ▨▨▨▨

- 2006.04.29
- 버그신고 : http://www.ziwoo.net
- 30일간 테스트: 테스트 게시판 기간 종료.
- 간단한 테스트: http://www.ziwoo.net/zuprogress/index.html


▨▨ 왜 필요할까?

PHP 또는 ASP 등 enctype="multipart/form-data" 로 FORM을 전송하는 경우,
업로드 파일이 서버의 특정 공간에 임시파일로 저장되어지기 전까지는 PHP가 파일에 대한 정보를 알 수 없다고 합니다. 그래서 파일이 몇%나 업로드 되고 있는지 알지 못한 채, 사용자는 지루한 화면만 보게 되는데요.. 이런 단점을 극복하고자 몇가지 방법들이 있습니다만, ActivX를이용하는 경우, 사용자에게 ActivX를 허용하겠다라는 Agreement를 받아야만 하므로 불편함이 있습니다. 때문에 ActivX의 기능을 빌리지 않고 자체적인 기능으로만 서버의 임시저장소에 올라오고 있는 임시파일을 찾아서 그 크기를 지속적으로 리포트하는 방법이 꾸준히 시도되는것 같습니다.

▨▨ 업로드 프로그레스을 위한 요건.

업로드진행바를 구현려면
첫째 업로드할 파일의 크기를 알아야 합니다.
둘째 임시저장소에 있는 다수의 임시파일중에서 업로드중인 사용자의 임시파일을 알아야 합니다.
셋째 알아낸 파일크기를 지속적으로 사용자의 화면에 보내줘야 합니다.

첫째, 업로드 하기전 파일 크기를 알아내는데에 브라우저별로 차이가 있습니다.
MS IE 에서는 파일크기를 알아올 수 있지만,
파이어폭스에서는 보안상의 이유로 브라우저가 사용자의 로컬정보를 알 수 없게 하였습니다.
기타 브라우저의 호환에 관해서는 잘 모르겠습니다만,
파일크기를 알아올 수 있는 브라우저와 그렇지 못한 브라우저로 분리하여 후자의 경우에는
전송된 크기와 남은 파일 갯수만 보여주고 진행%는 표시하지 않는것으로 하였습니다.

둘째, 임시파일과 시용자별 매치시키는 문제는 예전에 WndProc님께서 PHPSCHOOL Tip&Tech 게시판에,
임시파일의 이름을 지정한 이름으로 생성하게 하도록 PHP소스를 컴파일하는 방법을 소개한 적이 있습니다.
임시파일과 시용자별 매치시키는 문제는 PHP소스를 컴파일하는 방법이 가장 정확하겠습니다만,
버전이 바뀌면 그때마다 다시 PERL소스를 해석하고 수정해야 하는 번거로움이 있을 뿐 아니라,
웹호스팅을 이용하는 프로그래머들에겐 적당하지 않은 방법입니다.
이 문제에 관해서 외국사이트에서 임시폴더의 최근 파일을 검사하는 방법을 보고 힌트를 얻어 진행하던 중,
후에 행복한고니님께서 업그레이드 된 http://blog.joshuaeichorn.com/archives/2005/05/01/ajax-file-upload-progress/ 를 알려주었습니다. 위 사이트에서 Class로 되어있는 다운로드가 있습니다만, 이전 버전의 소스를 보고 어렵고 복잡하게 느꼈던 터라 최근버전의 소스를 참고하지는 않았습니다.
사실 내공이 부족하여 클래스는 소스분석도 잘 안됩니다. (-_-;)
임시폴더의 최근 파일을 검사하는 방법은 비교적 잘 맞지만, 업로드가 빈번한 서버의 경우 다른 사용자의 임시파일 정보를 잘못 캐치할 수도 있습니다. 설사 그렇다고 한들, 파일이 업로드 되는것과는 무관하므로 무시.(-,.-)

셋째, 임시파일의 크기를 거꾸로 사용자의 브라우저에 지속적으로 보내주는 것은, 약간의 꽁수가 필요합니다.
IFRAME으로 계속 리로드 하는방법이 있으나 이 경우 틱~틱~ 거리는 화면갱신 소리가 거슬려서 선호되지 않는 방법입니다.

<script id="Dynamic" language="JavaScript"></script>
<script>
function Repeat(){
    getElementById('Dynamic').src = "tmp_reader.php";
}
setTimeout("Repeat()",1000);
</script>

따라서 Ajax에서 사용하는 위 방법으로 해보았으나, MS IE에서는 잘 되었지만,
파이어폭스에서 되지가 않았습니다.
파이어폭스는 한번 읽은 내용을 캐쉬에 담아두고 갱신하지 않는것 같았으며,
"tmp_reader.php?랜덤쓰레기변수" 로 처리하여 다른 파일인것 처럼 해도 통하지 않았습니다.

<img id="Dynamic" width="1" height="1" src="nofile">
<script>
function Repeat(){
    getElementById('Dynamic').src = "tmp_reader.php";
}
setTimeout("Repeat()",1000);
</script>

위 방법은 언젠가 PHPSCHOOL에 메일 수신확인을 위한 꽁수로 소개된 방법입니다.
자바스크립트를 갱신하는 대신 이미지 파일을 갱신하는것으로 바꾸고,
tmp_reader.php 파일의 내용에 파일을 캐쉬하지 말라는 해더인

header("Expires:Mon,26 Jul 1997 05:00:00 GMT");
header("Last-Modified:".gmdate("D,d M Y H:i:s")."GMT");
header("Cache-Control:no-cache,must-reval!idate");
header("Content-Type: image/gif");

위 코드를 추가함으로서 파이어폭스에서도 지속적인 갱신이 가능했습니다.

▨▨ 임시파일을 알아내고 그 파일을 브라우저에 알려주는 tmp_reader.php 파일

<?
session_start();
if(!$_SESSION["upfile"]["tmp_name"] || !file_exists($_SESSION["upfile"]["tmp_name"]) || time()-filemtime($_SESSION["upfile"]["tmp_name"])>10 || $_SESSION["upfile"]["size"] == @filesize($_SESSION["upfile"]["tmp_name"])){
    $tmp_files = @glob("/tmp"."/[p][h][p]*",GLOB_NOSORT);
    $_SESSION["upfile"]["tmp_name"] = $tmp_files[0];
    $_SESSION["upfile"]["size"] = @filesize($tmp_files[0]);
}else{
    $_SESSION["upfile"]["size"] = @filesize($_SESSION["upfile"]["tmp_name"]);
}
setCookie("ZUfileSize",$_SESSION['upfile']["size"],time()+10,"/");
header("Expires:Mon,26 Jul 1997 05:00:00 GMT");
header("Last-Modified:".gmdate("D,d M Y H:i:s")."GMT");
header("Cache-Control:no-cache,must-reval!idate");
header("Content-Type: image/gif");
?>

소스는 위가 전부입니다. 최근의 임시이름과 크기를 세션으로 저장하여 계속 모니터하는 방법입니다.
소스를 보면 대충 알겠지만,
첫째 세션정보가 없는경우 최초의 업로드입니다.
둘때 세션정보에 있는 파일이 실제로 존재하지 않은 경우는 이전에 업로드 경험이 있는 사용자의 새 업로드입니다.
셋째 실제 임시파일이 10초 동안 변경되지 않았다면, 그 파일의 업로드가 완료된 것으로 간주합니다.
넷째 바로 이전에 체크했던 파일크기(세션)와 실제 파일크기가 같다면 그 파일의 업로드가 완료된 것으로 간주합니다.
위 네가지 경우에는 "php~" 이름을 가진 다른 최근파일을 찾아서 임시이름과 크기를 세션으로 저장합니다.
그렇지 않은 경우에는 업로드중이므로 파일크기만 검사해서 세션과 쿠키정보로 구워 놓습니다.
세션[파일크기는] 서버 정보이므로 클라이언트는 갱신할 수 없기 때문에 쿠키를 이용합니다.

▨▨ 일정한 간격으로 tmp_reader.php 실행, 쿠키정보 캐치, 업로드진행화면 갱신, 을 담당하는 progress.js 파일

function progress(Fname){ <= onSubmit="return progress('F')" 으로 호출되는 함수입니다.
    document.getElementById('ZU_div').style.display = "inline";
    document.getElementById('ZU_div').style.left = document.body.clientWidth/2 - 220;
    document.getElementById('ZU_div').style.top = 150;
   
    for (var i=0; i<document.forms[Fname].elements.length; i++) {
        if(document.forms[Fname].elements[i]["type"]=="file" && document.forms[Fname].elements[i]["value"]){
            array_FileName[i] = ZU_getFileName(document.forms[Fname].elements[i]["value"]);
            array_FileSize[i] = ZU_getFileSize(document.forms[Fname].elements[i]["value"]);
        }
    }
    var Extra_array_FileName = array_FileName;
    var Extra_array_FileSize = array_FileSize;
    array_FileName = new Array();
    array_FileSize = new Array();
    var c = 0;
    for (var i=0; i<Extra_array_FileName.length; i++) {
        if(Extra_array_FileName[i]){
            array_FileName[c] = Extra_array_FileName[i];
            array_FileSize[c] = Extra_array_FileSize[i];
            c++;
        }
    }
    window.status = "전송중";
    var StartTime = new Date();
    MicroStartTime = StartTime.getTime()/1000;
    var TakeStartTime = new Date();
    MicroTakeStartTime = TakeStartTime.getTime()/1000;
    ZU_repeat();
}

progress.js 파일은 위에서도 약간 언급했지만 핵심부분만 설명합니다. 자세한 내용은 소스파일을 열어서 살펴보세요.
위 함수는 <form name="F" ~~~~ onSubmit=progress('F')> 에서 Submit이 되면 일차적으로 호출되어지는 함수입니다.
<div id="ZU_div">업로드화면<div>을 보이게 하고 위치를 잡아줍니다.
submit 된 폼에서 타입이 file인 Element들의 "파일명"과 "파일크기"를 찾아내 배열에 담습니다.

function ZU_getFileSize(path){
    var obj = new Image();
    obj.dynsrc = path;
    return obj.fileSize;
}

파일크기를 찾는 ZU_getFileSize()함수의 소스는 당 파일의 상단에 위와 같이 정의되어 있습니다.
new Image(); 로 찾지만 이미지 파일이 아닌것도 잘 찾아집니다.
하단부에서 파일크기 배열의 내용이 없으면 비호환 브라우저로 보고 차전책인 화면을 내보냅니다.
사용자가 파일선택을 순차적으로 하지 않고 듬성듬성 한 경우를 고려해 배열을 앞쪽으로 정리합니다.
최초 업로드 시작시간, 선택파일 업로드 시작시간을 변수에 담아두고 본격적인 반복작업을 할 ZU_repeat()함수에 시동을 걸어줍니다.

function ZU_repeat(){
    document.getElementById('zudynamic').src="tmp_reader.php"; // 이미지 SRC 갱신(파일크기 검사 요청)
    ZUrepeat = setTimeout("ZU_repeat()", RepeatInterval*1000); // 반복지정
    ZU_makeProgress(getCookie('ZUfileSize')); //업로드화면을 갱신하는 함수에게 쿠키값 전달
   
    // 새로고침 비정상적인 submit의 경우에도 화면 활성
    if(last_TmpFileSize<getCookie('ZUfileSize')){
        document.getElementById('ZU_div').style.display = "inline";
    }
}

◎ 업로드 진행상황을 갱신하는 함수

function ZU_makeProgress(CookieSize){
    if(array_sum(array_FileSize)){ //파일크기를 알 수 있는 브라우저

    ~~ 전송된 파일크기, 남은 갯수, 진행율(%), 남은시간 등 표시 ~~

    }else{ //파일크기를 알 수 없는 브라우저

    ~~ 전송된 파일크기, 남은 갯수 만 표시 ~~

    }
}

ZU_makeProgress() 함수의 내용은 특징이 없는 부분이므로 설명하지 않습니다.

window.onload = function(){
    // 업로드 이미지들이 화면에 즉시 뜨도록 프리로드
    var ZUimg1 = new Image();
    ZUimg1.src = "images/progress_01.gif";
    ~~~~
    var ZUimg12 = new Image();
    ZUimg1.src = "images/progress_12.gif";

   
    //<img id="Dynamic" width="1" height="1" src="nofile"> <= 이 코드를 HTML에 넣지 않아도 되도록하는 부분
   
    spyImg = document.createElement("img");
    spyImg.setAttribute("src","tmp_read.php");
    spyImg.setAttribute("id","zudynamic");
    spyImg.setAttribute("width","1");
    spyImg.setAttribute("height","1");
    document.body.appendChild(spyImg);

   
    //<div id="ZU_div">업로드화면디자인 부분</div> <= 이 코드를 HTML에 넣지 않아도 되도록하는 부분

    progressDiv = document.createElement("div");
    progressDiv.setAttribute("id","ZU_div");
    document.body.appendChild(progressDiv);

    document.getElementById('ZU_div').style.position = "absolute";
    document.getElementById('ZU_div').style.width = "437px";
    document.getElementById('ZU_div').style.height = "200px";
    document.getElementById('ZU_div').style.zIndex = "10";
    document.getElementById('ZU_div').style.display = "none";

    document.getElementById('ZU_div').innerHTML="\
    <table width='437' height='57' cellspacing='0' cellpadding='0' border='0' background='images/progress_01.gif'>\
    ~~~~
    </table>";
}

▨▨ html에서 적용하기
상단에 <js링크>딱 한줄만 넣도록 하기위해 부족한 실력으로 많이 고생했습니다.
아마도 DOM 형식인것 같은데..
부족한 실력으로 구현하느라고 해당 코드가 필요이상으로 길고 지저분할 수 있으며,
위에 소개된 소스와 최종소스가 약간 다른부분도 있습니다.  

<html>
<head>
<meta name="generator" content="editplus">
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<script language="JavaScript" src="/zuprogress/progress.js"></script> <= 라인 추가
</head>

<body>
<form name="F" enctype="multipart/form-data" method="post" action=" ">
<input type="file" name="up1" style="width:400"><br>
<input type="file" name="up2" style="width:400"><br>
<input type="file" name="up3" style="width:400"><br>
<input type="file" name="up4" style="width:400"><br>
<input type="file" name="up5" style="width:400"><br>
<input type="submit" value="업로드"><br>
</form>
</body>
</html>

▨▨ 개선할 부분

가장 최근의 임시파일크기 정보가 사용자 임시파일 크기 정보인지 100% 신뢰할 수 없습니다.
업로드 전 로컬의 파일크기를 알아내는 getFileSize()함수가 잘못된 파일의 크기를 보고할 수 있습니다.
셀러론인 집의 피씨에선 잘보이던 업로드 배경화면이 사무실의 팬4 피씨에서는 잘 안보인 경우가 있었습니다.

다 해놓고 보니, 실무용이라기 보다는 어디로 튈지 모르는 연구용인것 처럼 느껴집니다.
실력있는 PHPER들이 부족한 부분을 보충해서 실무에도 사용할 수 있도록 공유했으면 좋겠습니다.

Posted by 알 수 없는 사용자
,

단순한 에제입니다.

########## main.php ##########
<?
if($_GET["A"]){
    $Query ="select fieldB from 테이블 where fieldA='".$_GET["A"]."'";
    $cnn = mysql_query($Query) or exit(mysql_error());
    while($rst = mysql_fetch_assoc($cnn)) {
       $RecordsB = array_merge($RecordsB, array($rst));
    }
}

if($_GET["B"]){
    $Query ="select fieldC from 테이블 where fieldA='".$_GET["A"]."' and fieldB='".$_GET["B"]."'";
    $cnn = mysql_query($Query) or exit(mysql_error());
    while($rst = mysql_fetch_assoc($cnn)) {
       $RecordsC = array_merge($RecordsC, array($rst));
    }
}
?>

<script language="JavaScript" id="DynamicA"></script>
<script language="JavaScript" id="DynamicB"></script>
<script language="JavaScript">
<!--
function makeB(){
    var ValueA = document.getElementsByName('A')[0].value;
    DynamicA.src = "makeB.php?selectA="+ValueA;
}

function makeC(){
    var ValueA = document.getElementsByName('A')[0].value;
    var ValueB = document.getElementsByName('B')[0].value;
    DynamicB.src = "makeC.php?selectA="+ValueA+"&selectB="+ValueB;
}

function checkForm(){
    var ValueA = document.getElementsByName('A')[0].value;
    var ValueB = document.getElementsByName('B')[0].value;
    document.forms["F"].action = "main.php?A="+ValueA+"&B="+ValueB;
    document.forms["F"].submit();
}
//-->
</script>

<form name="F" method="post">
<select name="A" onChange="makeB()">
<option value="">--선택--</option>
<option value="현대" <?if($RecordsB[$i]["fieldA"]==$_GET["A"]) echo"selected";?>>현대</option>
<option value="대우" <?if($RecordsB[$i]["fieldA"]==$_GET["A"]) echo"selected";?>>대우</option>
<option value="삼성" <?if($RecordsB[$i]["fieldA"]==$_GET["A"]) echo"selected";?>>삼성</option>
</select>

<select name="B" onChange="makeC()">
<option value="">--선택--</option>
<?for($i=0;$i<count($RecordsB);$i++){?>
    <option value="<?=$RecordsB[$i]["fieldB"]?>" <?if($RecordsB[$i]["fieldB"]==$_GET["B"]) echo"selected";?>><?=$RecordsB[$i]["fieldB"]?></option>
<?}?>
</select>

<select name="C">
<option value="">--선택--</option>
<?for($i=0;$i<count($RecordsC);$i++){?>
    <option value="<?=$RecordsC[$i]["fieldC"]?>" <?if($RecordsC[$i]["fieldC"]==$_GET["C"]) echo"selected";?>><?=$RecordsC[$i]["fieldC"]?></option>
<?}?>
</select>

<input type="button" value="확인" onClick="checkForm()">
</form>
########## //main.php ##########

########## makeB.php ##########
<?
$Query ="select fieldB from 테이블 where fieldA='".$_GET["selectA"]."'";
$cnn = mysql_query($Query) or exit(mysql_error());
while($rst = mysql_fetch_assoc($cnn)) {
    $RecordsB = array_merge($RecordsB, array($rst));
}
?>

var ObjB = document.getElementsByName('B')[0].options;
for(var i=ObjB.length;i>=0;i--) ObjB[i] = null;
ObjB[0] = new Option('--선택--','');
<?for($i=0;$i<count($RecordsB);$i++){?>
    ObjB[ObjB.length] = new Option('<?=$RecordsB[$i]["fieldB"]?>','<?=$RecordsB[$i]["fieldB"]?>');
<?}?>
########## //makeB.php ##########

########## makeC.php ##########
<?
$Query ="select fieldC from 테이블 where fieldA='".$_GET["selectA"]."' and fieldB='".$_GET["selectB"]."'";
$cnn = mysql_query($Query) or exit(mysql_error());
while($rst = mysql_fetch_assoc($cnn)) {
    $RecordsC = array_merge($RecordsC, array($rst));
}
?>

var ObjC = document.getElementsByName('C')[0].options;
for(var i=ObjC.length;i>=0;i--) ObjC[i] = null;
ObjC[0] = new Option('--선택--','');
<?for($i=0;$i<count($RecordsC);$i++){?>
    ObjC[ObjC.length] = new Option('<?=$RecordsC[$i]["fieldC"]?>','<?=$RecordsC[$i]["fieldC"]?>');
<?}?>
########## //makeC.php ##########

출처 : 지우넷

Posted by 알 수 없는 사용자
,

nl2br

인터넷관련 2008. 2. 20. 10:22

<?php
echo nl2br("foo isn't\n bar");
?>

foo isn't<br />
bar



Posted by 알 수 없는 사용자
,

http://oxtag.com/php/p/unicode/punicode/


 한글.KR 도메인을 사용하실 경우에 DNS가 한글을 처리하기 위하여 영어, 숫자, 하이픈(-)으로 이루어진 퓨니코드(Punycode)의 형태로 변환된 후, DNS 서버에 전달,저장되는 형태를 취하고 있습니다. 따라서 한글.KR 도메인을 사용하기 위해서는 플러그인을 설치하셔야 하고, 필요하실 경우, 퓨니코드 변환은 온라인 퓨니코드 변환기를 이용하십시요. 한글.KR 도메인을 운영하기 위해서는 웹서버등의 환경파일 내에서 "xn--"로 시작하는 퓨니코드 형태로 설정되어야 합니다.

Posted by 알 수 없는 사용자
,

포워딩한 도메인 같은 경우 안됨니다.

도메인 아이피 알아내기 : http://oxtag.com/php/p/ipSearch.php
아이피 변환하기 : http://oxtag.com/php/p/ipNumber.php

ex. 255.255.255.255 

*  ipnum = 16777216*w + 65536*x + 256*y + z 4294967295 = 16777216*255 + 65536*255 + 256*255 + 255

http://3732559098
http://3732559048


http://1208937320
http://1208929128
http://1208930152

Posted by 알 수 없는 사용자
,

혹시 홈페이지나 블로그 운영중이시라면 새로운 글과 댓글 소식을 휴대폰으로 바로 바로 연락받고 싶은 마음 없으셨나요.
아니면 다른 사람이 쓰는 도메인을 낙장될때까지 마음조리며 기다리신 적 없었나요^^;

이런 것들을 굳이 컴퓨터를 켜서 일일이 확인하지 않아도 쉽고 추가 비용 없이 휴대폰 문자메시지로 연락 받을 수 있는 방법이 있습니다.
핵심은 KTF 매직엔을 사용 하는 것인데요.
KTF 매직엔에 가입하면, 자신의 폰 번호를 입력하는 곳이 있습니다.
거기에서 폰 인증을 받으시고 KTF 매직엔 메일로 들어가시어 SMS 수신 알림을 설정해두시면 되지요.

비록 KTF 회원만 가능하지만, KTF 사용자가 상당수 될 꺼라 생각해서 올려봅니다.
다음, 네이버, 야후 같은 곳도 휴대폰 문자메시지 알림 기능을 제공하지만 한달에 900원이라는 적지 않은 (신경 쓰이는) 비용이 들지요^^
야후 같은 곳은 메일 수신속도도 느려서 바로바로 문자메시지로 소식을 접하기도 어렵구요.

홈페이지나 블로그의 적당한 부분에 mail 함수를 이용하여, KTF 매직엔 아이디@magicn.com 으로 새 소식을 담은 메일을 보내도록 프로그래밍하시면 됩니다^^.
그럼 메일이 전송되는 순간 휴대폰으로도 새 소식을 볼 수가 있게 되는거지요.

도움 되셨을려나 모르겠네요. 이미 알고 계신분이 계실 수도 있겠네요.
아무튼 필요하신 분이 계시면 좋은데 사용하셨으면 좋겠습니다~

- SKT는 월 900원 유료네요...^^;


메일 보내는 함수 (제로보드) - 다른 메일 함수를 사용하셔도 됨니다.
적당히 가공 해서 디비에 등록되는 최종 페이지에 인쿠르드 하시고..

        // 메일 보내는 함수
        function zb_sendmail($type, $to, $to_name, $from, $from_name, $subject, $comment, $cc="", $bcc="") {
                $recipient = "$to_name <$to>";

                if($type==1) $comment = nl2br($comment);

                $headers = "From: $from_name <$from>\n";
                $headers .= "X-Sender: <$from>\n";
                $headers .= "X-Mailer: PHP ".phpversion()."\n";
                $headers .= "X-Priority: 1\n";
                $headers .= "Return-Path: <$from>\n";

                if(!$type) $headers .= "Content-Type: text/plain; ";
                else $headers .= "Content-Type: text/html; ";
                $headers .= "charset=euc-kr\n";

                if($cc) $headers .= "cc: $cc\n";
                if($bcc) $headers .= "bcc: $bcc";

                $comment = stripslashes($comment);
                $comment = str_replace("\n\r","\n"
, $comment);

                return mail($recipient , $subject , $comment , $headers);

        }



zb_sendmail($use_html, $s_data[email], $s_data[name], $email, $name, $subject, $memo);

Posted by 알 수 없는 사용자
,
abs acos acosh addcslashes addslashes aggregate aggregate_info aggregate_methods aggregate_methods_by_list aggregate_methods_by_regexp aggregate_properties aggregate_properties_by_list aggregate_properties_by_regexp aggregation_info apache_child_terminate apache_getenv apache_get_modules apache_get_version apache_lookup_uri apache_note apache_request_headers apache_reset_timeout apache_response_headers apache_setenv apc_cache_info apc_clear_cache apc_define_constants apc_delete apc_fetch apc_load_constants apc_sma_info apc_store apd_breakpoint apd_callstack apd_clunk apd_continue apd_croak apd_dump_function_table apd_dump_persistent_resources apd_dump_regular_resources apd_echo apd_get_active_symbols apd_set_pprof_trace apd_set_session apd_set_session_trace apd_set_socket_session_trace array arrayiterator_current arrayiterator_key arrayiterator_next arrayiterator_rewind arrayiterator_seek arrayiterator_valid arrayobject_append arrayobject_construct arrayobject_count arrayobject_getiterator arrayobject_offsetexists arrayobject_offsetget arrayobject_offsetset arrayobject_offsetunset array_change_key_case array_chunk array_combine array_count_values array_diff array_diff_assoc array_diff_key array_diff_uassoc array_diff_ukey array_fill array_filter array_flip array_intersect array_intersect_assoc array_intersect_key array_intersect_uassoc array_intersect_ukey array_keys array_key_exists array_map array_merge array_merge_recursive array_multisort array_pad array_pop array_product array_push array_rand array_reduce array_reverse array_search array_shift array_slice array_splice array_sum array_udiff array_udiff_assoc array_udiff_uassoc array_uintersect array_uintersect_assoc array_uintersect_uassoc array_unique array_unshift array_values array_walk array_walk_recursive arsort ascii2ebcdic asin asinh asort aspell_check aspell_check_raw aspell_new aspell_suggest assert assert_options atan atan2 atanh base64_decode base64_encode basename base_convert bcadd bccomp bcdiv bcmod bcmul bcompiler_load bcompiler_load_exe bcompiler_parse_class bcompiler_read bcompiler_write_class bcompiler_write_constant bcompiler_write_exe_footer bcompiler_write_file bcompiler_write_footer bcompiler_write_function bcompiler_write_functions_from_file bcompiler_write_header bcpow bcpowmod bcscale bcsqrt bcsub bin2hex bindec bindtextdomain bind_textdomain_codeset bzclose bzcompress bzdecompress bzerrno bzerror bzerrstr bzflush bzopen bzread bzwrite cachingiterator_hasnext cachingiterator_next cachingiterator_rewind cachingiterator_tostring cachingiterator_valid cachingrecursiveiterator_getchildren cachingrecursiveiterator_haschildren call_user_func call_user_func_array call_user_method call_user_method_array cal_days_in_month cal_from_jd cal_info cal_to_jd ccvs_add ccvs_auth ccvs_command ccvs_count ccvs_delete ccvs_done ccvs_init ccvs_lookup ccvs_new ccvs_report ccvs_return ccvs_reverse ccvs_sale ccvs_status ccvs_textvalue ccvs_void ceil chdir checkdate checkdnsrr chgrp chmod chop chown chr chroot chunk_split classkit_import! classkit_method_add classkit_method_copy classkit_method_redefine classkit_method_remove classkit_method_rename class_exists class_implements class_parents clearstatcache closedir closelog com compact com_addref com_create_guid com_event_sink com_get com_get_active_object com_invoke com_isenum com_load com_load_typelib com_message_pump com_print_typeinfo com_propget com_propput com_propset com_release com_set connection_aborted connection_status connection_timeout constant convert_cyr_string convert_uudecode convert_uuencode copy cos cosh count count_chars cpdf_add_annotation cpdf_add_outline cpdf_arc cpdf_begin_text cpdf_circle cpdf_clip cpdf_close cpdf_closepath cpdf_closepath_fill_stroke cpdf_closepath_stroke cpdf_continue_text cpdf_curveto cpdf_end_text cpdf_fill cpdf_fill_stroke cpdf_finalize cpdf_finalize_page cpdf_global_set_document_limits cpdf_import!_jpeg cpdf_lineto cpdf_moveto! cpdf_newpath cpdf_open cpdf_output_buffer cpdf_page_init cpdf_place_inline_image cpdf_rect cpdf_restore cpdf_rlineto cpdf_rmoveto! cpdf_rotate cpdf_rotate_text cpdf_save cpdf_save_to_file cpdf_scale cpdf_setdash cpdf_setflat cpdf_setgray cpdf_setgray_fill cpdf_setgray_stroke cpdf_setlinecap cpdf_setlinejoin cpdf_setlinewidth cpdf_setmiterlimit cpdf_setrgbcolor cpdf_setrgbcolor_fill cpdf_setrgbcolor_stroke cpdf_set_action_url cpdf_set_char_spacing cpdf_set_creator cpdf_set_current_page cpdf_set_font cpdf_set_font_directories cpdf_set_font_map_file cpdf_set_horiz_scaling cpdf_set_keywords cpdf_set_leading cpdf_set_page_animation cpdf_set_subject cpdf_set_text_matrix cpdf_set_text_pos cpdf_set_text_rendering cpdf_set_text_rise cpdf_set_title cpdf_set_viewer_preferences cpdf_set_word_spacing cpdf_show cpdf_show_xy cpdf_stringwidth cpdf_stroke cpdf_text cpdf_translate crack_check crack_closedict crack_getlastmessage crack_opendict crc32 create_function crypt ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_graph ctype_lower ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit curl_close curl_copy_handle curl_errno curl_error curl_exec curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_setopt curl_setopt_array curl_version current cybercash_base64_decode cybercash_base64_encode cybercash_decr cybercash_encr cybermut_creerformulairecm cybermut_creerreponsecm cybermut_testmac cyrus_authenticate cyrus_bind cyrus_close cyrus_connect cyrus_query cyrus_unbind date date_default_timezone_get date_default_timezone_set date_sunrise date_sunset db2_autocommit db2_bind_param db2_client_info db2_close db2_columns db2_column_privileges db2_commit db2_connect db2_conn_error db2_conn_errormsg db2_cursor_type db2_exec db2_execute db2_fetch_array db2_fetch_assoc db2_fetch_both db2_fetch_object db2_fetch_row db2_field_display_size db2_field_name db2_field_num db2_field_precision db2_field_scale db2_field_type db2_field_width db2_foreign_keys db2_free_result db2_free_stmt db2_next_result db2_num_fields db2_num_rows db2_pconnect db2_prepare db2_primary_keys db2_procedures db2_procedure_columns db2_result db2_rollback db2_server_info db2_special_columns db2_statistics db2_stmt_error db2_stmt_errormsg db2_tables db2_table_privileges dbase_add_record dbase_close dbase_create dbase_delete_record dbase_get_header_info dbase_get_record dbase_get_record_with_names dbase_numfields dbase_numrecords dbase_open dbase_pack dbase_replace_record dba_close dba_delete dba_exists dba_fetch dba_firstkey dba_handlers dba_insert dba_key_split dba_list dba_nextkey dba_open dba_optimize dba_popen dba_replace dba_sync dblist dbmclose dbmdelete dbmexists dbmfetch dbmfirstkey dbminsert dbmnextkey dbmopen dbmreplace dbplus_add dbplus_aql dbplus_chdir dbplus_close dbplus_curr dbplus_errcode dbplus_errno dbplus_find dbplus_first dbplus_flush dbplus_freealllocks dbplus_freelock dbplus_freerlocks dbplus_getlock dbplus_getunique dbplus_info dbplus_last dbplus_lockrel dbplus_next dbplus_open dbplus_prev dbplus_rchperm dbplus_rcreate dbplus_rcrtexact dbplus_rcrtlike dbplus_resolve dbplus_restorepos dbplus_rkeys dbplus_ropen dbplus_rquery dbplus_rrename dbplus_rsecindex dbplus_runlink dbplus_rzap dbplus_savepos dbplus_setindex dbplus_setindexbynumber dbplus_sql dbplus_tcl dbplus_tremove dbplus_undo dbplus_undoprepare dbplus_unlockrel dbplus_unselect dbplus_update dbplus_xlockrel dbplus_xunlockrel dbx_close dbx_compare dbx_connect dbx_error dbx_escape_string dbx_fetch_row dbx_query dbx_sort dcgettext dcngettext deaggregate debugger_off debugger_on debug_backtrace debug_print_backtrace debug_zval_dump decbin dechex decoct define defined define_syslog_variables deg2rad delete dgettext die dio_close dio_fcntl dio_open dio_read dio_seek dio_stat dio_tcsetattr dio_truncate dio_write dir directoryiterator_construct directoryiterator_current directoryiterator_getatime directoryiterator_getchildren directoryiterator_getctime directoryiterator_getfilename directoryiterator_getgroup directoryiterator_getinode directoryiterator_getmtime directoryiterator_getowner directoryiterator_getpath directoryiterator_getpathname directoryiterator_getperms directoryiterator_getsize directoryiterator_gettype directoryiterator_isdir directoryiterator_isdot directoryiterator_isexecutable directoryiterator_isfile directoryiterator_islink directoryiterator_isreadable directoryiterator_iswritable directoryiterator_key directoryiterator_next directoryiterator_rewind directoryiterator_valid dirname diskfreespace disk_free_space disk_total_space dl dngettext dns_check_record dns_get_mx dns_get_record domattribute_name domattribute_set_value domattribute_specified domattribute_value domdocumenttype_entities domdocumenttype_internal_subset domdocumenttype_name domdocumenttype_notations domdocumenttype_public_id domdocumenttype_system_id domdocument_add_root domdocument_create_attribute domdocument_create_cdata_section domdocument_create_comment domdocument_create_element domdocument_create_element_ns domdocument_create_entity_reference domdocument_create_processing_instruction domdocument_create_text_node domdocument_doctype domdocument_document_element domdocument_dump_file domdocument_dump_mem domdocument_get_elements_by_tagname domdocument_get_element_by_id domdocument_html_dump_mem domdocument_xinclude domelement_get_attribute domelement_get_attribute_node domelement_get_elements_by_tagname domelement_has_attribute domelement_remove_attribute domelement_set_attribute domelement_set_attribute_node domelement_tagname domnode_add_namespace domnode_append_child domnode_append_sibling domnode_attributes domnode_child_nodes domnode_clone_node domnode_dump_node domnode_first_child domnode_get_content domnode_has_attributes domnode_has_child_nodes domnode_insert_before domnode_is_blank_node domnode_last_child domnode_next_sibling domnode_node_name domnode_node_type domnode_node_value domnode_owner_document domnode_parent_node domnode_prefix domnode_previous_sibling domnode_remove_child domnode_replace_child domnode_replace_node domnode_set_content domnode_set_name domnode_set_namespace domnode_unlink_node domprocessinginstruction_data domprocessinginstruction_target domxml_new_doc domxml_open_file domxml_open_mem domxml_version domxml_xmltree domxml_xslt_stylesheet domxml_xslt_stylesheet_doc domxml_xslt_stylesheet_file domxml_xslt_version domxsltstylesheet_process domxsltstylesheet_result_dump_file domxsltstylesheet_result_dump_mem dom_domattr_construct dom_domattr_isid dom_domcharacterdata_appenddata dom_domcharacterdata_deletedata dom_domcharacterdata_insertdata dom_domcharacterdata_replacedata dom_domcharacterdata_substringdata dom_domcomment_construct dom_domdocumentfragment.appendxml dom_domdocument_construct dom_domdocument_createattribute dom_domdocument_createattributens dom_domdocument_createcdatasection dom_domdocument_createcomment dom_domdocument_createdocumentfragment dom_domdocument_createelement dom_domdocument_createelementns dom_domdocument_createentityreference dom_domdocument_createprocessinginstruction dom_domdocument_createtextnode dom_domdocument_getelementbyid dom_domdocument_getelementsbytagname dom_domdocument_getelementsbytagnamens dom_domdocument_import!node dom_domdocument_load dom_domdocument_loadhtml dom_domdocument_loadhtmlfile dom_domdocument_loadxml dom_domdocument_normalize dom_domdocument_relaxngvalidate dom_domdocument_relaxngvalidatesource dom_domdocument_save dom_domdocument_savehtml dom_domdocument_savehtmlfile dom_domdocument_savexml dom_domdocument_schemavalidate dom_domdocument_schemavalidatesource dom_domdocument_validate dom_domdocument_xinclude dom_domelement_construct dom_domelement_getattribute dom_domelement_getattributenode dom_domelement_getattributenodens dom_domelement_getattributens dom_domelement_getelementsbytagname dom_domelement_getelementsbytagnamens dom_domelement_hasattribute dom_domelement_hasattributens dom_domelement_removeattribute dom_domelement_removeattributenode dom_domelement_removeattributens dom_domelement_setattribute dom_domelement_setattributenode dom_domelement_setattributenodens dom_domelement_setattributens dom_domentityreference_construct dom_domimplementation_construct dom_domimplementation_createdocument dom_domimplementation_createdocumenttype dom_domimplementation_hasfeature dom_domnamednodemap_getnameditem dom_domnamednodemap_getnameditemns dom_domnamednodemap_item dom_domnodelist_item dom_domnode_appendchild dom_domnode_clonenode dom_domnode_hasattributes dom_domnode_haschildnodes dom_domnode_insertbefore dom_domnode_issamenode dom_domnode_issupported dom_domnode_lookupnamespaceuri dom_domnode_lookupprefix dom_domnode_normalize dom_domnode_removechild dom_domnode_replacechild dom_domprocessinginstruction_construct dom_domtext_construct dom_domtext_iswhitespaceinelementcontent dom_domtext_splittext dom_domxpath_construct dom_domxpath_eval!uate dom_domxpath_query dom_domxpath_registernamespace dom_import!_simplexml dotnet dotnet_load doubleval! each easter_date easter_days ebcdic2ascii echo empty end ereg eregi eregi_replace ereg_replace error_log error_reporting escapeshellarg escapeshellcmd eval! exec exif_imagetype exif_read_data exif_tagname exif_thumbnail exit exp expect_expectl expect_popen explode expm1 extension_loaded extract ezmlm_hash fam_cancel_monitor fam_close fam_monitor_collection fam_monitor_directory fam_monitor_file fam_next_event fam_open fam_pending fam_resume_monitor fam_suspend_monitor fbsql_affected_rows fbsql_autocommit fbsql_blob_size fbsql_change_user fbsql_clob_size fbsql_close fbsql_commit fbsql_connect fbsql_create_blob fbsql_create_clob fbsql_create_db fbsql_database fbsql_database_password fbsql_data_seek fbsql_db_query fbsql_db_status fbsql_drop_db fbsql_errno fbsql_error fbsql_fetch_array fbsql_fetch_assoc fbsql_fetch_field fbsql_fetch_lengths fbsql_fetch_object fbsql_fetch_row fbsql_field_flags fbsql_field_len fbsql_field_name fbsql_field_seek fbsql_field_table fbsql_field_type fbsql_free_result fbsql_get_autostart_info fbsql_hostname fbsql_insert_id fbsql_list_dbs fbsql_list_fields fbsql_list_tables fbsql_next_result fbsql_num_fields fbsql_num_rows fbsql_password fbsql_pconnect fbsql_query fbsql_read_blob fbsql_read_clob fbsql_result fbsql_rollback fbsql_select_db fbsql_set_lob_mode fbsql_set_password fbsql_set_transaction fbsql_start_db fbsql_stop_db fbsql_tablename fbsql_username fbsql_warnings fclose fdf_add_doc_javascript fdf_add_template fdf_close fdf_create fdf_enum_values fdf_errno fdf_error fdf_get_ap fdf_get_attachment fdf_get_encoding fdf_get_file fdf_get_flags fdf_get_opt fdf_get_status fdf_get_value fdf_get_version fdf_header fdf_next_field_name fdf_open fdf_open_string fdf_remove_item fdf_save fdf_save_string fdf_set_ap fdf_set_encoding fdf_set_file fdf_set_flags fdf_set_javascript_action fdf_set_on_import!_javascript fdf_set_opt fdf_set_status fdf_set_submit_form_action fdf_set_target_frame fdf_set_value fdf_set_version feof fflush fgetc fgetcsv fgets fgetss file fileatime filectime filegroup fileinode filemtime fileowner fileperms filepro filepro_fieldcount filepro_fieldname filepro_fieldtype filepro_fieldwidth filepro_retrieve filepro_rowcount filesize filetype file_exists file_get_contents file_put_contents filteriterator_current filteriterator_getinneriterator filteriterator_key filteriterator_next filteriterator_rewind filteriterator_valid filter_data finfo_buffer finfo_close finfo_file finfo_open finfo_set_flags floatval flock floor flush fmod fnmatch fopen fpassthru fprintf fputcsv fputs fread frenchtojd fribidi_log2vis fscanf fseek fsockopen fstat ftell ftok ftp_alloc ftp_cdup ftp_chdir ftp_chmod ftp_close ftp_connect ftp_delete ftp_exec ftp_fget ftp_fput ftp_get ftp_get_option ftp_login ftp_mdtm ftp_mkdir ftp_nb_continue ftp_nb_fget ftp_nb_fput ftp_nb_get ftp_nb_put ftp_nlist ftp_pasv ftp_put ftp_pwd ftp_quit ftp_raw ftp_rawlist ftp_rename ftp_rmdir ftp_set_option ftp_site ftp_size ftp_ssl_connect ftp_systype ftruncate function_exists func_get_arg func_get_args func_num_args fwrite gd_info getallheaders getcwd getdate getenv gethostbyaddr gethostbyname gethostbynamel getimagesize getlastmod getmxrr getmygid getmyinode getmypid getmyuid getopt getprotobyname getprotobynumber getrandmax getrusage getservbyname getservbyport gettext gettimeofday gettype get_browser get_cfg_var get_class get_class_methods get_class_vars get_current_user get_declared_classes get_declared_interfaces get_defined_constants get_defined_functions get_defined_vars get_extension_funcs get_headers get_html_translation_table get_included_files get_include_path get_loaded_extensions get_magic_quotes_gpc get_magic_quotes_runtime get_meta_tags get_object_vars get_parent_class get_required_files get_resource_type glob gmdate gmmktime gmp_abs gmp_add gmp_and gmp_clrbit gmp_cmp gmp_com gmp_div gmp_divexact gmp_div_q gmp_div_qr gmp_div_r gmp_fact gmp_gcd gmp_gcdext gmp_hamdist gmp_init gmp_intval gmp_invert gmp_jacobi gmp_legendre gmp_mod gmp_mul gmp_neg gmp_nextprime gmp_or gmp_perfect_square gmp_popcount gmp_pow gmp_powm gmp_prob_prime gmp_random gmp_scan0 gmp_scan1 gmp_setbit gmp_sign gmp_sqrt gmp_sqrtrem gmp_strval gmp_sub gmp_xor gmstrftime gnupg_adddecryptkey gnupg_addencryptkey gnupg_addsignkey gnupg_cleardecryptkeys gnupg_clearencryptkeys gnupg_clearsignkeys gnupg_decrypt gnupg_decryptverify gnupg_encrypt gnupg_encryptsign gnupg_export gnupg_geterror gnupg_getprotocol gnupg_import! gnupg_keyinfo gnupg_setarmor gnupg_seterrormode gnupg_setsignmode gnupg_sign gnupg_verify gopher_parsedir gregoriantojd gzclose gzcompress gzdeflate gzencode gzeof gzfile gzgetc gzgets gzgetss gzinflate gzopen gzpassthru gzputs gzread gzrewind gzseek gztell gzuncompress gzwrite halt_compiler hash hash_algos hash_file hash_final hash_hmac hash_hmac_file hash_init hash_update hash_update_file hash_update_stream header headers_list headers_sent hebrev hebrevc hexdec highlight_file highlight_string htmlentities htmlspecialchars htmlspecialchars_decode html_entity_decode http_build_query hwapi_attribute hwapi_attribute_key hwapi_attribute_langdepvalue hwapi_attribute_value hwapi_attribute_values hwapi_checkin hwapi_checkout hwapi_children hwapi_content hwapi_content_mimetype hwapi_content_read hwapi_copy hwapi_dbstat hwapi_dcstat hwapi_dstanchors hwapi_dstofsrcanchor hwapi_error_count hwapi_error_reason hwapi_find hwapi_ftstat hwapi_hgcsp hwapi_hwstat hwapi_identify hwapi_info hwapi_insert hwapi_insertanchor hwapi_insertcollection hwapi_insertdocument hwapi_link hwapi_lock hwapi_move hwapi_new_content hwapi_object hwapi_objectbyanchor hwapi_object_assign hwapi_object_attreditable hwapi_object_count hwapi_object_insert hwapi_object_new hwapi_object_remove hwapi_object_title hwapi_object_value hwapi_parents hwapi_reason_description hwapi_reason_type hwapi_remove hwapi_replace hwapi_setcommittedversion hwapi_srcanchors hwapi_srcsofdst hwapi_unlock hwapi_user hwapi_userlist hw_array2objrec hw_changeobject hw_children hw_childrenobj hw_close hw_connect hw_connection_info hw_cp hw_deleteobject hw_docbyanchor hw_docbyanchorobj hw_document_attributes hw_document_bodytag hw_document_content hw_document_setcontent hw_document_size hw_dummy hw_edittext hw_error hw_errormsg hw_free_document hw_getanchors hw_getanchorsobj hw_getandlock hw_getchildcoll hw_getchildcollobj hw_getchilddoccoll hw_getchilddoccollobj hw_getobject hw_getobjectbyquery hw_getobjectbyquerycoll hw_getobjectbyquerycollobj hw_getobjectbyqueryobj hw_getparents hw_getparentsobj hw_getrellink hw_getremote hw_getremotechildren hw_getsrcbydestobj hw_gettext hw_getusername hw_identify hw_incollections hw_info hw_inscoll hw_insdoc hw_insertanchors hw_insertdocument hw_insertobject hw_mapid hw_modifyobject hw_mv hw_new_document hw_objrec2array hw_output_document hw_pconnect hw_pipedocument hw_root hw_setlinkroot hw_stat hw_unlock hw_who hypot i18n_loc_get_default i18n_loc_set_default ibase_add_user ibase_affected_rows ibase_backup ibase_blob_add ibase_blob_cancel ibase_blob_close ibase_blob_create ibase_blob_echo ibase_blob_get ibase_blob_import! ibase_blob_info ibase_blob_open ibase_close ibase_commit ibase_commit_ret ibase_connect ibase_db_info ibase_delete_user ibase_drop_db ibase_errcode ibase_errmsg ibase_execute ibase_fetch_assoc ibase_fetch_object ibase_fetch_row ibase_field_info ibase_free_event_handler ibase_free_query ibase_free_result ibase_gen_id ibase_maintain_db ibase_modify_user ibase_name_result ibase_num_fields ibase_num_params ibase_param_info ibase_pconnect ibase_prepare ibase_query ibase_restore ibase_rollback ibase_rollback_ret ibase_server_info ibase_service_attach ibase_service_detach ibase_set_event_handler ibase_timefmt ibase_trans ibase_wait_event icap_close icap_create_calendar icap_delete_calendar icap_delete_event icap_fetch_event icap_list_alarms icap_list_events icap_open icap_rename_calendar icap_reopen icap_snooze icap_store_event iconv iconv_get_encoding iconv_mime_decode iconv_mime_decode_headers iconv_mime_encode iconv_set_encoding iconv_strlen iconv_strpos iconv_strrpos iconv_substr id3_get_frame_long_name id3_get_frame_short_name id3_get_genre_id id3_get_genre_list id3_get_genre_name id3_get_tag id3_get_version id3_remove_tag id3_set_tag idate ifxus_close_slob ifxus_create_slob ifxus_free_slob ifxus_open_slob ifxus_read_slob ifxus_seek_slob ifxus_tell_slob ifxus_write_slob ifx_affected_rows ifx_blobinfile_mode ifx_byteasvarchar ifx_close ifx_connect ifx_copy_blob ifx_create_blob ifx_create_char ifx_do ifx_error ifx_errormsg ifx_fetch_row ifx_fieldproperties ifx_fieldtypes ifx_free_blob ifx_free_char ifx_free_result ifx_getsqlca ifx_get_blob ifx_get_char ifx_htmltbl_result ifx_nullformat ifx_num_fields ifx_num_rows ifx_pconnect ifx_prepare ifx_query ifx_textasvarchar ifx_update_blob ifx_update_char ignore_user_abort iis_add_server iis_get_dir_security iis_get_script_map iis_get_server_by_comment iis_get_server_by_path iis_get_server_rights iis_get_service_state iis_remove_server iis_set_app_settings iis_set_dir_security iis_set_script_map iis_set_server_rights iis_start_server iis_start_service iis_stop_server iis_stop_service image2wbmp imagealphablending imageantialias imagearc imagechar imagecharup imagecolorallocate imagecolorallocatealpha imagecolorat imagecolorclosest imagecolorclosestalpha imagecolorclosesthwb imagecolordeallocate imagecolorexact imagecolorexactalpha imagecolormatch imagecolorresolve imagecolorresolvealpha imagecolorset imagecolorsforindex imagecolorstotal imagecolortransparent imageconvolution imagecopy imagecopymerge imagecopymergegray imagecopyresampled imagecopyresized imagecreate imagecreatefromgd imagecreatefromgd2 imagecreatefromgd2part imagecreatefromgif imagecreatefromjpeg imagecreatefrompng imagecreatefromstring imagecreatefromwbmp imagecreatefromxbm imagecreatefromxpm imagecreatetruecolor imagedashedline imagedestroy imageellipse imagefill imagefilledarc imagefilledellipse imagefilledpolygon imagefilledrectangle imagefilltoborder imagefilter imagefontheight imagefontwidth imageftbbox imagefttext imagegammacorrect imagegd imagegd2 imagegif imageinterlace imageistruecolor imagejpeg imagelayereffect imageline imageloadfont imagepalettecopy imagepng imagepolygon imagepsbbox imagepscopyfont imagepsencodefont imagepsextendfont imagepsfreefont imagepsloadfont imagepsslantfont imagepstext imagerectangle imagerotate imagesavealpha imagesetbrush imagesetpixel imagesetstyle imagesetthickness imagesettile imagestring imagestringup imagesx imagesy imagetruecolortopalette imagettfbbox imagettftext imagetypes imagewbmp imagexbm image_type_to_extension image_type_to_mime_type imap_8bit imap_alert!s imap_append imap_base64 imap_binary imap_body imap_bodystruct imap_check imap_clearflag_full imap_close imap_createmailbox imap_delete imap_deletemailbox imap_errors imap_expunge imap_fetchbody imap_fetchheader imap_fetchstructure imap_fetch_overview imap_getacl imap_getmailboxes imap_getsubscribed imap_get_quota imap_get_quotaroot imap_header imap_headerinfo imap_headers imap_last_error imap_list imap_listmailbox imap_listscan imap_listsubscribed imap_lsub imap_mail imap_mailboxmsginfo imap_mail_compose imap_mail_copy imap_mail_move imap_mime_header_decode imap_msgno imap_num_msg imap_num_recent imap_open imap_ping imap_qprint imap_renamemailbox imap_reopen imap_rfc822_parse_adrlist imap_rfc822_parse_headers imap_rfc822_write_address imap_scanmailbox imap_search imap_setacl imap_setflag_full imap_set_quota imap_sort imap_status imap_subscribe imap_thread imap_timeout imap_uid imap_undelete imap_unsubscribe imap_utf7_decode imap_utf7_encode imap_utf8 implode import!_request_variables include include_once inet_ntop inet_pton ingres_autocommit ingres_close ingres_commit ingres_connect ingres_cursor ingres_errno ingres_error ingres_errsqlstate ingres_fetch_array ingres_fetch_object ingres_fetch_row ingres_field_length ingres_field_name ingres_field_nullable ingres_field_precision ingres_field_scale ingres_field_type ingres_num_fields ingres_num_rows ingres_pconnect ingres_query ingres_rollback ini_alter ini_get ini_get_all ini_restore ini_set input_filters_list input_get input_has_variable input_name_to_filter interface_exists intval in_array ip2long iptcembed iptcparse ircg_channel_mode ircg_disconnect ircg_eval!_ecmascript_params ircg_fetch_error_msg ircg_get_username ircg_html_encode ircg_ignore_add ircg_ignore_del ircg_invite ircg_is_conn_alive ircg_join ircg_kick ircg_list ircg_lookup_format_messages ircg_lusers ircg_msg ircg_names ircg_nick ircg_nickname_escape ircg_nickname_unescape ircg_notice ircg_oper ircg_part ircg_pconnect ircg_register_format_messages ircg_set_current ircg_set_file ircg_set_on_die ircg_topic ircg_who ircg_whois isset is_a is_array is_bool is_callable is_dir is_double is_executable is_file is_finite is_float is_infinite is_int is_integer is_link is_long is_nan is_null is_numeric is_object is_readable is_real is_resource is_scalar is_soap_fault is_string is_subclass_of is_uploaded_file is_writable is_writeable iterator_count iterator_to_array java_last_exception_clear java_last_exception_get jddayofweek jdmonthname jdtofrench jdtogregorian jdtojewish jdtojulian jdtounix jewishtojd join jpeg2wbmp juliantojd kadm5_chpass_principal kadm5_create_principal kadm5_delete_principal kadm5_destroy kadm5_flush kadm5_get_policies kadm5_get_principal kadm5_get_principals kadm5_init_with_password kadm5_modify_principal key krsort ksort lcg_value lchgrp lchown ldap_8859_to_t61 ldap_add ldap_bind ldap_close ldap_compare ldap_connect ldap_count_entries ldap_delete ldap_dn2ufn ldap_err2str ldap_errno ldap_error ldap_explode_dn ldap_first_attribute ldap_first_entry ldap_first_reference ldap_free_result ldap_get_attributes ldap_get_dn ldap_get_entries ldap_get_option ldap_get_values ldap_get_values_len ldap_list ldap_modify ldap_mod_add ldap_mod_del ldap_mod_replace ldap_next_attribute ldap_next_entry ldap_next_reference ldap_parse_reference ldap_parse_result ldap_read ldap_rename ldap_sasl_bind ldap_search ldap_set_option ldap_set_rebind_proc ldap_sort ldap_start_tls ldap_t61_to_8859 ldap_unbind levenshtein libxml_clear_errors libxml_get_errors libxml_get_last_error libxml_set_streams_context libxml_use_internal_errors limititerator_getposition limititerator_next limititerator_rewind limititerator_seek limititerator_valid link linkinfo list localeconv localtime log log10 log1p long2ip lstat ltrim lzf_compress lzf_decompress lzf_optimized_for mail mailparse_determine_best_xfer_encoding mailparse_msg_create mailparse_msg_extract_part mailparse_msg_extract_part_file mailparse_msg_free mailparse_msg_get_part mailparse_msg_get_part_data mailparse_msg_get_structure mailparse_msg_parse mailparse_msg_parse_file mailparse_rfc822_parse_addresses mailparse_stream_encode mailparse_uudecode_all main max maxdb_affected_rows maxdb_autocommit maxdb_bind_param maxdb_bind_result maxdb_change_user maxdb_character_set_name maxdb_client_encoding maxdb_close maxdb_close_long_data maxdb_commit maxdb_connect maxdb_connect_errno maxdb_connect_error maxdb_data_seek maxdb_debug maxdb_disable_reads_from_master maxdb_disable_rpl_parse maxdb_dump_debug_info maxdb_embedded_connect maxdb_enable_reads_from_master maxdb_enable_rpl_parse maxdb_errno maxdb_error maxdb_escape_string maxdb_execute maxdb_fetch maxdb_fetch_array maxdb_fetch_assoc maxdb_fetch_field maxdb_fetch_fields maxdb_fetch_field_direct maxdb_fetch_lengths maxdb_fetch_object maxdb_fetch_row maxdb_field_count maxdb_field_seek maxdb_field_tell maxdb_free_result maxdb_get_client_info maxdb_get_client_version maxdb_get_host_info maxdb_get_metadata maxdb_get_proto_info maxdb_get_server_info maxdb_get_server_version maxdb_info maxdb_init maxdb_insert_id maxdb_kill maxdb_master_query maxdb_more_results maxdb_multi_query maxdb_next_result maxdb_num_fields maxdb_num_rows maxdb_options maxdb_param_count maxdb_ping maxdb_prepare maxdb_query maxdb_real_connect maxdb_real_escape_string maxdb_real_query maxdb_report maxdb_rollback maxdb_rpl_parse_enabled maxdb_rpl_probe maxdb_rpl_query_type maxdb_select_db maxdb_send_long_data maxdb_send_query maxdb_server_end maxdb_server_init maxdb_set_opt maxdb_sqlstate maxdb_ssl_set maxdb_stat maxdb_stmt_affected_rows maxdb_stmt_bind_param maxdb_stmt_bind_result maxdb_stmt_close maxdb_stmt_close_long_data maxdb_stmt_data_seek maxdb_stmt_errno maxdb_stmt_error maxdb_stmt_execute maxdb_stmt_fetch maxdb_stmt_free_result maxdb_stmt_init maxdb_stmt_num_rows maxdb_stmt_param_count maxdb_stmt_prepare maxdb_stmt_reset maxdb_stmt_result_metadata maxdb_stmt_send_long_data maxdb_stmt_sqlstate maxdb_stmt_store_result maxdb_store_result maxdb_thread_id maxdb_thread_safe maxdb_use_result maxdb_warning_count mb_convert_case mb_convert_encoding mb_convert_kana mb_convert_variables mb_decode_mimeheader mb_decode_numericentity mb_detect_encoding mb_detect_order mb_encode_mimeheader mb_encode_numericentity mb_ereg mb_eregi mb_eregi_replace mb_ereg_match mb_ereg_replace mb_ereg_search mb_ereg_search_getpos mb_ereg_search_getregs mb_ereg_search_init mb_ereg_search_pos mb_ereg_search_regs mb_ereg_search_setpos mb_get_info mb_http_input mb_http_output mb_internal_encoding mb_language mb_list_encodings mb_output_handler mb_parse_str mb_preferred_mime_name mb_regex_encoding mb_regex_set_options mb_send_mail mb_split mb_strcut mb_strimwidth mb_strlen mb_strpos mb_strrpos mb_strtolower mb_strtoupper mb_strwidth mb_substitute_character mb_substr mb_substr_count mcal_append_event mcal_close mcal_create_calendar mcal_date_compare mcal_date_valid mcal_days_in_month mcal_day_of_week mcal_day_of_year mcal_delete_calendar mcal_delete_event mcal_event_add_attribute mcal_event_init mcal_event_set_alarm mcal_event_set_category mcal_event_set_class mcal_event_set_description mcal_event_set_end mcal_event_set_recur_daily mcal_event_set_recur_monthly_mday mcal_event_set_recur_monthly_wday mcal_event_set_recur_none mcal_event_set_recur_weekly mcal_event_set_recur_yearly mcal_event_set_start mcal_event_set_title mcal_expunge mcal_fetch_current_stream_event mcal_fetch_event mcal_is_leap_year mcal_list_alarms mcal_list_events mcal_next_recurrence mcal_open mcal_popen mcal_rename_calendar mcal_reopen mcal_snooze mcal_store_event mcal_time_valid mcal_week_of_year mcrypt_cbc mcrypt_cfb mcrypt_create_iv mcrypt_decrypt mcrypt_ecb mcrypt_encrypt mcrypt_enc_get_algorithms_name mcrypt_enc_get_block_size mcrypt_enc_get_iv_size mcrypt_enc_get_key_size mcrypt_enc_get_modes_name mcrypt_enc_get_supported_key_sizes mcrypt_enc_is_block_algorithm mcrypt_enc_is_block_algorithm_mode mcrypt_enc_is_block_mode mcrypt_enc_self_test mcrypt_generic mcrypt_generic_deinit mcrypt_generic_end mcrypt_generic_init mcrypt_get_block_size mcrypt_get_cipher_name mcrypt_get_iv_size mcrypt_get_key_size mcrypt_list_algorithms mcrypt_list_modes mcrypt_module_close mcrypt_module_get_algo_block_size mcrypt_module_get_algo_key_size mcrypt_module_get_supported_key_sizes mcrypt_module_is_block_algorithm mcrypt_module_is_block_algorithm_mode mcrypt_module_is_block_mode mcrypt_module_open mcrypt_module_self_test mcrypt_ofb md5 md5_file mdecrypt_generic memcache_add memcache_addserver memcache_close memcache_connect memcache_debug memcache_decrement memcache_delete memcache_flush memcache_get memcache_getextendedstats memcache_getstats memcache_getversion memcache_increment memcache_pconnect memcache_replace memcache_set memcache_setcompressthreshold memory_get_usage metaphone method_exists mhash mhash_count mhash_get_block_size mhash_get_hash_name mhash_keygen_s2k microtime mime_content_type min ming_keypress ming_setcubicthreshold ming_setscale ming_useconstants ming_useswfversion mkdir mktime money_format move_uploaded_file msession_connect msession_count msession_create msession_destroy msession_disconnect msession_find msession_get msession_get_array msession_get_data msession_inc msession_list msession_listvar msession_lock msession_plugin msession_randstr msession_set msession_set_array msession_set_data msession_timeout msession_uniq msession_unlock msg_get_queue msg_receive msg_remove_queue msg_send msg_set_queue msg_stat_queue msql msql_affected_rows msql_close msql_connect msql_createdb msql_create_db msql_data_seek msql_dbname msql_db_query msql_drop_db msql_error msql_fetch_array msql_fetch_field msql_fetch_object msql_fetch_row msql_fieldflags msql_fieldlen msql_fieldname msql_fieldtable msql_fieldtype msql_field_flags msql_field_len msql_field_name msql_field_seek msql_field_table msql_field_type msql_free_result msql_list_dbs msql_list_fields msql_list_tables msql_numfields msql_numrows msql_num_fields msql_num_rows msql_pconnect msql_query msql_regcase msql_result msql_select_db msql_tablename mssql_bind mssql_close mssql_connect mssql_data_seek mssql_execute mssql_fetch_array mssql_fetch_assoc mssql_fetch_batch mssql_fetch_field mssql_fetch_object mssql_fetch_row mssql_field_length mssql_field_name mssql_field_seek mssql_field_type mssql_free_result mssql_free_statement mssql_get_last_message mssql_guid_string mssql_init mssql_min_error_severity mssql_min_message_severity mssql_next_result mssql_num_fields mssql_num_rows mssql_pconnect mssql_query mssql_result mssql_rows_affected mssql_select_db mt_getrandmax mt_rand mt_srand muscat_close muscat_get muscat_give muscat_setup muscat_setup_net mysqli_affected_rows mysqli_autocommit mysqli_bind_param mysqli_bind_result mysqli_change_user mysqli_character_set_name mysqli_client_encoding mysqli_close mysqli_commit mysqli_connect mysqli_connect_errno mysqli_connect_error mysqli_data_seek mysqli_debug mysqli_disable_reads_from_master mysqli_disable_rpl_parse mysqli_dump_debug_info mysqli_embedded_connect mysqli_enable_reads_from_master mysqli_enable_rpl_parse mysqli_errno mysqli_error mysqli_escape_string mysqli_execute mysqli_fetch mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_field_direct mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_client_info mysqli_get_client_version mysqli_get_host_info mysqli_get_metadata mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_master_query mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_param_count mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_report mysqli_rollback mysqli_rpl_parse_enabled mysqli_rpl_probe mysqli_rpl_query_type mysqli_select_db mysqli_send_long_data mysqli_send_query mysqli_server_end mysqli_server_init mysqli_set_charset mysqli_set_opt mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_affected_rows mysqli_stmt_bind_param mysqli_stmt_bind_result mysqli_stmt_close mysqli_stmt_data_seek mysqli_stmt_errno mysqli_stmt_error mysqli_stmt_execute mysqli_stmt_fetch mysqli_stmt_free_result mysqli_stmt_init mysqli_stmt_num_rows mysqli_stmt_param_count mysqli_stmt_prepare mysqli_stmt_reset mysqli_stmt_result_metadata mysqli_stmt_send_long_data mysqli_stmt_sqlstate mysqli_stmt_store_result mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count mysql_affected_rows mysql_change_user mysql_client_encoding mysql_close mysql_connect mysql_create_db mysql_data_seek mysql_db_name mysql_db_query mysql_drop_db mysql_errno mysql_error mysql_escape_string mysql_fetch_array mysql_fetch_assoc mysql_fetch_field mysql_fetch_lengths mysql_fetch_object mysql_fetch_row mysql_field_flags mysql_field_len mysql_field_name mysql_field_seek mysql_field_table mysql_field_type mysql_free_result mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql_insert_id mysql_list_dbs mysql_list_fields mysql_list_processes mysql_list_tables mysql_num_fields mysql_num_rows mysql_pconnect mysql_ping mysql_query mysql_real_escape_string mysql_result mysql_select_db mysql_stat mysql_tablename mysql_thread_id mysql_unbuffered_query m_checkstatus m_completeauthorizations m_connect m_connectionerror m_deletetrans m_destroyconn m_destroyengine m_getcell m_getcellbynum m_getcommadelimited m_getheader m_initconn m_initengine m_iscommadelimited m_maxconntimeout m_monitor m_numcolumns m_numrows m_parsecommadelimited m_responsekeys m_responseparam m_returnstatus m_setblocking m_setdropfile m_setip m_setssl m_setssl_cafile m_setssl_files m_settimeout m_sslcert_gen_hash m_transactionssent m_transinqueue m_transkeyval m_transnew m_transsend m_uwait m_validateidentifier m_verifyconnection m_verifysslcert natcasesort natsort ncurses_addch ncurses_addchnstr ncurses_addchstr ncurses_addnstr ncurses_addstr ncurses_assume_default_colors ncurses_attroff ncurses_attron ncurses_attrset ncurses_baudrate ncurses_beep ncurses_bkgd ncurses_bkgdset ncurses_border ncurses_bottom_panel ncurses_can_change_color ncurses_cbreak ncurses_clear ncurses_clrtobot ncurses_clrtoeol ncurses_color_content ncurses_color_set ncurses_curs_set ncurses_define_key ncurses_def_prog_mode ncurses_def_shell_mode ncurses_delay_output ncurses_delch ncurses_deleteln ncurses_delwin ncurses_del_panel ncurses_doupdate ncurses_echo ncurses_echochar ncurses_end ncurses_erase ncurses_erasechar ncurses_filter ncurses_flash ncurses_flushinp ncurses_getch ncurses_getmaxyx ncurses_getmouse ncurses_getyx ncurses_halfdelay ncurses_has_colors ncurses_has_ic ncurses_has_il ncurses_has_key ncurses_hide_panel ncurses_hline ncurses_inch ncurses_init ncurses_init_color ncurses_init_pair ncurses_insch ncurses_insdelln ncurses_insertln ncurses_insstr ncurses_instr ncurses_isendwin ncurses_keyok ncurses_keypad ncurses_killchar ncurses_longname ncurses_meta ncurses_mouseinterval ncurses_mousemask ncurses_mouse_trafo ncurses_move ncurses_move_panel ncurses_mvaddch ncurses_mvaddchnstr ncurses_mvaddchstr ncurses_mvaddnstr ncurses_mvaddstr ncurses_mvcur ncurses_mvdelch ncurses_mvgetch ncurses_mvhline ncurses_mvinch ncurses_mvvline ncurses_mvwaddstr ncurses_napms ncurses_newpad ncurses_newwin ncurses_new_panel ncurses_nl ncurses_nocbreak ncurses_noecho ncurses_nonl ncurses_noqiflush ncurses_noraw ncurses_pair_content ncurses_panel_above ncurses_panel_below ncurses_panel_window ncurses_pnoutrefresh ncurses_prefresh ncurses_putp ncurses_qiflush ncurses_raw ncurses_refresh ncurses_replace_panel ncurses_resetty ncurses_reset_prog_mode ncurses_reset_shell_mode ncurses_savetty ncurses_scrl ncurses_scr_dump ncurses_scr_init ncurses_scr_restore ncurses_scr_set ncurses_show_panel ncurses_slk_attr ncurses_slk_attroff ncurses_slk_attron ncurses_slk_attrset ncurses_slk_clear ncurses_slk_color ncurses_slk_init ncurses_slk_noutrefresh ncurses_slk_refresh ncurses_slk_restore ncurses_slk_set ncurses_slk_touch ncurses_standend ncurses_standout ncurses_start_color ncurses_termattrs ncurses_termname ncurses_timeout ncurses_top_panel ncurses_typeahead ncurses_ungetch ncurses_ungetmouse ncurses_update_panels ncurses_use_default_colors ncurses_use_env ncurses_use_extended_names ncurses_vidattr ncurses_vline ncurses_waddch ncurses_waddstr ncurses_wattroff ncurses_wattron ncurses_wattrset ncurses_wborder ncurses_wclear ncurses_wcolor_set ncurses_werase ncurses_wgetch ncurses_whline ncurses_wmouse_trafo ncurses_wmove ncurses_wnoutrefresh ncurses_wrefresh ncurses_wstandend ncurses_wstandout ncurses_wvline newt_bell newt_button newt_button_bar newt_centered_window newt_checkbox newt_checkbox_get_value newt_checkbox_set_flags newt_checkbox_set_value newt_checkbox_tree newt_checkbox_tree_add_item newt_checkbox_tree_find_item newt_checkbox_tree_get_current newt_checkbox_tree_get_entry_value newt_checkbox_tree_get_multi_selection newt_checkbox_tree_get_selection newt_checkbox_tree_multi newt_checkbox_tree_set_current newt_checkbox_tree_set_entry newt_checkbox_tree_set_entry_value newt_checkbox_tree_set_width newt_clear_key_buffer newt_cls newt_compact_button newt_component_add_callback newt_component_takes_focus newt_create_grid newt_cursor_off newt_cursor_on newt_delay newt_draw_form newt_draw_root_text newt_entry newt_entry_get_value newt_entry_set newt_entry_set_filter newt_entry_set_flags newt_finished newt_form newt_form_add_component newt_form_add_components newt_form_add_host_key newt_form_destroy newt_form_get_current newt_form_run newt_form_set_background newt_form_set_height newt_form_set_size newt_form_set_timer newt_form_set_width newt_form_watch_fd newt_get_screen_size newt_grid_add_components_to_form newt_grid_basic_window newt_grid_free newt_grid_get_size newt_grid_h_close_stacked newt_grid_h_stacked newt_grid_place newt_grid_set_field newt_grid_simple_window newt_grid_v_close_stacked newt_grid_v_stacked newt_grid_wrapped_window newt_grid_wrapped_window_at newt_init newt_label newt_label_set_text newt_listbox newt_listbox_append_entry newt_listbox_clear newt_listbox_clear_selection newt_listbox_delete_entry newt_listbox_get_current newt_listbox_get_selection newt_listbox_insert_entry newt_listbox_item_count newt_listbox_select_item newt_listbox_set_current newt_listbox_set_current_by_key newt_listbox_set_data newt_listbox_set_entry newt_listbox_set_width newt_listitem newt_listitem_get_data newt_listitem_set newt_open_window newt_pop_help_line newt_pop_window newt_push_help_line newt_radiobutton newt_radio_get_current newt_redraw_help_line newt_reflow_text newt_refresh newt_resize_screen newt_resume newt_run_form newt_scale newt_scale_set newt_scrollbar_set newt_set_help_callback newt_set_suspend_callback newt_suspend newt_texbox_set_text newt_textbox newt_textbox_get_num_lines newt_textbox_reflowed newt_textbox_set_height newt_vertical_scrollbar newt_wait_for_key newt_win_choice newt_win_entries newt_win_menu newt_win_message newt_win_messagev newt_win_ternary next ngettext nl2br nl_langinfo notes_body notes_copy_db notes_create_db notes_create_note notes_drop_db notes_find_note notes_header_info notes_list_msgs notes_mark_read notes_mark_unread notes_nav_create notes_search notes_unread notes_version nsapi_request_headers nsapi_response_headers nsapi_virtual number_format ob_clean ob_end_clean ob_end_flush ob_flush ob_get_clean ob_get_contents ob_get_flush ob_get_length ob_get_level ob_get_status ob_gzhandler ob_iconv_handler ob_implicit_flush ob_list_handlers ob_start ob_tidyhandler ocibindbyname ocicancel ocicloselob ocicollappend ocicollassign ocicollassignelem ocicollgetelem ocicollmax ocicollsize ocicolltrim ocicolumnisnull ocicolumnname ocicolumnprecision ocicolumnscale ocicolumnsize ocicolumntype ocicolumntyperaw ocicommit ocidefinebyname ocierror ociexecute ocifetch ocifetchinto ocifetchstatement ocifreecollection ocifreecursor ocifreedesc ocifreestatement ociinternaldebug ociloadlob ocilogoff ocilogon ocinewcollection ocinewcursor ocinewdescriptor ocinlogon ocinumcols ociparse ociplogon ociresult ocirollback ocirowcount ocisavelob ocisavelobfile ociserverversion ocisetprefetch ocistatementtype ociwritelobtofile ociwritetemporarylob oci_bind_array_by_name oci_bind_by_name oci_cancel oci_close oci_collection_append oci_collection_assign oci_collection_element_assign oci_collection_element_get oci_collection_free oci_collection_max oci_collection_size oci_collection_trim oci_commit oci_connect oci_define_by_name oci_error oci_execute oci_fetch oci_fetch_all oci_fetch_array oci_fetch_assoc oci_fetch_object oci_fetch_row oci_field_is_null oci_field_name oci_field_precision oci_field_scale oci_field_size oci_field_type oci_field_type_raw oci_free_statement oci_internal_debug oci_lob_append oci_lob_close oci_lob_copy oci_lob_eof oci_lob_erase oci_lob_export oci_lob_flush oci_lob_free oci_lob_getbuffering oci_lob_import! oci_lob_is_equal oci_lob_load oci_lob_read oci_lob_rewind oci_lob_save oci_lob_savefile oci_lob_seek oci_lob_setbuffering oci_lob_size oci_lob_tell oci_lob_truncate oci_lob_write oci_lob_writetemporary oci_lob_writetofile oci_new_collection oci_new_connect oci_new_cursor oci_new_descriptor oci_num_fields oci_num_rows oci_parse oci_password_change oci_pconnect oci_result oci_rollback oci_server_version oci_set_prefetch oci_statement_type octdec odbc_autocommit odbc_binmode odbc_close odbc_close_all odbc_columnprivileges odbc_columns odbc_commit odbc_connect odbc_cursor odbc_data_source odbc_do odbc_error odbc_errormsg odbc_exec odbc_execute odbc_fetch_array odbc_fetch_into odbc_fetch_object odbc_fetch_row odbc_field_len odbc_field_name odbc_field_num odbc_field_precision odbc_field_scale odbc_field_type odbc_foreignkeys odbc_free_result odbc_gettypeinfo odbc_longreadlen odbc_next_result odbc_num_fields odbc_num_rows odbc_pconnect odbc_prepare odbc_primarykeys odbc_procedurecolumns odbc_procedures odbc_result odbc_result_all odbc_rollback odbc_setoption odbc_specialcolumns odbc_statistics odbc_tableprivileges odbc_tables openal_buffer_create openal_buffer_data openal_buffer_destroy openal_buffer_get openal_buffer_loadwav openal_context_create openal_context_current openal_context_destroy openal_context_process openal_context_suspend openal_device_close openal_device_open openal_listener_get openal_listener_set openal_source_create openal_source_destroy openal_source_get openal_source_pause openal_source_play openal_source_rewind openal_source_set openal_source_stop openal_stream opendir openlog openssl_csr_export openssl_csr_export_to_file openssl_csr_new openssl_csr_sign openssl_error_string openssl_free_key openssl_get_privatekey openssl_get_publickey openssl_open openssl_pkcs7_decrypt openssl_pkcs7_encrypt openssl_pkcs7_sign openssl_pkcs7_verify openssl_pkey_export openssl_pkey_export_to_file openssl_pkey_free openssl_pkey_get_private openssl_pkey_get_public openssl_pkey_new openssl_private_decrypt openssl_private_encrypt openssl_public_decrypt openssl_public_encrypt openssl_seal openssl_sign openssl_verify openssl_x509_checkpurpose openssl_x509_check_private_key openssl_x509_export openssl_x509_export_to_file openssl_x509_free openssl_x509_parse openssl_x509_read ora_bind ora_close ora_columnname ora_columnsize ora_columntype ora_commit ora_commitoff ora_commiton ora_do ora_error ora_errorcode ora_exec ora_fetch ora_fetch_into ora_getcolumn ora_logoff ora_logon ora_numcols ora_numrows ora_open ora_parse ora_plogon ora_rollback orbitenum orbitobject orbitstruct ord output_add_rewrite_var output_reset_rewrite_vars overload override_function ovrimos_close ovrimos_commit ovrimos_connect ovrimos_cursor ovrimos_exec ovrimos_execute ovrimos_fetch_into ovrimos_fetch_row ovrimos_field_len ovrimos_field_name ovrimos_field_num ovrimos_field_type ovrimos_free_result ovrimos_longreadlen ovrimos_num_fields ovrimos_num_rows ovrimos_prepare ovrimos_result ovrimos_result_all ovrimos_rollback pack parentiterator_getchildren parentiterator_haschildren parentiterator_next parentiterator_rewind parsekit_compile_file parsekit_compile_string parsekit_func_arginfo parse_ini_file parse_str parse_url passthru pathinfo pclose pcntl_alarm pcntl_exec pcntl_fork pcntl_getpriority pcntl_setpriority pcntl_signal pcntl_wait pcntl_waitpid pcntl_wexitstatus pcntl_wifexited pcntl_wifsignaled pcntl_wifstopped pcntl_wstopsig pcntl_wtermsig pdf_activate_item pdf_add_annotation pdf_add_bookmark pdf_add_launchlink pdf_add_locallink pdf_add_nameddest pdf_add_note pdf_add_outline pdf_add_pdflink pdf_add_thumbnail pdf_add_weblink pdf_arc pdf_arcn pdf_attach_file pdf_begin_document pdf_begin_font pdf_begin_glyph pdf_begin_item pdf_begin_layer pdf_begin_page pdf_begin_page_ext pdf_begin_pattern pdf_begin_template pdf_circle pdf_clip pdf_close pdf_closepath pdf_closepath_fill_stroke pdf_closepath_stroke pdf_close_image pdf_close_pdi pdf_close_pdi_page pdf_concat pdf_continue_text pdf_create_action pdf_create_annotation pdf_create_bookmark pdf_create_field pdf_create_fieldgroup pdf_create_gstate pdf_create_pvf pdf_create_textflow pdf_curveto pdf_define_layer pdf_delete pdf_delete_pvf pdf_delete_textflow pdf_encoding_set_char pdf_endpath pdf_end_document pdf_end_font pdf_end_glyph pdf_end_item pdf_end_layer pdf_end_page pdf_end_page_ext pdf_end_pattern pdf_end_template pdf_fill pdf_fill_imageblock pdf_fill_pdfblock pdf_fill_stroke pdf_fill_textblock pdf_findfont pdf_fit_image pdf_fit_pdi_page pdf_fit_textflow pdf_fit_textline pdf_get_apiname pdf_get_buffer pdf_get_errmsg pdf_get_errnum pdf_get_font pdf_get_fontname pdf_get_fontsize pdf_get_image_height pdf_get_image_width pdf_get_majorversion pdf_get_minorversion pdf_get_parameter pdf_get_pdi_parameter pdf_get_pdi_value pdf_get_value pdf_info_textflow pdf_initgraphics pdf_lineto pdf_load_font pdf_load_iccprofile pdf_load_image pdf_makespotcolor pdf_moveto! pdf_new pdf_open_ccitt pdf_open_file pdf_open_gif pdf_open_image pdf_open_image_file pdf_open_jpeg pdf_open_memory_image pdf_open_pdi pdf_open_pdi_page pdf_open_tiff pdf_place_image pdf_place_pdi_page pdf_process_pdi pdf_rect pdf_restore pdf_resume_page pdf_rotate pdf_save pdf_scale pdf_setcolor pdf_setdash pdf_setdashpattern pdf_setflat pdf_setfont pdf_setgray pdf_setgray_fill pdf_setgray_stroke pdf_setlinecap pdf_setlinejoin pdf_setlinewidth pdf_setmatrix pdf_setmiterlimit pdf_setpolydash pdf_setrgbcolor pdf_setrgbcolor_fill pdf_setrgbcolor_stroke pdf_set_border_color pdf_set_border_dash pdf_set_border_style pdf_set_char_spacing pdf_set_duration pdf_set_gstate pdf_set_horiz_scaling pdf_set_info pdf_set_info_author pdf_set_info_creator pdf_set_info_keywords pdf_set_info_subject pdf_set_info_title pdf_set_layer_dependency pdf_set_leading pdf_set_parameter pdf_set_text_matrix pdf_set_text_pos pdf_set_text_rendering pdf_set_text_rise pdf_set_value pdf_set_word_spacing pdf_shading pdf_shading_pattern pdf_shfill pdf_show pdf_show_boxed pdf_show_xy pdf_skew pdf_stringwidth pdf_stroke pdf_suspend_page pdf_translate pdf_utf16_to_utf8 pdf_utf8_to_utf16 pdostatement_bindcolumn pdostatement_bindparam pdostatement_bindvalue pdostatement_closecursor pdostatement_columncount pdostatement_errorcode pdostatement_errorinfo pdostatement_execute pdostatement_fetch pdostatement_fetchall pdostatement_fetchcolumn pdostatement_fetchobject pdostatement_getattribute pdostatement_getcolumnmeta pdostatement_nextrowset pdostatement_rowcount pdostatement_setattribute pdostatement_setfetchmode pdo_begintransaction pdo_commit pdo_construct pdo_errorcode pdo_errorinfo pdo_exec pdo_getattribute pdo_getavailabledrivers pdo_lastinsertid pdo_pgsqllobcreate pdo_pgsqllobopen pdo_pgsqllobunlink pdo_prepare pdo_query pdo_quote pdo_rollback pdo_setattribute pdo_sqlitecreateaggregate pdo_sqlitecreatefunction pfpro_cleanup pfpro_init pfpro_process pfpro_process_raw pfpro_version pfsockopen pg_affected_rows pg_cancel_query pg_client_encoding pg_close pg_connect pg_connection_busy pg_connection_reset pg_connection_status pg_convert pg_copy_from pg_copy_to pg_dbname pg_delete pg_end_copy pg_escape_bytea pg_escape_string pg_execute pg_fetch_all pg_fetch_all_columns pg_fetch_array pg_fetch_assoc pg_fetch_object pg_fetch_result pg_fetch_row pg_field_is_null pg_field_name pg_field_num pg_field_prtlen pg_field_size pg_field_table pg_field_type pg_field_type_oid pg_free_result pg_get_notify pg_get_pid pg_get_result pg_host pg_insert pg_last_error pg_last_notice pg_last_oid pg_lo_close pg_lo_create pg_lo_export pg_lo_import! pg_lo_open pg_lo_read pg_lo_read_all pg_lo_seek pg_lo_tell pg_lo_unlink pg_lo_write pg_meta_data pg_num_fields pg_num_rows pg_options pg_parameter_status pg_pconnect pg_ping pg_port pg_prepare pg_put_line pg_query pg_query_params pg_result_error pg_result_error_field pg_result_seek pg_result_status pg_select pg_send_execute pg_send_prepare pg_send_query pg_send_query_params pg_set_client_encoding pg_set_error_verbosity pg_trace pg_transaction_status pg_tty pg_unescape_bytea pg_untrace pg_update pg_version phpcredits phpinfo phpversion php_check_syntax php_get_tmpdir php_ini_scanned_files php_logo_guid php_sapi_name php_strip_whitespace php_uname pi png2wbmp popen pos posix_access posix_ctermid posix_getcwd posix_getegid posix_geteuid posix_getgid posix_getgrgid posix_getgrnam posix_getgroups posix_getlogin posix_getpgid posix_getpgrp posix_getpid posix_getppid posix_getpwnam posix_getpwuid posix_getrlimit posix_getsid posix_getuid posix_get_last_error posix_isatty posix_kill posix_mkfifo posix_mknod posix_setegid posix_seteuid posix_setgid posix_setpgid posix_setsid posix_setuid posix_strerror posix_times posix_ttyname posix_uname pow preg_grep preg_match preg_match_all preg_quote preg_replace preg_replace_callback preg_split prev print printer_abort printer_close printer_create_brush printer_create_dc printer_create_font printer_create_pen printer_delete_brush printer_delete_dc printer_delete_font printer_delete_pen printer_draw_bmp printer_draw_chord printer_draw_elipse printer_draw_line printer_draw_pie printer_draw_rectangle printer_draw_roundrect printer_draw_text printer_end_doc printer_end_page printer_get_option printer_list printer_logical_fontheight printer_open printer_select_brush printer_select_font printer_select_pen printer_set_option printer_start_doc printer_start_page printer_write printf print_r proc_close proc_get_status proc_nice proc_open proc_terminate property_exists pspell_add_to_personal pspell_add_to_session pspell_check pspell_clear_session pspell_config_create pspell_config_data_dir pspell_config_dict_dir pspell_config_ignore pspell_config_mode pspell_config_personal pspell_config_repl pspell_config_runtogether pspell_config_save_repl pspell_new pspell_new_config pspell_new_personal pspell_save_wordlist pspell_store_replacement pspell_suggest ps_add_bookmark ps_add_launchlink ps_add_locallink ps_add_note ps_add_pdflink ps_add_weblink ps_arc ps_arcn ps_begin_page ps_begin_pattern ps_begin_template ps_circle ps_clip ps_close ps_closepath ps_closepath_stroke ps_close_image ps_continue_text ps_curveto ps_delete ps_end_page ps_end_pattern ps_end_template ps_fill ps_fill_stroke ps_findfont ps_get_buffer ps_get_parameter ps_get_value ps_hyphenate ps_lineto ps_makespotcolor ps_moveto! ps_new ps_open_file ps_open_image ps_open_image_file ps_place_image ps_rect ps_restore ps_rotate ps_save ps_scale ps_setcolor ps_setdash ps_setflat ps_setfont ps_setgray ps_setlinecap ps_setlinejoin ps_setlinewidth ps_setmiterlimit ps_setpolydash ps_set_border_color ps_set_border_dash ps_set_border_style ps_set_info ps_set_parameter ps_set_text_pos ps_set_value ps_shading ps_shading_pattern ps_shfill ps_show ps_show_boxed ps_show_xy ps_stringwidth ps_string_geometry ps_stroke ps_symbol ps_symbol_name ps_symbol_width ps_translate putenv px_close px_create_fp px_date2string px_delete px_delete_record px_get_field px_get_info px_get_parameter px_get_record px_get_schema px_get_value px_insert_record px_new px_numfields px_numrecords px_open_fp px_put_record px_retrieve_record px_set_blob_file px_set_parameter px_set_tablename px_set_targetencoding px_set_value px_timestamp2string px_update_record qdom_error qdom_tree quoted_printable_decode quotemeta rad2deg radius_acct_open radius_add_server radius_auth_open radius_close radius_config radius_create_request radius_cvt_addr radius_cvt_int radius_cvt_string radius_demangle radius_demangle_mppe_key radius_get_attr radius_get_vendor_attr radius_put_addr radius_put_attr radius_put_int radius_put_string radius_put_vendor_addr radius_put_vendor_attr radius_put_vendor_int radius_put_vendor_string radius_request_authenticator radius_send_request radius_server_secret radius_strerror rand range rar_close rar_entry_get rar_extract rar_getattr rar_getcrc rar_getfiletime rar_gethostos rar_getmethod rar_getname rar_getpackedsize rar_getunpackedsize rar_getversion rar_list rar_open rawurldecode rawurlencode readdir readfile readgzfile readline readline_add_history readline_callback_handler_install readline_callback_handler_remove readline_callback_read_char readline_clear_history readline_completion_function readline_info readline_list_history readline_on_new_line readline_read_history readline_redisplay readline_write_history readlink read_exif_data realpath recode recode_file recode_string recursivedirectoryiterator_getchildren recursivedirectoryiterator_haschildren recursivedirectoryiterator_key recursivedirectoryiterator_next recursivedirectoryiterator_rewind recursiveiteratoriterator_current recursiveiteratoriterator_getdepth recursiveiteratoriterator_getsubiterator recursiveiteratoriterator_key recursiveiteratoriterator_next recursiveiteratoriterator_rewind recursiveiteratoriterator_valid register_shutdown_function register_tick_function rename rename_function require require_once reset restore_error_handler restore_exception_handler restore_include_path return rewind rewinddir rmdir round rpm_close rpm_get_tag rpm_is_valid rpm_open rpm_version rsort rtrim runkit_class_adopt runkit_class_emancipate runkit_constant_add runkit_constant_redefine runkit_constant_remove runkit_function_add runkit_function_copy runkit_function_redefine runkit_function_remove runkit_function_rename runkit_import! runkit_lint runkit_lint_file runkit_method_add runkit_method_copy runkit_method_redefine runkit_method_remove runkit_method_rename runkit_return_value_used runkit_sandbox_output_handler runkit_superglobals satellite_caught_exception satellite_exception_id satellite_exception_value satellite_get_repository_id satellite_load_idl satellite_object_to_string scandir sdo_das_changesummary_beginlogging sdo_das_changesummary_endlogging sdo_das_changesummary_getchangeddataobjects sdo_das_changesummary_getchangetype sdo_das_changesummary_getoldcontainer sdo_das_changesummary_getoldvalues sdo_das_changesummary_islogging sdo_das_datafactory_addpropertytotype sdo_das_datafactory_addtype sdo_das_datafactory_getdatafactory sdo_das_dataobject_getchangesummary sdo_das_relational_applychanges sdo_das_relational_construct sdo_das_relational_createrootdataobject sdo_das_relational_executepreparedquery sdo_das_relational_executequery sdo_das_setting_getlistindex sdo_das_setting_getpropertyindex sdo_das_setting_getpropertyname sdo_das_setting_getvalue sdo_das_setting_isset sdo_das_xml_addtypes sdo_das_xml_create sdo_das_xml_createdataobject sdo_das_xml_createdocument sdo_das_xml_document_getrootdataobject sdo_das_xml_document_getrootelementname sdo_das_xml_document_getrootelementuri sdo_das_xml_document_setencoding sdo_das_xml_document_setxmldeclaration sdo_das_xml_document_setxmlversion sdo_das_xml_loadfile sdo_das_xml_loadstring sdo_das_xml_savefile sdo_das_xml_savestring sdo_datafactory_create sdo_dataobject_clear sdo_dataobject_createdataobject sdo_dataobject_getcontainer sdo_dataobject_getsequence sdo_dataobject_gettypename sdo_dataobject_gettypenamespaceuri sdo_exception_getcause sdo_list_insert sdo_model_property_getcontainingtype sdo_model_property_getdefault sdo_model_property_getname sdo_model_property_gettype sdo_model_property_iscontainment sdo_model_property_ismany sdo_model_reflectiondataobject_construct sdo_model_reflectiondataobject_export sdo_model_reflectiondataobject_getcontainmentprope sdo_model_reflectiondataobject_getinstanceproperti sdo_model_reflectiondataobject_gettype sdo_model_type_getbasetype sdo_model_type_getname sdo_model_type_getnamespaceuri sdo_model_type_getproperties sdo_model_type_getproperty sdo_model_type_isabstracttype sdo_model_type_isdatatype sdo_model_type_isinstance sdo_model_type_isopentype sdo_model_type_issequencedtype sdo_sequence_getproperty sdo_sequence_insert sdo_sequence_move sem_acquire sem_get sem_release sem_remove serialize sesam_affected_rows sesam_commit sesam_connect sesam_diagnostic sesam_disconnect sesam_errormsg sesam_execimm sesam_fetch_array sesam_fetch_result sesam_fetch_row sesam_field_array sesam_field_name sesam_free_result sesam_num_fields sesam_query sesam_rollback sesam_seek_row sesam_settransaction session_cache_expire session_cache_limiter session_commit session_decode session_destroy session_encode session_get_cookie_params session_id session_is_registered session_module_name session_name session_pgsql_add_error session_pgsql_get_error session_pgsql_get_field session_pgsql_reset session_pgsql_set_field session_pgsql_status session_regenerate_id session_register session_save_path session_set_cookie_params session_set_save_handler session_start session_unregister session_unset session_write_close setcookie setlocale setrawcookie settype set_error_handler set_exception_handler set_file_buffer set_include_path set_magic_quotes_runtime set_time_limit sha1 sha1_file shell_exec shmop_close shmop_delete shmop_open shmop_read shmop_size shmop_write shm_attach shm_detach shm_get_var shm_put_var shm_remove shm_remove_var show_source shuffle similar_text simplexmliterator_current simplexmliterator_getchildren simplexmliterator_haschildren simplexmliterator_key simplexmliterator_next simplexmliterator_rewind simplexmliterator_valid simplexml_element_asxml simplexml_element_attributes simplexml_element_children simplexml_element_xpath simplexml_import!_dom simplexml_load_file simplexml_load_string sin sinh sizeof sleep snmpget snmpgetnext snmprealwalk snmpset snmpwalk snmpwalkoid snmp_get_quick_print snmp_get_valueretrieval! snmp_read_mib snmp_set_enum_print snmp_set_oid_numeric_print snmp_set_quick_print snmp_set_valueretrieval! soap_soapclient_call soap_soapclient_construct soap_soapclient_dorequest soap_soapclient_getfunctions soap_soapclient_getlastrequest soap_soapclient_getlastrequestheaders soap_soapclient_getlastresponse soap_soapclient_getlastresponseheaders soap_soapclient_gettypes soap_soapclient_setcookie soap_soapclient_soapcall soap_soapfault_construct soap_soapheader_construct soap_soapparam_construct soap_soapserver_addfunction soap_soapserver_construct soap_soapserver_fault soap_soapserver_getfunctions soap_soapserver_handle soap_soapserver_setclass soap_soapserver_setpersistence soap_soapvar_construct socket_accept socket_bind socket_clear_error socket_close socket_connect socket_create socket_create_listen socket_create_pair socket_getpeername socket_getsockname socket_get_option socket_get_status socket_last_error socket_listen socket_read socket_recv socket_recvfrom socket_select socket_send socket_sendto socket_set_block socket_set_blocking socket_set_nonblock socket_set_option socket_set_timeout socket_shutdown socket_strerror socket_write sort soundex split spliti spl_classes sprintf sqlite_array_query sqlite_busy_timeout sqlite_changes sqlite_close sqlite_column sqlite_create_aggregate sqlite_create_function sqlite_current sqlite_error_string sqlite_escape_string sqlite_exec sqlite_factory sqlite_fetch_all sqlite_fetch_array sqlite_fetch_column_types sqlite_fetch_object sqlite_fetch_single sqlite_fetch_string sqlite_field_name sqlite_has_more sqlite_has_prev sqlite_key sqlite_last_error sqlite_last_insert_rowid sqlite_libencoding sqlite_libversion sqlite_next sqlite_num_fields sqlite_num_rows sqlite_open sqlite_popen sqlite_prev sqlite_query sqlite_rewind sqlite_seek sqlite_single_query sqlite_udf_decode_binary sqlite_udf_encode_binary sqlite_unbuffered_query sqlite_valid sql_regcase sqrt srand sscanf ssh2_auth_hostbased_file ssh2_auth_none ssh2_auth_password ssh2_auth_pubkey_file ssh2_connect ssh2_exec ssh2_fetch_stream ssh2_fingerprint ssh2_methods_negotiated ssh2_publickey_add ssh2_publickey_init ssh2_publickey_list ssh2_publickey_remove ssh2_scp_recv ssh2_scp_send ssh2_sftp ssh2_sftp_lstat ssh2_sftp_mkdir ssh2_sftp_readlink ssh2_sftp_realpath ssh2_sftp_rename ssh2_sftp_rmdir ssh2_sftp_stat ssh2_sftp_symlink ssh2_sftp_unlink ssh2_shell ssh2_tunnel stat stats_absolute_deviation stats_cdf_beta stats_cdf_binomial stats_cdf_cauchy stats_cdf_chisquare stats_cdf_exponential stats_cdf_f stats_cdf_gamma stats_cdf_laplace stats_cdf_logistic stats_cdf_negative_binomial stats_cdf_noncentral_chisquare stats_cdf_noncentral_f stats_cdf_poisson stats_cdf_t stats_cdf_uniform stats_cdf_weibull stats_covariance stats_dens_beta stats_dens_cauchy stats_dens_chisquare stats_dens_exponential stats_dens_f stats_dens_gamma stats_dens_laplace stats_dens_logistic stats_dens_negative_binomial stats_dens_normal stats_dens_pmf_binomial stats_dens_pmf_hypergeometric stats_dens_pmf_poisson stats_dens_t stats_dens_weibull stats_den_uniform stats_harmonic_mean stats_kurtosis stats_rand_gen_beta stats_rand_gen_chisquare stats_rand_gen_exponential stats_rand_gen_f stats_rand_gen_funiform stats_rand_gen_gamma stats_rand_gen_ibinomial stats_rand_gen_ibinomial_negative stats_rand_gen_int stats_rand_gen_ipoisson stats_rand_gen_iuniform stats_rand_gen_noncenral_chisquare stats_rand_gen_noncentral_f stats_rand_gen_noncentral_t stats_rand_gen_normal stats_rand_gen_t stats_rand_get_seeds stats_rand_phrase_to_seeds stats_rand_ranf stats_rand_setall stats_skew stats_standard_deviation stats_stat_binomial_coef stats_stat_correlation stats_stat_gennch stats_stat_independent_t stats_stat_innerproduct stats_stat_noncentral_t stats_stat_paired_t stats_stat_percentile stats_stat_powersum stats_variance strcasecmp strchr strcmp strcoll strcspn stream_bucket_append stream_bucket_make_writeable stream_bucket_new stream_bucket_prepend stream_context_create stream_context_get_default stream_context_get_options stream_context_set_option stream_context_set_params stream_copy_to_stream stream_filter_append stream_filter_prepend stream_filter_register stream_filter_remove stream_get_contents stream_get_filters stream_get_line stream_get_meta_data stream_get_transports stream_get_wrappers stream_register_wrapper stream_select stream_set_blocking stream_set_timeout stream_set_write_buffer stream_socket_accept stream_socket_client stream_socket_enable_crypto stream_socket_get_name stream_socket_pair stream_socket_recvfrom stream_socket_sendto stream_socket_server stream_wrapper_register stream_wrapper_restore stream_wrapper_unregister strftime stripcslashes stripos stripslashes strip_tags stristr strlen strnatcasecmp strnatcmp strncasecmp strncmp strpbrk strpos strptime strrchr strrev strripos strrpos strspn strstr strtok strtolower strtotime strtoupper strtr strval str_ireplace str_pad str_repeat str_replace str_rot13 str_shuffle str_split str_word_count substr substr_compare substr_count substr_replace swfaction swfbitmap swfbitmap.getheight swfbitmap.getwidth swfbutton swfbutton.addaction swfbutton.addasound swfbutton.addshape swfbutton.setaction swfbutton.setdown swfbutton.sethit swfbutton.setmenu swfbutton.setover swfbutton.setup swfdisplayitem.addaction swfdisplayitem.addcolor swfdisplayitem.endmask swfdisplayitem.getrot swfdisplayitem.getx swfdisplayitem.getxscale swfdisplayitem.getxskew swfdisplayitem.gety swfdisplayitem.getyscale swfdisplayitem.getyskew swfdisplayitem.move swfdisplayitem.moveto! swfdisplayitem.multcolor swfdisplayitem.remove swfdisplayitem.rotate swfdisplayitem.rotateto swfdisplayitem.scale swfdisplayitem.scaleto swfdisplayitem.setdepth swfdisplayitem.setmasklevel swfdisplayitem.setmatrix swfdisplayitem.setname swfdisplayitem.setratio swfdisplayitem.skewx swfdisplayitem.skewxto swfdisplayitem.skewy swfdisplayitem.skewyto swffill swffill.moveto! swffill.rotateto swffill.scaleto swffill.skewxto swffill.skewyto swffont swffont.getascent swffont.getdescent swffont.getleading swffont.getshape swffont.getutf8width swffont.getwidth swffontchar.addchars swffontchar.addutf8chars swfgradient swfgradient.addentry swfmorph swfmorph.getshape1 swfmorph.getshape2 swfmovie swfmovie.add swfmovie.addexport swfmovie.addfont swfmovie.import!char swfmovie.import!font swfmovie.labelframe swfmovie.nextframe swfmovie.output swfmovie.remove swfmovie.save swfmovie.savetofile swfmovie.setbackground swfmovie.setdimension swfmovie.setframes swfmovie.setrate swfmovie.startsound swfmovie.stopsound swfmovie.streammp3 swfmovie.writeexports swfprebuiltclip swfshape swfshape.addfill swfshape.drawarc swfshape.drawcircle swfshape.drawcubic swfshape.drawcubicto swfshape.drawcurve swfshape.drawcurveto swfshape.drawglyph swfshape.drawline swfshape.drawlineto swfshape.movepen swfshape.movepento swfshape.setleftfill swfshape.setline swfshape.setrightfill swfsound swfsoundinstance.loopcount swfsoundinstance.loopinpoint swfsoundinstance.loopoutpoint swfsoundinstance.nomultiple swfsprite swfsprite.add swfsprite.labelframe swfsprite.nextframe swfsprite.remove swfsprite.setframes swfsprite.startsound swfsprite.stopsound swftext swftext.addstring swftext.addutf8string swftext.getascent swftext.getdescent swftext.getleading swftext.getutf8width swftext.getwidth swftext.moveto! swftext.setcolor swftext.setfont swftext.setheight swftext.setspacing swftextfield swftextfield.addchars swftextfield.addstring swftextfield.align swftextfield.setbounds swftextfield.setcolor swftextfield.setfont swftextfield.setheight swftextfield.setindentation swftextfield.setleftmargin swftextfield.setlinespacing swftextfield.setmargins swftextfield.setname swftextfield.setpadding swftextfield.setrightmargin swfvideostream swfvideostream.getnumframes swfvideostream.setdimension swf_actiongeturl swf_actiongotoframe swf_actiongotolabel swf_actionnextframe swf_actionplay swf_actionprevframe swf_actionsettarget swf_actionstop swf_actiontogglequality swf_actionwaitforframe swf_addbuttonrecord swf_addcolor swf_closefile swf_definebitmap swf_definefont swf_defineline swf_definepoly swf_definerect swf_definetext swf_endbutton swf_enddoaction swf_endshape swf_endsymbol swf_fontsize swf_fontslant swf_fonttracking swf_getbitmapinfo swf_getfontinfo swf_getframe swf_labelframe swf_lookat swf_modifyobject swf_mulcolor swf_nextid swf_oncondition swf_openfile swf_ortho swf_ortho2 swf_perspective swf_placeobject swf_polarview swf_popmatrix swf_posround swf_pushmatrix swf_removeobject swf_rotate swf_scale swf_setfont swf_setframe swf_shapearc swf_shapecurveto swf_shapecurveto3 swf_shapefillbitmapclip swf_shapefillbitmaptile swf_shapefilloff swf_shapefillsolid swf_shapelinesolid swf_shapelineto swf_shapemoveto! swf_showframe swf_startbutton swf_startdoaction swf_startshape swf_startsymbol swf_textwidth swf_translate swf_viewport sybase_affected_rows sybase_close sybase_connect sybase_data_seek sybase_deadlock_retry_count sybase_fetch_array sybase_fetch_assoc sybase_fetch_field sybase_fetch_object sybase_fetch_row sybase_field_seek sybase_free_result sybase_get_last_message sybase_min_client_severity sybase_min_error_severity sybase_min_message_severity sybase_min_server_severity sybase_num_fields sybase_num_rows sybase_pconnect sybase_query sybase_result sybase_select_db sybase_set_message_handler sybase_unbuffered_query symlink syslog system sys_getloadavg tan tanh tcpwrap_check tempnam textdomain tidynode_haschildren tidynode_hassiblings tidynode_isasp tidynode_iscomment tidynode_ishtml tidynode_isjste tidynode_isphp tidynode_istext tidy_access_count tidy_clean_repair tidy_config_count tidy_construct tidy_diagnose tidy_error_count tidy_getopt tidy_get_body tidy_get_config tidy_get_error_buffer tidy_get_head tidy_get_html tidy_get_html_ver tidy_get_opt_doc tidy_get_output tidy_get_release tidy_get_root tidy_get_status tidy_is_xhtml tidy_is_xml tidy_load_config tidy_node_get_attr tidy_node_get_nodes tidy_node_next tidy_node_prev tidy_parse_file tidy_parse_string tidy_repair_file tidy_repair_string tidy_reset_config tidy_save_config tidy_setopt tidy_set_encoding tidy_warning_count time time_nanosleep time_sleep_until tmpfile token_get_all token_name touch trigger_error trim uasort ucfirst ucwords udm_add_search_limit udm_alloc_agent udm_alloc_agent_array udm_api_version udm_cat_list udm_cat_path udm_check_charset udm_check_stored udm_clear_search_limits udm_close_stored udm_crc32 udm_errno udm_error udm_find udm_free_agent udm_free_ispell_data udm_free_res udm_get_doc_count udm_get_res_field udm_get_res_param udm_hash32 udm_load_ispell_data udm_open_stored udm_set_agent_param uksort umask unicode_encode unicode_semantics uniqid unixtojd unlink unpack unregister_tick_function unserialize unset urldecode urlencode user_error use_soap_error_handler usleep usort utf8_decode utf8_encode variant variant_abs variant_add variant_and variant_cast variant_cat variant_cmp variant_date_from_timestamp variant_date_to_timestamp variant_div variant_eqv variant_fix variant_get_type variant_idiv variant_imp variant_int variant_mod variant_mul variant_neg variant_not variant_or variant_pow variant_round variant_set variant_set_type variant_sub variant_xor var_dump var_export version_compare vfprintf virtual vpopmail_add_alias_domain vpopmail_add_alias_domain_ex vpopmail_add_domain vpopmail_add_domain_ex vpopmail_add_user vpopmail_alias_add vpopmail_alias_del vpopmail_alias_del_domain vpopmail_alias_get vpopmail_alias_get_all vpopmail_auth_user vpopmail_del_domain vpopmail_del_domain_ex vpopmail_del_user vpopmail_error vpopmail_passwd vpopmail_set_user_quota vprintf vsprintf w32api_deftype w32api_init_dtype w32api_invoke_function w32api_register_function w32api_set_call_method wddx_add_vars wddx_deserialize wddx_packet_end wddx_packet_start wddx_serialize_value wddx_serialize_vars wddx_unserialize win32_create_service win32_delete_service win32_get_last_control_message win32_ps_list_procs win32_ps_stat_mem win32_ps_stat_proc win32_query_service_status win32_set_service_status win32_start_service win32_start_service_ctrl_dispatcher win32_stop_service wordwrap xattr_get xattr_list xattr_remove xattr_set xattr_supported xdiff_file_diff xdiff_file_diff_binary xdiff_file_merge3 xdiff_file_patch xdiff_file_patch_binary xdiff_string_diff xdiff_string_diff_binary xdiff_string_merge3 xdiff_string_patch xdiff_string_patch_binary xmlreader_close xmlreader_expand xmlreader_getattribute xmlreader_getattributeno xmlreader_getattributens xmlreader_getparserproperty xmlreader_isvalid xmlreader_lookupnamespace xmlreader_moveto!attribute xmlreader_moveto!attributeno xmlreader_moveto!attributens xmlreader_moveto!element xmlreader_moveto!firstattribute xmlreader_moveto!nextattribute xmlreader_next xmlreader_open xmlreader_read xmlreader_setparserproperty xmlreader_setrelaxngschema xmlreader_setrelaxngschemasource xmlreader_xml xmlrpc_decode xmlrpc_decode_request xmlrpc_encode xmlrpc_encode_request xmlrpc_get_type xmlrpc_is_fault xmlrpc_parse_method_descriptions xmlrpc_server_add_introspection_data xmlrpc_server_call_method xmlrpc_server_create xmlrpc_server_destroy xmlrpc_server_register_introspection_callback xmlrpc_server_register_method xmlrpc_set_type xmlwriter_end_attribute xmlwriter_end_cdata xmlwriter_end_comment xmlwriter_end_document xmlwriter_end_dtd xmlwriter_end_dtd_attlist xmlwriter_end_dtd_element xmlwriter_end_dtd_entity xmlwriter_end_element xmlwriter_end_pi xmlwriter_flush xmlwriter_full_end_element xmlwriter_open_memory xmlwriter_open_uri xmlwriter_output_memory xmlwriter_set_indent xmlwriter_set_indent_string xmlwriter_start_attribute xmlwriter_start_attribute_ns xmlwriter_start_cdata xmlwriter_start_comment xmlwriter_start_document xmlwriter_start_dtd xmlwriter_start_dtd_attlist xmlwriter_start_dtd_element xmlwriter_start_dtd_entity xmlwriter_start_element xmlwriter_start_element_ns xmlwriter_start_pi xmlwriter_text xmlwriter_write_attribute xmlwriter_write_attribute_ns xmlwriter_write_cdata xmlwriter_write_comment xmlwriter_write_dtd xmlwriter_write_dtd_attlist xmlwriter_write_dtd_element xmlwriter_write_dtd_entity xmlwriter_write_element xmlwriter_write_element_ns xmlwriter_write_pi xmlwriter_write_raw xml_error_string xml_get_current_byte_index xml_get_current_column_number xml_get_current_line_number xml_get_error_code xml_parse xml_parser_create xml_parser_create_ns xml_parser_free xml_parser_get_option xml_parser_set_option xml_parse_into_struct xml_set_character_data_handler xml_set_default_handler xml_set_element_handler xml_set_end_namespace_decl_handler xml_set_external_entity_ref_handler xml_set_notation_decl_handler xml_set_object xml_set_processing_instruction_handler xml_set_start_namespace_decl_handler xml_set_unparsed_entity_decl_handler xpath_eval! xpath_eval!_expression! xpath_new_context xpath_register_ns xpath_register_ns_auto xptr_eval! xptr_new_context xslt_backend_info xslt_backend_name xslt_backend_version xslt_create xslt_errno xslt_error xslt_free xslt_getopt xslt_process xslt_setopt xslt_set_base xslt_set_encoding xslt_set_error_handler xslt_set_log xslt_set_object xslt_set_sax_handler xslt_set_sax_handlers xslt_set_scheme_handler xslt_set_scheme_handlers xsl_xsltprocessor_construct xsl_xsltprocessor_get_parameter xsl_xsltprocessor_has_exslt_support xsl_xsltprocessor_import!_stylesheet xsl_xsltprocessor_register_php_functions xsl_xsltprocessor_remove_parameter xsl_xsltprocessor_set_parameter xsl_xsltprocessor_transform_to_doc xsl_xsltprocessor_transform_to_uri xsl_xsltprocessor_transform_to_xml yaz_addinfo yaz_ccl_conf yaz_ccl_parse yaz_close yaz_connect yaz_database yaz_element yaz_errno yaz_error yaz_es yaz_es_result yaz_get_option yaz_hits yaz_itemorder yaz_present yaz_range yaz_record yaz_scan yaz_scan_result yaz_schema yaz_search yaz_set_option yaz_sort yaz_syntax yaz_wait yp_all yp_cat yp_errno yp_err_string yp_first yp_get_default_domain yp_master yp_match yp_next yp_order zend_logo_guid zend_version zip_close zip_entry_close zip_entry_compressedsize zip_entry_compressionmethod zip_entry_filesize zip_entry_name zip_entry_open zip_entry_read zip_open zip_read zlib_get_coding_type
Posted by 알 수 없는 사용자
,

최적화 기술

이제 병목 구간의 원인에 따라 어떠한 방법으로 스크립트의 실행 시간을 최적화할 수 있는지 알아보자.

  • 코드 최적화 : 이 방법은 잘못된 for() 또는 while() 루프와 같이 많은 연산이 이루어지는 부분을 최적화하는 것이다.
  • 출력 버퍼링 및 압축 : 만일 브라우저로 출력해야 하는 내용이 많아서 속도 저하가 생긴다면 이 방법을 사용한다.
  • 데이터베이스 최적화 : 속도 저하의 원인이 데이터베이스 쿼리 또는 테이터베이스 연결 및 함수 사용에 있다면 이 방법을 사용한다.
  • 캐싱 : 이 방법은 문제의 원인이 페이지를 생성하는 시간에 있으며 데이터베이스 쿼리를 최적화할 수 없을 때 사용된다. 캐시를 사용하는 또 다른 이유는 정적인 데이터의 빈번한 요청 때문이다.

코드 최적화

보통 코드 자체가 성능 문제의 원인이 되지는 않는다. 대부분의 최적화 문제는 데이터베이스 또는 데이터 입출력에서 발생한다.

문제의 원인이 함수나 특정 코드 때문이라는 것이 확실해 지기 전에는 PHP 코드를 최적화하면 안된다. 주어진 PHP 스크립트에서 실행 시간의 10%는 코드 실행에 사용되면 90%는 입출력과 데이터베이스 작업에 사용된다.

그러나 어떤 사이트나 애플리케이션을 느리게 만드는 대규모 연산을 하는 특별한 경우가 있다. 이럴 경우 코드를 최적화하는 방법은 다음과 같다.

  • 루프 점검
  • 가능하면 빠른 함수 사용
  • 데이터를 출력하는 최선의 방법 선택
  • 데이터를 입력하는 최선의 방법 선택
  • echo() 문을 적게 사용
  • 젠드 옵티마이저 사용

루프 검사

코드 최적화를 시작하는 좋은 방법은 반복적으로 실행하는 루프의 내부를 검사하는 것이다. 어떠한 연산이나 문자열 처리도 루프 외부에서 일어나지 않는지 확인한다.

만일 파일 입출력이 루프 내부에서 처리된다면 루프 외부에서는 입출력이 일어나지 않도록 한다. 파일 전체를 메모리에서 읽으면 루프 내부에서 블럭 열기, 읽기, 닫기 작업을 하는 것보다 빠르다. 파일의 일부분을 읽기 위해 루프를 사용한다면 전체 파일을 순차적으로 읽고 필요 없는 부분을 버리는 것이 효과적이다.

Import!

file() 함수는 텍스트 파일을 처리할 경우에 적합하다.

보다 빠른 함수의 사용

PHP에서 어떤 함수들은 보다 많은 연산을 필요로 한다. 이러한 함수들은 보다 간단한 함수로 대체될 수 있다.

  • ereg() 대신 strstr() 사용 : 만일 정규표현식을 사용하지 않는다면 ereg() 대신 더 빠른 strstr()를 사용한다.
  • ereg_replace() 대신 str_replace() 사용 : 위와 마찬가지로 문자열 치환에 정규표현식을 사용하지 않는다면 ereg_replace() 보다 속도가 바른 str_replace()를 사용한다.

만일 정규표현식을 사용해야 한다면 PHP의 ereg_*() 함수보다 속도가 빠른 PCRE(Perl compatible regular expression!s) 함수를 사용한다. 자세한 것은 7장을 참고하자.

데이터를 출력하는 최상의 방법을 선택

데이터를 브라우저로 출력하는 방법은 세 가지가 있다.

  • 직접 출력
  • echo()
  • print()
 직접 출력

 <?php
 echo("Echoing output\n");
 print("Printing output\n");
 ?>

만일 PHP 변수나 동적인 내용이 필요 없다면 직접 출력을 사용하는 것이 바람직하다. 이 방법은 PHP가 코드를 해석하지 않기 때문에 가장 빠르다.

데이터를 입력하는 최상의 방법 선택

데이터를 입력하는 방법은 세 가지가 있다.

  • readfile()
  • include()
  • require()

만일 파일에 PHP 코드가 포함되어 있지 않다면 readfile()을 사용한다. 이 방법은 파일을 인클루드하기 전에 데이터를 파싱하지 않으므로 좀더 빠르다. include()와 require()은 PHP 코드가 발견되면 실행한다. PHP 스크립트에서 HTML 헤더는 readfile()을 사용하는 것이 바람직하다.

echo 문 적게 사용하기

echo() 문은 실행에 시간이 걸리므로 적게 사용하고 긴 echo() 문이 가독성이 좋다. 예를 들면:

 echo("hello\n
       this is a test\n
       of the echo statement");

위의 코드가 아래 코드보다 빠르다:

 echo("hello\n");
 echo("this is a test\n");
 echo("of the echo statement");

젠드 옵티마이저

코드를 최적화하는 마지막 방법은 http://www.zend.org/에서 제공하는 무료 젠드 옵티마이저(Zend Optimizer)를 사용하는 것이다. 젠드 옵티마이저는 http://www.zend.com/store/products/zend-optimizer.php에서 구할 수 있다.

이것은 PHP를 위한 플러그인으로 여러 가지 기술을 통해 다양한 방법으로 코드를 최적화한다.

일반적으로 입출력을 많이 하는 스크립트는 젠드 옵티마이저를 사용해도 별 효과가 없고 대규모 연산을 하는 스크립트는 성능이 크게 향상된다.

출력 버퍼링과 압축

대부분의 페이지 생성 엔진은 브라우저에 동적 내용을 보내기 위해 출력 함수를 많이 사용한다. 이러한 스크립트는 변수를 가진 print() 문을 많이 사용하며 출력을 많이 하므로 성능에 문제가 된다. 따라서 동적으로 생성되는 내용이 많을수록 스크립트의 실행은 느려진다.

출력 버퍼링(Output buffering)은 스크립트의 입출력 시간을 감소시킨다. 이 기능은 PHP4.0.3 이상의 버전에서 제공되는 출력 버퍼링 함수를 이용해 입출력이 많은 프로그램에 적용할 수 있는 일반적인 기술이다.

출력 버퍼의 개념은 버퍼의 내용을 출력하기 전에 출력할 내용을 모두 메모리 버퍼에 저장하는 것이다. 이 방법은 다음과 같은 장점을 가지고 있다.

  • 입출력 작업이 줄어 성능이 크게 향상된다.
  • 브라우저로 보내기 전에 출력할 내용을 조작할 수 있다.
  • 입출력 작업이 순차적으로 빠르게 이루어진다.

이 방법은 단점은 스크립트가 종료될 때까지 클라이언트가 기다려야 한다는 것이다. 따라서 애플리케이션 설계방식이나 스크립트 실행 시간에 따라 사용자는 시스템에 문제가 있다고 판단하고 브라우저를 닫거나 무엇인가 잘못되었다는 결론을 내릴 수 있다.

출력 버퍼링 예제

다음은 PHP에서 출력 버퍼링 사용 방법을 보여주는 간단한 예제이다:

 <?php
 ob_start();

 echo("This is a test\n");
 echo("More content\n");

 ob_end_flush();
 ?>

ob_start() 함수는 출력 버퍼링을 시작한다. ob_start() 뒤에는 브라우저로 출력하는 모든 함수가 데이터를 데이터 버퍼로 보낸다.

버퍼의 내용은 ob_end_flush() 함수를 이용해 브라우저로 출력되는데, 다음과 같은 두가지 작업을 한다. 우선 사용 중인 출력 버퍼를 받고, 그 다음 버퍼의 내용을 브라우저로 출력한다.

Import!ant

위의 예제에서는 ob_end_flush() 함수가 필요하지 않는데, 그 이유는 PHP 인터프리터가 스크립트의 실행이 종료될 때 버퍼의 내용을 출력하기 때문이다. 그러나 코드의 신뢰성을 높이기 위해서는 이 함수를 사용하는 것이 좋다.

출력 버퍼링 함수

void ob_start([string output_callback])

이 함수는 출력을 만들어 내는 모든 함수들이 사용할 새로운 출력 버퍼를 시작한다. 선택사항으로 콜백 함수를 전달할 수도 있다. 콜백 함수가 전달되면 스크립트가 종료되거나 ob_end_flush()가 실행될 때 이 함수가 호출된다. 이 함수는 버퍼의 내용을 받고 이것을 바탕으로 한 작업 결과를 리턴한다.

예를 들어, 스크립트의 출력 결과에서 foo를 bar로 변경하는 검열(censorship) 콜백 함수를 사용하려면 다음과 같이 한다:

 <?php
 function censorship($buffer)
 {
  return str_replace('foo', 'bar', $buffer);
 }

 ob_start('censorship');

 echo("This is a foo test of our program\n");
 echo("I can't write foo!\n");

 ob_end_flush();
 ?>

위 스크립트의 실행 결과는 다음과 같다.

[image]

이것은 스크립트의 최종 출력을 처리해야 할 경우에 유용하다.

string ob_get_contents(void)

위의 함수는 사용 중인 출력 버퍼의 내용을 리턴한다. 만일 출력 버퍼가 시작되지 않았다면 false를 리턴한다.

string ob_get_length(void)

위의 함수는 사용 중인 출력 버퍼의 길이를 리턴한다. 만일 사용 중인 출력 버퍼가 없다면 false를 리턴한다.

void ob_end_flush(void)

위의 함수는 사용 중인 버퍼를 종료하고 그 내용을 브라우저로 출력하거나 사용 중인 버퍼에 우위를 갖는다(버프 스택 참조). 이 함수가 실행되면 버퍼는 버려지므로 이를 처리하려면 ob_end_flush()를 호출하기 전에 ob_get_contents()를 사용해야 한다.

버퍼 스택

PHP에서 사용하는 버퍼링 방식은 스택(stack)이다. 이것은 이미 ob_start()를 호출한 블럭 내부에서 ob_start()를 호출할 수 있다는 것을 의미한다. 두 번째 ob_start() 호출은 새로운 버퍼를 생성하고 ob_end_flush()가 실행되면 이 버퍼의 내용은 부모 버퍼로 전단된다. 두 번째 ob_end_flush()를 호출하면 버퍼의 내용은 브라우저로 출력된다.

이것은 페이지 생성 엔진에서 출력 버퍼링을 사용하고 함수나 모듈의 출력을 처리해야 할 경우에 유용하다.

PHP 출력 압축하기

PHP가 데이터를 브라우저로 출력할 때는 HTML 헤더(content type header)를 이용해 가공되지 않은 데이터(raw data)를 보낸다. 최근의 브라우저는 압축된 데이터도 지원하므로 서버에서 gzip으로 압축된 데이터를 브라우저로 보내면 브라우저는 이 데이터의 압축을 풀어 출력하게 된다.

이 방법을 이용하면 스크립트의 성능과 많은 내용을 만들어 내는 페이지 생성 엔진의 성능을 증가시킬 수 있다. 이 방식으로 테스트한 결과 실행 시간이 약 60% 정도 감소했다.

PHP에서는 ob_gzhandler() 콜백 함수를 사용할 수 있다. 만일 우리가 ob_gzhandler() 함수를 ob_start()로 보내면 ob_end_flush() 함수가 실행되었을 때 PHP는 다음 작업을 한다.

  • 버퍼의 내용을 ob_gzhandler() 함수로 전달한다.
  • ob_gzhandler() 함수는 브라우저가 보낸 헤더를 이용해 브라우저가 gzip 인코딩을 지원하는지 판단한다.
  • 만일 gzip 데이터를 사용할 수 있다면 버퍼의 내용을 압축하고 브라우저로 보낼 헤더가 만들어진다.
  • 압축된 데이터와 헤더를 브라우저로 전송한다.

출력할 내용을 압축하면 성능이 크게 개선되고 대역폭도 감소한다. 출력 버퍼를 압축하려면 다음과 같이 한다:

 ob_start('ob_gzhandler');

브라우저는 gzip으로 압축된 내용을 받는다. 또한 php.ini 파일에서 아래와 같이 설정하면 ob_gzhandler() 함수를 ob_start()의 디폴트 콜백 함수로 사용할 수 있다:

 output_handler = 'ob_gzhandler'

Import!ant

ob_gzhandler() 콜백 함수는 PHP4.0.5 이상에서만 사용할 수 있다. 이전 버전의 PHP는 ob_gzhandler() 함수에 매우 큰 메모리 누수 문제가 있다.

만일 압축된 내용을 전송하는 것에 문제가 있다면 vary HTTP 헤더를 사용한다. 또한 일부 브라우저는 POST 요청의 결과로 압축된 내용이 올 때 문제가 있는 것으로 알려져 있다.

데이터베이스 최적화

이 방법은 최적화 문제에서 가장 중요한 부분이다. 스크립트는 실행 시간의 대부분을 데이터베이스 작업에 사용하므로 몇 가지 방법을 통해 데이터베이스 작업의 성능을 개선하는 방법을 살펴보자.

여기서는 MySQL을 이용해 설명하지만 이 개념은 PostgreSQL, 오라클 등 다른 데이터베이스로도 확대될 수 있다.

쿼리 분석

일단 성능 저하의 문제가 쿼리에 있다는 것이 밝혀졌다면 각 쿼리에서 무엇이 문제인지를 알아내야 한다. 우선 불필요한 조인을 사용하지 않는지 확인하고 쿼리를 빠르게 만들 다른 방법이 있는지 확인해야 한다. 두 개의 큰 테이블을 조인하는 것보다 쿼리를 두 번하는 것이 빠르다.

쿼리 실행 방법

만일 제대로 만들어진 쿼리의 실행 시간이 매우 길다면 다음의 MySQL EXPLAIN 문을 이용해 MySQL이 쿼리를 어떻게 처리하는지 확인한다:

 EXPLAIN SELECT ... FROM ... WHERE ...

간단히 SELECT 문 앞에 EXPLAIN만을 추가하면 된다. MySQL은 쿼리를 실행하고 다음과 같은 처리 정보를 가진 테이블을 리턴한다.

  • table : 출력된 행에서 참조하는 테이블
  • type : 사용되는 조인 형식. 조인 형식에 대한 자세한 정보는 뒤에 나오는 조인 형식을 참고한다.
  • possible_keys : 쿼리를 수행하기 위해 MySQL이 사용할 수 있는 컬럼. 만일 비어있다면 관련된 색인이 없다는 것이다. 이 경우 WHERE 절을 분석해 적절한 색인을 추가하면 성능이 개선된다.
  • key : 쿼리를 수행하기 위해 MySQL이 선택한 색인. 만일 NULL이면 색인이 사용되지 않은 것이다. 만일 MySQL이 잘못된 색인을 선택한다면 USE INDEX/IGNORE INDEX를 이용해 강제로 색인을 지정할 수 있다.
  • key_len : MySQL이 사용하기로 결정한 키의 길이
  • ref : 테이블에서 행을 선택하기 위해 사용된 컬럼 또는 상수
  • rows : 테이블에서 행을 선택하기 위해 MySQL이 반드시 검사해야 하는 행의 수
  • Extra : MySQL이 쿼리를 실행하는 방식에 대한 추가 정보. 다음과 같은 정보가 사용된다.
    • Distinct : 조건에 맞는 첫 번째 행을 발견하면 더 이상 검색을 진행하지 않는다.
    • Not exits : MySQL은 쿼리에 LEFT JOIN 최적화를 할 수 있는데, LEFT JOIN 조건에 맞는 행의 조합을 찾아내면 더 이상 테이블의 행을 검사하지 않는다.
    • Using filesort : MySQL은 검색된 행을 정렬해서 가져오기 위해 추가적인 작업이 필요하다. 이 작업은 조인 형식에 따라 모든 행을 검사하고 WHERE 절에 해당하는 모든 행이 "정렬 키 + 포인터"를 저장함으로써 가능하다. 각 행을 순서대로 가져오기 전에 이 키가 먼저 정렬된다.
    • Using index : 실제 행을 검사하지 않고 테이블의 색인 트리에 있는 정보만을 사용하는 경우이다. 테이블에서 가져오는 모든 컬럼이 같은 색인의 일부분인 경우를 의미한다.
    • Using temporary : MySQL은 결과를 저장하기 위해 임시 테이블을 만들 필요가 있다. 이것은 하나의 테이블에서 서로 다른 컬럼에 사용된 GROUP BY의 결과 행을 ORDER BY로 정렬할 때 사용된다.

쿼리를 가능한 빠르게 만들려면 Using filesort와 Using temporary를 살펴본다. 만일 이러한 부분이 발견된다면 쿼리를 최적화할 필요가 있다.

조인 형식

아래는 조인(JOIN) 형식을 좋은 것부터 차례대로 나열한 것이다.

  • system : 테이블에 오직 하나의 행만을 가지는 경우이다. 시스템 조인은 일반적이 아니며(보통 테이블은 하나 이상의 행을 갖는다) 검사해야 할 행이 하나이므로 가장 빠르다.
  • eq_ref : 한 테이블의 행이 다른 테이블의 각 행과 조합을 이루는 경우. 이 형식은 시스템 조인을 제외하고 가장 좋은 조인 형식이다. 이것은 색인의 모든 부분이 조인에 참여하고 색인이 UNIQUE 또는 프라이머리 키인 경우이다.
  • ref : 다른 테이블의 행과 조합하기 위해 색인 값에 매치되는 모든 행이 읽혀진다. ref는 조인이 키의 가장 좌측 부분(leftmost prefix)만을 사용하거나 키가 UNIQUE 또는 PRIMARY KEY가 아닐 경우이다. 만일 비교에 사용되는 키의 행이 적다면 훌륭한 조인 형식이다.
  • range : 색인에서 행을 선택하기 위해 지정된 범우의 행만 검색한다. key 컬럼은 사용되는 색인을 나타낸다.
  • ALL : 다른 테이블의 행과 조합을 위해 테이블 전체를 스캔하는 경우이다. 이 방식은 다른 경우에 비해 좋지 않다. 적절한 색인을 추가해 ALL 형식을 피하고 컬럼이 상수 값을 통해 검색되도록 하는 것이 좋다.
  • index : 색인 트리만 스캔된다는 점을 빼면 ALL과 동일하다. 보통 색인 파일이 데이터 파일보다 작기 때문에 ALL 보다 빠르다.

EXPLAIN의 출력 테이블에 있는 rows 컬럼 값을 이용해 훌륭한 조인 형식인지를 알 수 있다. 이 컬럼은 쿼리를 수행하기 위해 얼마나 많은 행을 검색해야 하는지를 나타낸다.

MySQL 문서에 있는 다음 예는 EXPLAIN 명령의 결과를 이용해 어떻게 조인을 최적화하는지 보여준다. 우리는 여기서 몇 개의 필드를 가진 가상의 데이터베이스를 이용하므로 데이터베이스, 테이블, 필드의 이름은 무시해도 된다. 이 예제의 목적은 EXPLAIN의 결과를 어떻게 분석하는지를 아는 것이다.

SELECT 구문을 조사하기 위해 EXPLAIN을 사용한다:

 EXPLAIN SELECT tt.TicketNumber, tt.TimeIn,
 tt.ProjectReference, tt.ExtimatedShipDate,
 tt.ActualShipDate, tt.ClientID,
 tt.ServiceCodes, tt.RepetitiveID,
 tt.CurrentPRocess, tt.currentDBPerson,
 tt.RecodeVolume, tt.DPPprinted, et.COUNTRY,
 et_1.COUNTRY, do.CUSTNAME,
 FROM tt, et,et AS et_1
 WHERE
  tt.SubmitTime IS NULL
   AND tt.ACtualIPC = et.EMPLOYID
   AND tt.AsignedPC = et_1.EMPLOYID
   AND tt.ClientID = do.CUSTOMER;

비교하려는 컬럼이 다음과 같이 정의되었다고 가정해 보자.

테이블

컬럼

컬럼 타입

tt

ActualPC

CHAR(10)

tt

AssignedPC

CHAR(10)

tt

ClientID

CHAR(10)

tt

EMPLOYID

CHAR(10)

tt

CUSTNMBR

CHAR(10)

그리고 각 테이블은 다음과 같은 색인을 가지고 있다.

테이블

색인

tt

ActualPC

tt

AssignedPC

tt

ClientID

tt

EMPLOYID (primary key)

tt

CUSTNMBR (primary key)

tt.ActualPC 값은 골고루 분포되어 있지 않다.

아무런 최적화도 수행하지 않았을 경우 EXPLAIN 문의 실행 결과는 다음과 같다.

Table

Type

Possible Keys

Key

Key Length

Ref

Rows

et

ALL

PRIMARY

NULL

NULL

NULL

74

do

ALL

PRIMARY

NULL

NULL

NULL

2135

et_1

ALL

PRIMARY

NULL

NULL

NULL

74

tt

ALL

AssignedPC, ClientID, ActualPC

NULL

NULL

NULL

3872

보는 바와 같이 모든 테이블에 ALL이 사용된다. 이것은 MySQL이 조인을 위해 모든 테이블에 대해 전체를 스캔하는 것을 의미하며 개선이 필요한 쿼리이다. 이 예에서는 45,268,558,720 행(74*2135*74*3872)을 검사해야 하는데, 이것은 상당한 시간이 걸리게 된다.

한가지 문제점은 컬럼 형식이 다르게 정의되어 있으면 MySQL이 컬럼의 색인을 효과적으로 이용할 수 없다는 것이다. 이 경우, 길이가 다르게 선언되지만 않는다면 VARCHAR와 CHAR는 같다. 이 예제에서 tt.ActualPC는 CHAR(10)이고 et.EMPLOYID는 CHAR(15)이므로 길이에서 차이가 난다. 따라서 ActualPC의 길이를 10에서 15로 변경할 필요가 있다:

 mysql> ALTER TABLE tt MODIFY ActualPC VARCHAR(15);

이제 tt.ActualPC와 et.EMPLOYID는 둘 다 VARCHAR(15)가 되었다. EXPLAIN을 다시 한 번 실행해 보자.

Table

Type

Possible Keys

Key

Key Length

Ref

Rows

tt

ALL

AssignedPC, ClientID, ActualPC

NULL

NULL

NULL

3872

do

ALL

PRIMARY

NULL

NULL

NULL

2135

et_1

ALL

PRIMARY

NULL

NULL

NULL

74

et

eq_ref

PRIMARY

PRIMARY

15

tt.ActualPC

1

검사해야 하는 행의 수가 74만큼 줄어들었다. 두 번째는 tt.AssignedPC = et_1.EPLOYID와 tt.ClientID = do.CUSTNBR의 비교 부분에서 컬럼 길이가 맞지 않는 문제를 해결해야 한다:

 mysql> ALTER TABLE tt MODIFY AssignedPC VARHCAR(15), MODIFY ClientID VARCHAR(15);

다시 EXPLAIN을 실행한 결과는 다음과 같다.

Table

Type

Possible Keys

Key

Key Length

Ref

Rows

et

ALL

PRIMARY

NULL

NULL

NULL

74

tt

ref

AssignedPC, ClientID, ActualPC

ActualPC

15

et.EMPLOYID

52

et_1

eq_ref

PRIMARY

PRIMARY

15

tt.AssignedPC

1

do

eq_ref

PRIMARY

PRIMARY

15

tt.ClientID

1

이 쿼리는 매우 바람직하게 최적화되었다. 대부분의 쿼리에 있어 이러한 방법이 적용되므로 EXPLAIN을 이용해 색인을 생성하고 길이가 다른 문제를 해결할 수 있다. 데이터 모델을 설계할 때 길이가 다른 키에 대해 MySQL이 어떻게 동작하는지를 염두에 둔다면 쿼리의 실행 속도가 느려졌을 때 테이블을 변경해야 하는 일은 발생하지 않을 것이다.

테이블 최적화

우리가 테이블에서 레코드를 삭제하면 MySQL은 나중에 INSERT 작업에서 데이터를 재사용하도록 링크 목록으로 유지한다. 만일 DELETE 작업을 많이 한다거나 가변 길이를 가진 행에 큰 변화가 생겼다면 우리는 이 테이블의 분산된 데이터를 모으는 작업(defragment)을 해야 한다. 이 작업은 OPTIMIZE TABLE 문을 이용한다:

 OPTIMIZE TABLE tbl_name [, tbl_name]

OPTIMIZE TABLE은 다음과 같은 작업을 한다.

  • 삭제되거나 분산된 행을 수정한다.
  • 정령되지 않은 모든 색인 페이지를 정렬한다.
  • 테이블 통계 정보를 업데이트한다.

Import!ant

OPTIMIZE 명령을 실행하는 동안에는 테이블이 잠기므로 이용자가 많은 시간에는 실행하지 않도록 한다.

데이터 모델 최적화

데이터베이스 쿼리를 최적화하는 가장 좋은 단계는 데이터베이스 모델을 설계하는 단계이다. 다음 팁을 염두해 두고 데이터베이스를 설계하면 성능이 향상될 거이다.

  • 가장 효율적인 데이터 형식을 사용한다. MySQL은 다양한 데이터 타입을 지원한다. 작은 데이터형을 사용하면 쿼리 속도가 빨라진다. 가능한 작은 정수형을 사용한다. 예를 들어 MEDIUMINT는 INT보다 좋다. 사용하기에 적당한 숫자형은 다음과 같다.

컬럼 형식

필요한 공간

TINYINT

1 바이트

SMALLINT

2 바이트

MEDIUMINT

3 바이트

INT

4 바이트

INTEGER

4 바이트

BIGINT

8 바이트

FLOAT(X)

X <= 24이면 4 바이트, 25 <= X <= 53이면 8 바이트

FLOAT

4 바이트

DOUBLE

8 바이트

DOUBLE PRECISION

8 바이트

REAL

8 바이트

DECIMAL(M,D)

D>0이면 M+2 바이트, D=0 이면 M+1 바이트 (M

NUMERIC(M,D)

D>0이면 M+2 바이트, D=0 이면 M+1 바이트 (M

  • 가능하면 컬럼을 NOT NULL로 선언한다. 속도를 빠르게 하고 컬럼 당 1비트를 아낄 수 있다.
  • 가능하면 TEXT, BLOB, VARCHAR 컬럼을 피한다. 만일 불가피하게 가변폭 컬럼을 사용해야 한다면 가능하면 많이 사용한다. 한 테이블에 가변폭 컬럼이 존재한다면 고정폭 컬럼이 이미 쓸모없게 된다. 또한 고정폭 컬럼 사이에 블럽(blob) 컬럼이 끼어 있다면 이 블럽 컬럼을 별도의 테이블로 분리하고 고정폭 컬럼을 가진 테이블을 참조하도록 한다.
  • 테이블의 프라이머리 키는 가능하면 작아야 한다. 이 방법은 각 해의 식별자로 효과적으로 처리할 수 있게 만든다.
  • 색인의 효율을 증가시킨다. 만일 우리가 어떤 컬럼의 앞자리 X번째 문자가 고유하다는 것을 안다면 이 부분만을 이용하는 색인을 만들도록 한다. 이것이 좀더 효율적이다.
  • 테이블의 모든 컬럼을 이용해 색인을 만들지 않는다. 색인은 SELECT 문을 빠르게 해주지만 UPDATE, INSERT, DELETE 작업의 속도는 느려진다. 필요한 색인만을 생성한다.

색인 사용

색인은 데이터베이스 엔진이 쿼리를 실행할 때 사용하는 기본적인 해결 방법이다. 테이블 전체를 검색하는 것보다 색인을 검색하는 것이 몇 배 이상 빠르다.

Import!ant

테이블에 하나 이상의 색인을 추가하면 쿼리의 90%를 최적화할 수 있다.

많은 데이터베이스 설계자들이 색인에 신경을 쓰지 않고 속도 문제가 생겼을 경우에 색인을 만든다. 물론 이 방법도 문제를 해결할 수 있지만 좋은 방법은 아니다. 제대로 설계된 데이터베이스는 반드시 색인을 염두에 두고 만들어져야 한다. 가장 좋은 색인은 CREATE TABLE 문에서 만들어 져서 많은 쿼리에 사용된 것이다. 그러나 불필요하게 만든 쿼리는 업데이트 속도를 저하시킨다.

MySQL은 자동적으로 색인을 사용한다. 주어진 쿼리에서 어떤 색인이 사용되었는지 확인하려면 앞서 설명된 EXPLAIN 명령을 사용하면 된다.

SELECT 쿼리 최적화

SELECT 쿼리를 최적화하려면 색인을 추가할 수 있는지 확인한다. EXPLAIN을 사용해 색인이 사용되고 있는지를 확인한다.

INSERT 쿼리 최적화

테이블에 레코드를 삽입하는 작업은 다음과 같은 단계를 거친다.

  • 연결
  • 서버로 쿼리 전송
  • 쿼리 분석
  • 레코드 삽입
  • 색인 삽입(각 색인마다 한 번씩)
  • 연결 종료

INSERT 대신 INSERT DELAYED를 사용하면 보다 빠른 속도를 얻을 수 있다. 서바상의 작업 종료와는 무관하게 클라이언트는 insert 명령이 성공했다는 확인 메시지를 받는다. MySQL 서버는 클라이언트에게 실행이 완료되기를 기다리라는 메시지를 보내지 않고 insert 작업을 나중에 처리한다.

파일에서 데이터를 로딩할 때 LOAD DATA INFILE을 사용하면 INSERT 문을 여러 번 사용하는 것 보다 20배 정도 빠르다(ORACLE/MSSQL에서는 BCP라고 부른다).

쉼표로 구분된 파일을 데이터베이스로 로드하려면 다음 명령을 사용한다:

 LOAD DATA INFILE data.txt INTO TABLE foo FIELDS TERMINATED BY ',';

LOAD DATA INFILE은 다음과 같은 형식이다:

 LOAD DATA [LOW_PRIORTY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'
     [REPLACE | IGNORE]
     INTO TABLE tbl_name
     [FIELDS
          [TERMINATED BY '\t']
          [[OPTIONALLY] ENCLOSED BY '']
          [ESCAPED BY '\\']
     ]
     [LINES TERMINATED BY '\n']
     [IGNORE number LINES]
     [(col_name,...)]

LOAD DATA INFILE을 이용해 데이터를 MySQL 테이블에 넣은 자세한 방법은 MySQL 메뉴얼을 참고하면 된다.

insert 작업에 앞서 테이블을 잠그면 작업속도가 빨라진다:

 LOCK TABLES a WRITE;
 INSERT ....
 INSERT ....
 UNLOCK TABLES;

UPDATE 쿼리 최적화

UPDATE 문은 SELECT 문을 실행한 뒤에 쓰기 작업을 하는 것으로 생각할 수 있다. 따라서 UPDATE xx FROM yy WHERE zz 쿼리를 최적화하는 것은 쓰기 작업은 항상 존재하므로 SELECT xx FROM yy WHERE zz 쿼리를 최적화하는 것과 같다. 따라서 UPDATE 쿼리의 최적화는 SELECT 쿼리의 최적화와 동일하다.

DELETE 쿼리 최적화

레코드를 삭제하는 시간은 색인의 수에 정확히 비례한다. 이것는 MySQL이 레코드를 테이블과 각각의 색인에서 지워야 하기 때문이다. 테이블의 전체 레코드를 삭제하려면 TRUNCATE TABLE tb_name을 사용하는 것이 DELETE from tb_name을 사용하는 것보다 빠르다. TRUNCATE TABLE은 각 행의 색인과 데이터를 지울 필요 없이 전체 테이블과 색인을 지운다.

연결 최적화

테이터베이스 쿼리를 실행할 때 시간을 소요하는 마지막 원인은 바로 데이터베이스 연결 과정이다. 몇몇 애플리케이션에서 우리는 매번 쿼리를 할 때마다 데이터베이스 연결을 하고, 사용하고, 종료하는 것을 볼 수 있다. 그러나 데이터베이스에 일단 연결이 되면 여러 개의 쿼리를 실행할 수 있으므로 이것은 비효율적인다. PHP를 이용하면 쿼리를 실행할 때마다 데이터베이스에 연결하지 않고 지속적인 연결을 할 수 있다.

지속적 연결

PHP에서 MySQL 데이터베이스로 지속적 연결을 하려면 다음 함수를 사용한다:

 int mysql_pconnect([string hostname [:port] [:/path/to/socket/] [, string username] [, string password]])

접속을 할 때 이 함수는 우선 동일한 호스트 명, 사용자 아이디, 암호를 사용한 지속적 연결이 있는지 찾는다. 만일 발견이 된다면 새로 연결하지 않고 기존의 연결 식별자를 리턴한다. 또한 이 연결은 스크립트가 종료되어도 끊어지지 않고 나중에 다시 사용할 수 있도록 연결 상태를 유지한다.

그 밖의 최적화 팁

최적화에 사용할 수 있는 그 밖의 팁은 다음과 같다.

  • 업데이트가 많이 발생하는 테이블에 복잡한 SELECT 쿼리를 사용하지 않는다.
  • 변경이 빈번하게 발생하는 데이블에는 VARCHAR와 BLOB 컬럼을 사용하지 않는다.
  • 단지 크다는 이유만으로 하나의 큰 테이블을 서로 다른 테이블로 분리하는 것은 옳지 않다.
  • 해시 컬럼 소개
    만일 어떤 컬럼이 짧고 고유하다면 여러 컬럼을 사용하는 색인보다 빠르다. MySQL에서는 이 특별한 컬럼을 쉽게 사용할 수 있다.
    SELECT * FROM tb_name WHERE hash=MD5(concat(col1,col2)) AND col1='x' AND col2='y';
  • 카운터는 실시간으로 업데이트한다. 만일 카운트와 같이 많은 행을 기반으로 하는 정보를 처리해야 한다면 별도의 테이블을 만들고 이 카운트를 실시간으로 업데이트하는 것이 바람직하다. 다음과 같은 업데이트는 매우 빠르다.
    UPDATE tb_name SET count=count+1 WHERE col='x';
  • 거대한 테이블을 검색하는 대신 요약 테이블을 이용한다. 실시간으로 통계를 내는 것보다 요약 정보를 유지하는 것이 훨씬 빠르다.
  • 디폴트 값을 가지는 컬럼을 이용한다. 입력되는 값이 디폴트가 아닐 경우에만 명시하면 된다.
  • 고유한 값이나 키를 만들려면 AUTO_INCREMENT 컬럼을 사용한다.

캐싱

스크립트 실행 시간의 대부분은 데이터베이스 작업과 입출력 작업에서 소모된다. 입출력과 데이터베이스 쿼리를 최적화한 뒤에는 스크립트의 실행 시간을 개선해야 한다. 만일 느려지는 작업이 있다면 가장 좋은 최적화 방법은 해당 작업을 피하는 것이다. 이것은 캐싱을 사용하면 가능하다.

캐싱의 정의

캐싱(Caching) 처리 작업이나 생성 작업 없이 데이터를 다시 사용할 수 있도록 저장하는 것을 말한다. PHP 프로그래밍에서는 캐싱은 두 번씩 생성할 필요가 없도록 동적으로 만들어진 데이터를 저장하는 것을 의미한다. 데이터를 만드는 과정이 복잡할수록 캐싱의 효과가 크다.

캐싱의 중요성

캐싱은 매우 중요한 기술이다. 무엇보다 데이터를 동적으로 생성하는 작업이 단순한 파일 읽기 작업으로 대체되어 실행 시간이 줄어든다. 또한 캐싱은 웹 서버와 데이터베이스 서버의 부하를 줄이는 좋은 방법이다. 수많은 연결과 트랜잭션이 발생하는 대형 사이트에서 캐싱은 필요한 데이터베이스 쿼리의 수를 줄여준다.

캐싱의 또 다른 중요한 장점은 외부 데이터에 대한 사이트의 의존성을 줄여준다는 것이다. 만일 데이터의 일부가 데이터베이스 혹은 다른 사이트에서 제공된다면 해당 사이트가 다운되어도 캐시에 저장된 데이터를 이용해 작업을 계속할 수 있다.

캐싱의 장점

캐싱의 다음과 같은 장점을 가지고 있다.

  • 일반적으로 파일에서 데이터를 읽는 작업은 데이터베이스나 다른 소스에서 데이터를 생성하는 것보다 빠르므로 성능이 향상된다.
  • 서버와 데이터베이스의 부하를 감소시킨다.
  • 독립성이 좋아진다. 만일 데이터베이스가 다운되어도 사이트는 영향을 받지 않는다.

캐싱의 단점

물론 캐싱도 몇 가지 단점을 가지고 있다. 그 중 가장 나쁜 것은 사이트가 복잡해진다는 것이다. 캐시 데이터를 이용하기 위해 데이터를 캐시에 저장하고, 데이터가 유효한지 확인하고, 필요한 경우 캐시를 업데이트하는 작업이 추가해야 한다. 캐시에 저장되는 데이터의 형식에 따라 캐싱 로직은 그리 간단하지 않고 캐시를 위한 특별한 함수를 만들어야 하는 경우도 있다.

일반적인 캐싱 정책

우선 캐싱 일반적인 캐싱 메커니즘의 로직을 살펴보자. 이것은 대부분의 캐싱 구조에 적합하고 캐싱 시스템을 설정하기에 앞서 결정을 내리는 데 도움이 된다.

[이미지]

  • 접근 데이터 확인
    캐싱의 원리는 간단한다. 다시 요청되었을 때 다시 반복할 필요 없도록 어떤 작업 결과를 저장하는 것이다. 데이터를 저장할 때 어디에서 생성되었는지는 상관하지 않으므로, 데이터가 이미 캐시에 있는지 검사하기 위해 데이터의 이름을 부여해야 한다. 예를 들어, 함수의 실행 결과는 cache_funcName.dat(명명 규칙 부분 참조)와 같은 이름을 부여할 수 있다. 만일 printTable() 함수를 사용한다면 이 함수의 실행 결과는 cache_printTable.dat라는 이름의 파일로 저장할 수 있다.
  • 캐시 데이터의 유효성 확인
    만일 캐시에 이미 주어진 이름의 데이터가 존재한다면 이 데이터가 유효한 지를 검사해야 한다. 예를 들어, 캐시의 데이터가 저장된 지 5분 미만이라면 유효하다고 판단할 수 있는데 따라서 5분마다 새로운 데이터를 만들어야 한다. 다른 방법은 변화가 있기 전까지는 캐시 데이터가 유효하다고 판단하는 것이다. PHP에서 파일의 최종 수정 시간 filemtime() 함수를 이용해 알 수 있다.
  • 캐시에서 데이터 가져오기
    여러분은 캐시에 접근하고 주어진 이름의 캐시 데이터를 가져온다. 데이터에 접근하는 방법은 저장 방식에 따라 다르다. 파일 기반의 캐싱 시스템의 경우 캐시에서 데이터를 가져오는 것은 파일을 열고 그 내용을 읽는 것을 의미한다. 만일 캐시가 다른 저장 방법을 사용한다면 접근 방법은 바뀔수 있다.
  • 데이터 생성
    이것은 캐싱 시스템의 외부에서 동적으로 데이터를 만드는 과정이다. 이것은 실제로 캐시에 저장되는 코드 부분이면 동적인 데이터를 만들어 내는 PHP 스크립트에 해당된다.
  • 캐시에 데이터 저장 또는 업데이트
    만일 캐시에 데이터가 없거나 유효하지 않으면 생성된 데이터를 캐시에 저장한다. 그 다음 불필요한 작업을 하지 않고 저장된 데이터를 이용할 수 있다.
  • 데이터 출력
    print(), echo() 등의 함수를 이용해서 클라이언트에게 데이터를 전송하는 일반적인 작업을 의미한다.

따라서 우리는 다음과 같은 것들을 정의해야 한다.

  • 데이터를 저장하고, 업데이트하고, 가져오는 함수로 이루어진 캐시 저장 메소드
  • 캐시 데이터를 구별할 수 있는 명명 규칙
  • 캐시 데이터의 유효성을 판단할 수 있는 기준
  • 주기적으로 캐시의 내용을 갱신하는 정책

캐시를 위한 저장 방식

캐싱 시스템에서 정의해야 하는 첫 번째 요소는 캐시 데이터를 저장하는 방식이다. 몇 가지 방식이 있지만 가장 흔한 것은 각각의 캐시 데이터를 하나의 파일로 저장하는 것이다. 일반적으로 다음과 같은 방식이 사용된다.

  • 데이터베이스 사용
  • 각각의 캐시 자료를 하나의 파일로 나타냄
  • 모든 캐시 자료를 하나의 DBM 파일로 나타냄
  • 공유 메모리(shared memory) 사용

데이터베이스 사용

우리는 주로 데이터베이스에 만들어낸 데이터를 저장하기 때문에 이 방법은 그다지 바람직하지 않다. 그러나 데이터를 다른 사이트에서 가져오거나 매우 느린 방법을 통해 만들어 내는 시스템의 경우 데이터베이스를 이용하는 방법은 신뢰성이 있다.

데이터베이스의 명명규칙은 각각의 데이터에 접근할 수 있는 프라이머리 키가 만들어지는 것이어야 한다. 데이터 저장, 검색, 업데이트, 삭제 작업은 SQL문을 통해 이루어진다. 캐시 데이터의 검색 작업을 빠르게 하기 위해 테이블은 프라이머리 키로 색인되어 있어야 한다. 또한 테이블에는 캐시 데이터의 유효성을 확인할 수 있도록 타임스탬프(timestamp)가 필요하며, 캐시 데이터의 유효성 나타내는 플래그 컬럼을 둘 수도 있다.

파일 사용

파일을 사용할 경우에는 각각의 캐시 데이터를 하나의 파일로 생성한다. 명명 규칙은 각각의 데이터에 고유한 이름을 부여할 수 있어야 한다. 파일을 업데이트하는 작업은 파일을 삭제하고 새로 생성하는 것을 의미한다. 유효성은 파일의 최종 수정일 등의 시스템 정보를 이용해 검사할 수 있다.

캐시 데이터가 몇만개씩 있다면 이 방식은 그다지 효율적이지 못하다. 파일의 수가 많으면 아이노드(inode)가 부족할 수도 있고 파일 검색이나 저장 성능에 문제가 있을 수 있기 때문에 파일 시스템에 수천 개의 파일을 두는 것은 바람직하지 못하다. 캐시 데이터의 수가 적다면 이 방법이 유용하다.

DBM 파일 사용

데이터베이스를 사용하기를 원하지 않거나 캐시 데이터를 각각의 파일로 만들기를 원하지 않는다면 DBM 파일은 좋은 방법이다. DBM 파일은 데이터베이스에서 사용하는 함수를 제공하며 속도가 빠르다. PHP에서는 다양한 DBM 방식을 사용할 수 있다. 예를 들어, SleepyCat의 DB2(http://www.sleepcat.com/)는 캐싱 시스템에 성공적으로 사용되어 왔다.

비록 DBM 파일이 일반적인 파일보다 약간 느리지만 캐시 데이터의 수가 증가함에 따라 발생하는 문제는 없다.

공유 메모리 사용

우리는 또한 PHP의 공유 메모리 함수를 이용해 캐시 데이터를 공유 메모링 저장할 수 있다. 공유 메모리를 이용함으로써 우리는 스크립트에서 접근할 수 있는 공유 메모리 세그먼트를 정의할 수 있다. PHP 스크립트는 이 세그먼트를 이용해 캐시 데이터를 저장한다. 이 방법은 다소 복잡하지만 상당히 빠르다. 그러나 메모리는 상당히 비싼 자원이기 때문에 방대한 메모리를 캐시 데이터로 낭비할 수는 없고 다른 저장 방법을 찾아보아야 한다.

메모리 캐시

만일 정말 빠른 캐싱 시스템을 원하고 서버가 리부팅되었을 경우의 데이터 손실이 중요하지 않다면 캐시 데이터를 메모리에 저장할 수 있다. 이것을 위한 가장 좋은 방법은 메모리로 맵핑되어 있는 파일 시스템에 캐시 데이터를 만드는 것이다. 리눅스 시스템에서는 이 작업이 간단하게 이루어진다.

그 다음 우리는 디렉토리에 있는 파일이나 DBM 파일을 메모리에 직접 저장하면 된다. 디스크 입출력 작업이 발생하지 않기 때문에 이 방식의 작업은 상당히 빠르다.

Import!ant

웹 서버가 많은 캐시 파일보다는 메모리를 사용하도록 하는 것이 바람직하다. 그러나 많은 메모리를 가지고 있고 성능이 매우 중요하다면 이 방법을 선택할 수 있다.

명명 규칙

명명 규칙(naming convention)은 데이터를 캐시로 저장하기 위해 사용되는 단계이며 어떤 종류의 데이터를 캐싱하느냐에 따라 다르다.

데이터 종류

처리 방법

함수 결과

캐시 이름을 cache_funcName.dat와 같은 방식으로 사용한다.

인크루드 파일 결과

캐시 이름을 lcache_fileName.dat와 같은 방식으로 사용한다.

스크립트 결과

캐시 이름을 cache_fileName.dat와 같은 방식으로 사용한다.

생성된 파일

캐시 이름을 $REQUEST_URI의 md5() 해시를 이용한다. 만일 사이트에 사용자 등록 시스템이 있다면 md5() 해시 작업을 하기 전에 사용자의 아이디를 URI에 추가해야 한다. 그렇지 않으면 모든 사용자가 같은 정보를 보게 된다.

md5()는 메시지를 암호화하는 함수이다. 이 함수는 문자열을 몇 번의 작업을 통해 128비트 암호문으로 만들어 주며 다음과 같은 특징을 가지고 있다.

  • 만일 문자열의 일부만을 변경해도 md5 값은 변경된다.
  • 동일한 md5 값을 갖는 두 문자열을 찾아내는 것이 어렵다.
  • md5 값을 이용해 원래의 문자열을 알아내는 것은 불가능하다.

따라서 md5()는 고유한 값을 가지는 문자열을 만들어내는 훌륭한 함수이며 동일한 md5 값을 가지는 두 개의 문자열을 만들어 낼 확률은 상당히 낮다. 23장에는 보안을 위해 md5()와 비슷한 기능을 하는 다른 함수가 설명된다.

유효성 검사

유효성 검사는 캐시 데이터가 유효인지 아닌지를 검사하는 가장 좋은 방법이다. 가장 일반적인 방법은 캐시 파일이나 데이터의 최종 수정일을 검사해 지정된 시간보다 나중에 만들어졌으면 유효한 것이다. 이것은 지정된 주기마다 캐시 데이터를 갱신할 수 있는 좋은 방법이다. 예를 들어, 어떤 홈페이지를 캐시에 저장해 놓고 10분마다 캐시의 내용을 갱신할 수 있다.

다른 유효성 검사는 캐시에 저장되는 데이터와 저장 방식에 따라 다르다. 예를 들어, XML 파일을 처리하고 결과를 출력하는 과정을 캐시에 저장했다면 XML 파일이 변경되었을 경우에는 쓸모가 없어진다. 이 경우에는 XML 파일의 최종 수정일을 검사하고 지정된 기간을 넘겼는지 확인해서 캐시를 갱신해야 한다.

데이터 갱신 정책

캐시 데이터가 무한정 커지기를 바라지 않는다면 캐시를 갱신하는 정책을 만들어야 한다. 오래된 캐시 데이터를 검사하는 과정은 주기적으로 실행되어야 한다. 만일 오래된 데이터가 발견되면 삭제해야 한다. 이러한 작업을 위한 알고리즘은 여러 가지가 있다.

예를 들면, "x"분 이상된 데이터, 최근에 "n"번 이하로 사용된 데이터 등을 삭제할 수 있다. 이러한 방법을 사용하려면 접근 횟수, 최근 사용 시간 등의 추가적인 정보를 캐시에 저장해야 한다. 어떤 경우에 시스템에서 이러한 정보를 제공하기도 하며 어떤 경우에는 직접 이 정보를 저장해야 한다.

일반적으로 캐시를 갱신하는 것에는 LRU(Least Recently Used) 알고리즘이 가장 적합하다. 갱신 작업은 보통 cron을 이용해 주기적으로 실시한다. 이 과정은 20장에서 설명된 crontab(UNIX 시스템)을 이용해 설정할 수 있다.

LRU 알고리즘은 캐시에서 n개의 데이터를 삭제해야 한다면 가장 오랜 시간동안 사용되지 않은 데이터를 삭제한다. 이 정책은 최근에 사용된 파일은 데이터가 사용될 경우 다시 접근하게 된다는 것을 가정하고 있다. 오랫동안 사용되지 않은 데이터는 다시 사용될 가능성이 낮기 때문에 삭제될 것이다.

캐시되어야 하는 데이터

일반적으로 컨텐츠와 데이터베이스 쿼리 두 종류의 데이터가 캐시에 저장된다.

컨텐츠 캐싱하기

컨텐츠를 캐싱한다는 것은 동적으로 생성된 컨텐츠를 하나의 파일이나 파일 그룹에 저장하고 나중에 데이터를 만들어 내지 않고 이 데이터를 가져오는 것을 의미한다. 보통 데이터의 생성 과정이 복잡하거나 느리고 다른 외부 요인에 영향을 받는 경우 캐싱이 필요하다. 컨텐츠를 캐싱하려면 두 가지 방법을 사용할 수 있는데, 생성되는 모든 컨텐츠를 캐싱하는 것과 모듈이나 코드의 일부분을 캐싱하는 것이다.

일반적인 캐싱 구조

다음은 모든 동적 페이지를 만들어 내는 페이지 엔진을 가지고 있다고 가정한 경우의 일반적인 캐싱 구조이다. 우리는 명명 규칙의 URI를 만들어 내기 위해 md5() 해시를 이용한다. 또한 PHP 출력 버퍼링을 이용해 캐시에 유효한 데이터가 없을 경우 모든 출력을 버퍼에 저장하고, 이 데이터를 파일로 저장한다. 스크립트가 다시 실행되면 이 파일을 검사한다. 만일 지정된 URI의 파일이 존재하고 10분 이상 경과하지 않았다면 데이터를 생성하지 않고 이 파일을 읽어 그 내용을 브라우저로 보낸다:

 <?php
 // 첫 번째로 캐시 데이터의 이름을 만든다.
 $cache_name = md5($REQUEST_URI);
 $time = date('U');

 // 캐시에 유효한 데이터가 있는지 검사한다.
 // 캐시 데이터는 10분(600초) 동안 유효하다.
 if (file_exists($cache_name) && ($time - filemtime($cache_name)) < 600) {
  $data = readfile($cache_name);
  echo($data);
 } else {
  ob_start();

  // 컨첸츠를 생성하는 일반적인 코드
  echo("Hello world\n");

  $data = ob_get_contents();
  $fh = fopen($cache_name, 'w+');
  fwrite($fh, $data);
  fclose($fh);
  ob_end_flush();
 }
 ?>

데이터베이스 쿼리 캐싱

만일 모든 컨텐츠를 캐시로 저장할 필요가 없다면 복잡한 SELECT 쿼리의 결과만을 저장할 수도 있다. 이 경우에는 데이터베이스 쿼리를 캐싱하는 일반적인 캐시 구조를 만들기가 어려우므로 적절한 다른 방법을 이용한다. 또한 캐시 데이터의 유효성을 나타내는 플래그가 필요하고 캐시 데이터를 업데이트하는 스크립트가 필요하다.

일반적인 데이터베이스 캐싱 구조

데이터베이스 추상화 계층을 이용하면 한 곳에서 모든 데이터베이스 작업을 제어할 수 있다. 모든 쿼리를 위한 일반적인 캐시 시스템을 만드는 것도 가능하다. 어려운 점은 쿼리를 위한 명명 규칙을 위한 일반적인 캐시 시스템을 만드는 것도 가능하다. 어려운 점은 쿼리를 위한 명명 규칙을 정의하는 일과 쿼리가 데이터베이스를 업데이트했을 때 캐시 데이터가 유효하다는 표시를 하는 것이다. 이를 위해 아래와 같은 방법을 생각해볼 수 있다.

캐시 데이터 이름을 만들기 위해 SELECT 문의 md5() 해시를 이용하고 "유효한 데이터"를 나타내는 플래그를 각각의 캐시 데이터에 저장한다. 그리고 쿼리가 어떤 테이블에서 데이터를 가져오는지를 저장한다. 만일 UPDATE, INSERT, DELETE 쿼리일 경우 유효하지 않다는 표시를 하거나 변경된 테이블을 사용하는 모든 캐시 데이터를 삭제한다.

데이터베이스 쿼리 캐시를 위한 명명 규칙은 다음과 같다:

 md5hash_table1_table2_table3_table4.dat

md5hash 부분은 SELECT 문의 md5() 값이며, 그 뒤에 이 쿼리에서 사용되는 모든 테이블이 나온다(사용되는 테이블을 알기 위해 쿼리를 파싱해야 한다).

SELECT 문은 md5()로 변환하기 쉽고, 리턴하면서 value_*로 시작하는 파일이 있는지 확인할 때 사용된다. 만일 없다면 쿼리를 실행하고 결과 값을 적당한 파일에 저장한다. 만일 이 파일이 존재한다면 그냥 파일에서 데이터를 가져온다.

UPDATE, DELETE, INSERT 문의 경우, 각 SQL 문에 포함된 테이블을 이용하는 모든 캐시 데이터를 검사해야 한다. 사용되는 테이블을 알기 위해 다시 쿼리를 파싱해야 하며, 이 데이블을 사용하는 캐시 데이터를 지워야 한다(이 작업은 파일 시스템 명령어를 이용하면 간단하다).

데이터베이스를 위한 일반적인 캐싱 시스템은 컨텐츠 캐싱 시스템보다 적용과 유지가 어려운 경향이 있다. 만일 컨텐츠를 캐싱하는 것이 불가능하다면 데이터베이스 쿼리의 특별한 캐싱은 비교적 간단하지만 유지하기가 힘들다.

이럴 경우 하드웨어를 업그레이드하거나 라운드 로빈(round robin), 생산자-소비자 모델(producer-consumer model)을 이용해야 한다.

PHP 엔진 최적화

마지막 최적화 방법은 PHP 엔진 자체에 관한 것이다. PHP는 실행을 위해 스크립트를 파싱해서 중간 단계(intermediate)의 코드로 변형한다. 그 다음 젠드 엔진은 이 코드를 토큰(tokens)으로 파싱하고, 내부 구조를 처리하고, 나머지 부분은 PHP로 전달한다. 최적화가 가능한 부분은 중간 단계의 코드를 캐시로 만드는 것이다. 만일 중간 단계의 코드를 캐싱해주는 적절한 제품을 사용한다면 소스코드가 변경되지 않는 이상 PHP 엔진은 소스코드를 파싱할 필요가 없다.

이러한 종류의 최적화를 하는 제품은 다음과 같다.

위의 세 가지 제품은 PHP 엔진이 동일한 소스 파일을 반복적으로 파상하지 않도록 중간 단계의 코드를 파일로 저장한다. 테스트 결과 이 세가지 제품은 모두 실행시간이 10에서 20% 정도 빨라졌다. Zend Accelarator는 차세대 젠드 캐시로, 성능 개선을 위한 고급 기능을 제공하고 스트리밍을 관리할 수 있는 기능이 추가되었다. 또한 젠드 옵티마이저도 통합되어 있다.

Posted by 알 수 없는 사용자
,

<!--
# Shoutcast 방송의 히스토리를 재정렬해 뿌려주는 역할을 합니다.

# 사용법 : Shoutcast_Played.php?host=[방송서버IP]&port=[방송포트]

# DRL License by
ice@ice.pe.kr
-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Page-exit"  CONTENT="BlendTrans(Duration=1)">
<META HTTP-EQUIV="Page-Enter" CONTENT="BlendTrans(Duration=1)">    
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<TITLE>최근 재생곡 </TITLE>
<style type="text/css">
body, td, a, marquee{ font-size:8pt; cursor:default; font-family:굴림;}
td { border:1px solid black; }
</style>
<script language="JavaScript">
<!--
function doBlink() {
    document.all.tags("TR")[1].style.color = document.all.tags("TR")[1].style.color == '' ? 'red' : '';
    setTimeout("doBlink()",500);
}
//-->
</script>
</HEAD>

<BODY onContextMenu="return false" onLoad="doBlink();setTimeout('location.reload();',30000);">
<?
 $fp
=@fsockopen($host,$port);
 if(
$fp)
 {
 
$query  = "GET /played.html HTTP/1.0\n";
 
$query .= "User-Agent: Mozilla/4.0\n";
 
fputs($fp, "$query\n");
  while(!
feof($fp)) $gets .= fgets($fp,1024);
 
fclose($fp);
 
$gets = strstr($gets, 'Played @');
 
$gets = str_replace('<td><b>Current Song</b></td>', '', $gets);
 
$gets = strstr($gets, '<tr><td>');
 
$gets = substr($gets, 0, StrPos($gets,'</table>'));
  echo
'<table border=0 cellspacing=0 cellpadding=5 width=95% align=center>';
  echo
'<tr bgcolor=black style=color:white><td align=center width=50>시간</td><td align=center>방송 또는 노래 제목</td></tr>';
  echo
$gets;
  echo
'</table>';
 }
  else echo
'방송 서버에 연결할수 없습니다.';
?>
</BODY>
</HTML>

Posted by 알 수 없는 사용자
,

Learning to Use Regular Expression!s by Example


현재 제가 작업하고 있는 사이트는 폼을 통한 유저입력에 많은 의존을 하고 있고 모든 데이터는 데이터베이스로 보내기 전에 검사해야합니다. 처음에는 PHP3의 정규 표현식 함수를 사용하면 된다는 건 알고 있었지만 어떻게 정규표현식을 작성해야 할지 몰랐습니다. 제가 필요로 했던 것은 뭔가 예제가 될만한 것이었죠. (물론 처음으로 본 것은 PHP3 매뉴얼과 POSIX 1002.3 스펙이었죠 하지만 예제가 없어서 별 도움이 되질 못했습니다) 덧 붙여 말하자면 정규표현식에 대한 좋은 글을 웹에서 찾기란 정말 어려웠습니다. 전 경험과 시행착오로 점점 그것에 대해 알게 되었고 별거 아님을 깨달았습니다. 그래서 이 글에서 문법에 대한 직접적인 설명을 하고 금액 입력과 email 주소 문자열을 을 검사하는 정규표현식을 작성하는 단계를 설명하려합니다.


- Basic Syntax of Regular Expression!s (정규표현식의 기본 문법)


먼저 특수문자 '^'와 '$'를 살펴봅시다. 이 문자의 역할은 문자열의 시작과 끝을 의미합니다. 다음과 같은 해당 예를 들 수 있습니다.


"^The": "The"로 시작하는 문자열

"of despair$": "of despair"로 끝나는 문자열

"^abc$": "abc"로 시작하고 "abc"로 끝나는 문자열 ("abc" 라는 문자열도 해당됨)

"notice": "notice"가 들어 있는 문자열


마지막 예제에서 보듯이 이 두 개의 특수문자가 없는 패턴은 검사대상이 되는 문자열에 어떤 위치에서든지 들어 있음 의미합니다.


특수문자로는 '*', '+', '?'도 있습니다. 이 문자들은 어떤 문자의 반복에 관한 지정을 해주는 문자입니다. 각각 '0또는 그 이상', '1또는 그 이상', '0또는 1'을 의미합니다. 여기에 몇 가지 예제가 있습니다.


"ab*": a뒤에 0 이상의 b가 있는 문자열 ("a", "ab", "abbb", 등);

"ab+": 위와 동일 하지만 최소한 하나 이상의 b가 있어야 함 ("ab", "abbb", 등);

"ab?": b가 하나 있을 수도 있고 없을 수도 있음 (ab 또는 a)

"a?b+$": a가 있을 수도 있고 없을 수도 있으며 그뒤에 하나 이상의 b로 끝나는 문자열


{ }를 사용하면 반복되는 수를 영역으로 지정할 수 있습니다.


"ab{2}": a뒤에 2개의 b가 있는 문자열 ("abb");

"ab{2,}": a뒤에 최소한 2개 이상의 b가 있는 문자열 ("abb", "abbbb", 등.);

"ab{3,5}": a뒤에 3개에서 5개 사이의 b가 있는 문자열 ("abbb", "abbbb", 또는 "abbbbb").


{ }를 사용할 대는 반드시 첫 번째 숫자는 적어야 됨을 유의합니다. ((O) "{0,2}", (X) "{,2}"). 또한 '*', '+', '?'는 각각 "{0,}", "{1,}", "{0,1}"와 같습니다.


이제 ()를 사용해서 하나의 문자가 아닌 여러 문자를 지정하는 방법을 알아봅니다.


"a(bc)*": a 뒤에 "bc"가 0또는 그이상의 수만큼 있는 문자열

"a(bc){1,5}": a 뒤에 "bc."가 1에서 5번 들어 있는 문자열


또 다른 특수문자로는 OR 연산을 하는 '|'를 들 수 있습니다.


"hi|hello": "hi"나 "hello"가 들어 있는 문자열

"(b|cd)ef": "bef" 또는 "cdef"

"(a|b)*c": a와 b가 섞여서 여러번 나타나고 그뒤에 c가 붙어있는 패턴


'.' (period)는 어떤 한 문자를 의미합니다.


"a.[0-9]": a뒤에 한 문자와 숫자가 붙어 있는 패턴

"^.{3}$": 3문자로만 되어 있는 문자열


[]표현은 문자열의 해당 위치에 사용될 수 있는 문자를 표현하는데 사용합니다.


"[ab]": a또는 b ("a|b"와 동일한 표현);

"[a-d]": 소문자 'a'에서 'd'까지 ("a|b|c|d"또는 "[abcd]"와 동일);

"^[a-zA-Z]": 영문자로 시작하는 문자열

"[0-9]%": % 문자 앞에 하나의 문자가 붙어 있는 패턴

",[a-zA-Z0-9]$": 영문자, 숫자로 끝나는 문자열 패턴


[]에서 '^'를 표현의 가장 처음에 사용하면 나타나서는 안 되는 문자를 지정할 수 있습니다. (예> "%[^a-zA-Z]%" 두 % 사이에 영문자가 없는 패턴)


"^.[$()|*+?{"같은 특수 문자는 백슬레쉬('')를 사용해서 escape될 수 있습니다( 역자 주 : escape 이란 다른 말로 literal로 탈출한다라고 할 수 있습니다 즉 특수문자로 인식되지 않고 일반 문자로 인식되게 합니다). 사용하는 관점에서 보면 백슬레쉬도 PHP3의 문자열에서 escape되어야 하기 때문에 예를 들어 "($|?[0-9]+"같은 정규표현식은 ereg("($|?[0-9]+", $str) 와 같이 사용됩니다 (이 표현식은 무얼 검사하는 걸까요? ^^;(이건 역자가 한 말이 아닙니다))


하지만 []안에서는 특수문자가 모두 효력을 읽게 되기 때문에 이 법칙을 벗어남을 기억하세요 []안에서는 백슬레쉬를 포함한 모든 특수문자들이 그 힘을 읽습니다 (예> "[*+?{}.]"는 말그대로 '*', '', '+', '?', '{', '}', '.' 문자를 의미합니다. 그리고 regex man 페이지에 나오듯이 ']'문자 자체를 포함하려면 문자들 리스트의 첫 번째에 위치시킵니다('^'가 있으면 '^'뒤에). '-'를 포함하려면 첫 번째 또는 마지막 문자로 지정하고 '-'문자가 영역의 경계 (예> a에서 -까지)일 경우 영역지정 문자의 두 번째 경계로 지정([a--])합니다.


완벽한 설명을 하려면 대조 순서(collating sequences), 문자 클래스(character classes), 동일 클래스(equivalence classes)에 대해서도 다루어야 하지만 이 글에서는 별 상관관계가 없기 때문에 regex man 페이지를 참고하도록 합니다.


-Validating Money Strings (금액 문자열 검사하기)


ok 이제 우리는 여기서 배운 것을 뭔가 실질적인 것에 적용 시켜봅시다. 사용자가 입력한 금액을 검사하는 정규표현식에 대해 알아봅니다. 금액은 "10000.00" 와 "10,000.00", 와, 센트 없이, "10000" 와 "10,000" 이렇게 4가지 방법으로 사용됩니다. (역자주 : 달러와 센트 군요 蝁,.蝁)


다음 정규표현식을 기초로 시작해 봅시다.


^[1-9][0-9]*$


이 정규표현식은 0으로 시작하지 않는 어떠한 수인지를 검사합니다. 하지만 "0"도 통과되지 못합니다. 그래서 다음과 같이 수정합니다.


^(0|[1-9][0-9]*)$


말로 표현하면 "0 이거나 0으로 시작하지 않는 수"입니다. 이제 수 앞에 -부호도 사용할 수 있게 수정해 봅니다.


^(0|-?[1-9][0-9]*)$


이 뜻은 "0 이거나 -이 있을 수 있는 수이고 이 수는 0으로 시작하지 않는다"입니다. 이제 좀 느슨하게 하고 유저가 0으로 시작하는 수도 입력할 수 있도록 해봅니다. 금액에 필요없는 -부호도 없애버립니다. 그리고 선택사항인 소수점 부분 패턴도 넣어서 다음 정규표현식이 나옵니다.


^[0-9]+(.[0-9]+)?$


하이라이트된 부분은 소수점(.)이 항상 최소한 하나이상의 수와 붙어 있어야 함을 의미합니다. 그러므로 예를 들면 "10."은 통과되지 못하고 "10" 과 "10.2"는 통과합니다.


^[0-9]+(.[0-9]{2})?$


이제 소수점 뒤에 반드시 2개의 수가 붙어 있어야 합니다. 이게 너무 심하다 싶으면 다음과 같이 해서


^[0-9]+(.[0-9]{1,2})?$


소수점 뒤에 하나의 숫자만 올 수도 있게 합니다. 이제 1000단위를 구분하는 ','를 표현해 봅니다.


^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$


"1~3개의 숫자와 그 뒤에 ','와 3개의 숫자로 이루어진 부분이 0개 또는 그 이상이 붙어 있는 패턴". 쉽죠? 이제 ','도 선택사항(옵션:option)으로 만들어 봅니다.


^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$


이게 전부입니다. 여기서 '+'를 '*'로 바꾸면 빈 문자열도 통과되는 패턴이 됩니다. 함수호출할 때 백슬래쉬 문자 escape하는 것 (역자 : /를 //로) 잊지 마세요. 일단 문자열이 검사되어 지면 str_replace("," , "" , $money) 함수로 ','를 없애버리고 double로 형 변환을 해서 산술연산에도 사용할 수 있게 합니다.


- Validating E-mail Addresses (E-mail 주소 검사하기)


이제 e-mail 주소를 살펴봅시다. e-mail주소는 3부분으로 구성됩니다. : user 명(@왼쪽편에 있는 모든 것), '@', 그리고 서버명(나머지 부분들) user명은 대문자 또는 소문자와 숫자, '.' '-', '_'로 구성됩니다. '_'를 제외하면 서버명도 마찬가지입니다. user 명은 .으로 시작하거나 끝나지 않습니다. domain명도 마찬가지입니다. 또한 .이 연속으로 있을 수도 없고 . 사이에는 최소한 하나 이상의 문자가 있어야 합니다. 이제 user명 부분을 검사하는 정규표현식을 만들어 봅시다.


^[_a-zA-Z0-9-]+$


이 정규표현식은 아직 .을 지원하지 않습니다. 다음과 같이 수정합니다.


^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*$


말로 하면 "최소한 하나의 유효한 문자(valid character)와 그 뒤에 .과 유효문자들로 구성된 부분이 0또는 그 이상이 있는 패턴"입니다.


좀 간단하게 하기 위해 이 정규표현식을 ereg()대신에 eregi()함수에 사용합니다. eregi()함수는 대소문자를 구분하지 않기 때문에 "a-z"와 "A-Z"같이 두 개의 영역을 지정하지 않아도 되는 이점이 있습니다.(둘 중 어떤 것이라도 상관없음)


^[_a-z0-9-]+(.[_a-z0-9-]+)*$


서버명의 경우 '_'만 제외하고는 동일합니다.

^[a-z0-9-]+(.[a-z0-9-]+)*$


이제 '@'를 중심으로 서로 붙여서 다음과 같이 만들어 냅니다.


^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$


- 기타 사용


Extracting Parts of a String (문자열의 일부분 잘라내기)


ereg()와 eregi()함수는 문자열에서 패턴에 해당되는 부분을 잘라내는 기능이 있습니다. (메뉴얼 참고) 예를 들면 path/URL 문자열에서 파일명을 잘라내고 싶은 경우 다음과 같은 코드가 필요할 것입니다.


ereg("([^/]*)$", $pathOrUrl, $regs);

echo $regs[1];


Advanced Replacing (치환의 발전된 형태)


ereg_replace() 와 eregi_replace()는 아주 유용한 함수입니다. 문자열에 있는 모든 문자를 ','로 구분한다고 가정해 봅시다. 다음과 같이 할 수 있습니다. (역자 : trim()함수는 문자열의 앞과 뒤에 있는 공백문자를 모두 제거하는 함수)


ereg_replace("[ nrt]+", ",", trim($str));


- Some exercises (연습문제)


여기 당신을 좀 바쁘게 할 만한 것들이 있습니다 (^^;)


1. 여기 나온 email 검사 정규표현식의 서버 부분을 최소한 두 개의 이름으로 구성되어야 하게 수정하시오 (hint : 단 하나의 문자만 변경하면 됨)

2. trim()기능을 하는 ereg_replace()함수호출을 하시오

3. '#', '@', '&', '%'를 '~'로 수정하는 ereg_replace()함수호출을 하시오


Have fun!


출처 : www,phpbuilder.com

원문 : Dario F. Gomes (dario@who.net) 1999/06/16

번역 : 허련호 (rhheo@hanmail.net) 2001/01/30

Posted by 알 수 없는 사용자
,
<?
// 첫번째 방법
function strcut_utf8($str, $len, $tail='...'
) { 
   
$rtn
= array(); 
    return
preg_match('/.{'.$len.'}/su', $str, $rtn) ? $rtn[0].$tail : $str

}

// 두번째 방법
function resizeString($Str, $size, $addStr="..."
) { 
    if(
mb_strlen($Str, "UTF-8") > $size) return mb_substr($Str, 0, $size, "UTF-8").$addStr

    else return
$Str



echo
strcut_utf8("가나다라ㄳ마바사", "5")."<br>\n"
;
echo
resizeString("가나다라ㄳ마바사", "5"
);
?>
Posted by 알 수 없는 사용자
,
프레임 사용자가 한번쯤은 겪어봤을 고통(?)을 말끔히 해결해드릴만한 것이라 생각됩니다.

흔희 프레임을 사용하다보면 어떤 작업을 한 후 혹은 하다보면 리로드(새로고침)을 하게 됩니다.

현제 페이지가 어디든 프레임의 성격상 프레임셋에서 지정한 초기화면으로 이동하기 마련이죠.

이를 제어하여 리로드를 해도 그 상태 그대로 유지하고픈 사용자들이 많기에 도움이 되리라 봅니다.

아래 소스를 이용하시면 무난하게 처리됩니다.

index.html 또는 index.php파일 제일 상단에 꼬옥 위치시키세요!

사용 방법은 프레임셋파일에 적용하시면 됩니다.


<?
$LastModified = gmdate("D d M Y H:i:s", filemtime($HTTP_SERVER_VARS[SCRIPT_FILENAME]));
header("Last-Modified: $LastModified GMT");
header("ETag: \"$LastModified\"");
?>


JS 소스 : http://oxtag.com/zboard/zboard.php?id=js&no=733
Posted by 알 수 없는 사용자
,
Posted by 알 수 없는 사용자
,

옥션 스토어 갤러리 - 다른상품보기

http://avgagunara.com/img/file/auction.php



인터파크 미니샵 갤러리 - 다른상품보기

http://avgagunara.com/img/file/interparkMs.php


Posted by 알 수 없는 사용자
,

실시간 채팅 대화방 - ajax


○ 실시간 채팅 대화방 - 클릭
Posted by 알 수 없는 사용자
,

미리보기 : http://oxtag.com/php/p/os_browser_check.php


<?
/*
http_user_agent를 이용한 client의 os와 web brower를 체크
*/

/////////////////////////////////////os정보를 가져오는 함수 
function set_os($os){ 
global
$os_version,$os_name,$array
$os_version=""

    for(
$i=0;$i<sizeof($array);$i++){ 
       
$j=$i+1
        if(
eregi("$os",$array[$i]) && eregi("^[0-9]{1,2}([.]{1}[0-9]{1,2})*[a-z]{0,1}$",$array[$j])){ 
       
$os_version=$array[$j]; 
        }     
    } 


/////////////////////////////////////browser정보를 가져오는 함수 
function set_br($br){ 
global
$br_version,$br_name,$array
$br_version=""

    for(
$i=0;$i<sizeof($array);$i++){ 
       
$j=$i+1
        if(
eregi("$br",$array[$i]) && eregi("^[0-9]{1,2}([.]{1}[0-9]{1,2})*[a-z]{0,1}$",$array[$j])){ 
       
$br_version=$array[$j]; 
        }     
    } 


/////////////////////////////////////os와 browser를 체크하는 함수 
function check_agent(){ 
global
$HTTP_USER_AGENT,$os_name,$os_version,$br_version,$br_name,$array

$temp=$HTTP_USER_AGENT
$temp=eregi_replace("([ 0-9.])*%","",$temp); 
$temp=trim(eregi_replace("-|_|=|+|;"," ",$temp)); 

$array=split(" ",$temp); 

if(
eregi("([a-z])+/",$array[0])){$br_version_temp=split("/",$array[0]);} 
$br_version_temp=$br_version_temp[1]; 

if(
eregi("Win|Window",$temp)){ 
$os_name="Windows"

    if(
ereg("s 3.1|n3.1",$temp)){ 
   
$os_version="3.1"
    } 

    if(
ereg("s 95|n95",$temp)){ 
   
$os_version="95"
    } 

    if(
ereg("s 98|n98",$temp)){ 
   
$os_version="98"
    }     

    if(
ereg("s ME|nME",$temp)){ 
   
$os_version="ME"
    } 

    if(
ereg("s NT|nNT",$temp)){ 
   
$os_version="NT"
    } 

    if(
ereg("s NT|nNT",$temp) && eregi("T 5.0| 2000",$temp)){ 
   
$os_version="2000"
    } 

    if(
ereg("s NT|nNT",$temp) && eregi("T 5.1| XP",$temp)){ 
   
$os_version="XP"
    } 


elseif(
eregi("Mac PowerPC|PPC",$temp)){ 
$os_name="Mac PowerPC"
set_os("Mac powerPC"); 


elseif(
eregi("Mac",$temp)){ 
$os_name="Macintosh"
set_os("Mac"); 


elseif(
eregi("Linux",$temp)){ 
$os_name="Linux"
set_os("Linux"); 
}  

elseif(
eregi("IRIX",$temp)){ 
$os_name="IRIX"
set_os("IRIX"); 


elseif(
eregi("sunOS",$temp)){ 
$os_name="sunOS"
set_os("sunOS"); 


elseif(
eregi("phone",$temp)){ 
$os_name="CellPhone"
set_os("phone"); 


else{
$os_name="Unknown";$os_version="";} 


if(
eregi("MSN",$temp)){ 
$br_name="MSN"
set_br("MSN"); 


elseif(
eregi("MSIE",$temp)){ 
$br_name="MSIE"
set_br("MSIE"); 


elseif(
eregi("([){1}[a-z]{1,3}(]){1}",$temp) && eregi("]",$temp)){ 
$br_name="Netscape"
$br_version=$br_version_temp


elseif(
eregi("opera",$temp)){ 
$br_name="Opera"
set_br("opera"); 
if(!
$br_version){$br_version=$br_version_temp;} 


elseif(
eregi("gec|gecko",$temp)){ 
$br_name="Gecko"
set_br("Gecko"); 
if(!
$br_version){$br_version=$br_version_temp;} 


elseif(
eregi("MSMB",$temp)){ 
$br_name="MSMB"


else{
$br_name="Unknown";} 
}
?>


프로그램에 사용하기 위해 HTTP_USER_AGENT를 이용한 방문자의 OS와 web browser를 체크하는 함수를 만들어 보았습니다.

HTTP_USER_AGENT에 대한 여러가지 패턴과 정보에 대해 약 1000여개의 HTTP_USER_AGENT 결과를 체크하여 제작 하였습니다.



<?

/////////////////////////////////////체크 함수 호출
check_agent();
/////////////////////////////////////출력
echo "
OS : $os_name $os_version <br>
Browser : $br_name $br_version
"
;
?>



태그 : 브라우저, os, 운영체제, 아이피, browser

Posted by 알 수 없는 사용자
,

미리보기 :

이미지 새창 - http://oxtag.com/zboard/gallery.php?board_id=gallery&board_title=갤러리 이미지 새창&slide_mode=15&slidespeed=3000&list_num=15&num_rand=2&img_target=1

해당글 이동 - http://oxtag.com/zboard/gallery.php?board_id=gallery&board_title=갤러리 해당글 이동&slide_mode=15&slidespeed=3000&list_num=15&num_rand=2&img_target=2


★ 제로보드 기준 소스입니다. 다른 게시판도 디비 접속부만 수정하시면됨니다. 

<?
// <a href=http://oxtag.com target=_blank>http://oxtag.com</a>
// ★★★ -> 반드시 수정...
// ☆☆☆ -> 수정해도 그만 안해도 그만...
// modify by 선정이 (<a href=http://eschyles.mireene.com) target=_blank>http://eschyles.mireene.com)</a>

// 현재 파일을 제로보드에 업로드 후 iframe 태그 또는 include를 사용하세요.
// ex. <a href=http://oxtag.com/zboard/gallery.php?board_id=gallery&board_title=갤러리&slide_mode=15&slidespeed=3000&list_num=15&num_rand=2&img_target=1 target=_blank>http://oxtag.com/zboard/gallery.php?board_id=gallery&board_title=갤러리&slide_mode=15&slidespeed=3000&list_num=15&num_rand=2&img_target=1</a>
// ex. <a href=http://oxtag.com/zboard/gallery.php?board_id=gallery&board_title=갤러리&slide_mode=15&slidespeed=3000&list_num=15&num_rand=2&img_target=2 target=_blank>http://oxtag.com/zboard/gallery.php?board_id=gallery&board_title=갤러리&slide_mode=15&slidespeed=3000&list_num=15&num_rand=2&img_target=2</a>
// 제로보드 images 폴더에 noimage.gif, gallery_title.gif 파일을 올리세요.

// 보안을 위해서...
if (basename(getenv("PHP_SELF")) == basename(__FILE__)) die;
if(
eregi(":\/\/",$_zb_url)||eregi("\.\.",$_zb_url)) $_zb_url="/zboard/"; // ★★★ 제로보드 경로.. 아래 $_zb_url 과 동일하게.
$_zb_url = "/zboard/";                                // ★★★ 제로보드 경로 (업로드1, 업로드2 경로설정 때문에...) 
$_zb_path = "/home/tagpia/public_html/zboard/";        // ★★★ 제로보드 절대경로 
include_once $_zb_path."outlogin.php"
// if(!$connect) $connect=dbConn();

/*
$board_id = $_GET["$board_id"];
$width = $_GET["$width"];
$height = $_GET["$height"];
$slide_mode = $_GET["$slide_mode"];
$slidespeed = $_GET["$slidespeed"];
$list_num = $_GET["$list_num"];
$num_rand = $_GET["$num_rand"];
$img_target = $_GET["$img_target"];
*/

// ★★★ 추출할 갤러리 게시판 이름(id)을 입력하세요. (주소창에 입력하지 않은 경우..)
if($board_id) { $board_id = $board_id; } else { $board_id = "gallery"; }

// ☆☆☆ 추출할 게시판 이름을 입력하세요. (주소창에 입력하지 않은 경우..)
if($board_title) { $board_title = $board_title; } else { $board_title = "갤러리"; }

// ☆☆☆ 그림 가로사이즈
if($width) { $width = $width; } else { $width = "300"; }

// ☆☆☆ 그림 세로사이즈
if($height) { $height = $height; } else { $height = "225"; }

// ☆☆☆ 슬라이드 방식 : 아래 주석 설명 참고하세요... 아래 15가지 랜덤으로 보이게 할 때는 15
if($slide_mode) { $slide_mode = $slide_mode; } elseif($slide_mode <= "16") { $slide_mode = "15"; } else { $slide_mode = "15"; }

// ☆☆☆ 다음 이미지로 슬라이드되는 시간 : 1000 = 1초
if($slidespeed) { $slidespeed = $slidespeed; } else { $slidespeed = "3000"; }

// ☆☆☆ 추출할 그림 갯수를 입력하세요.
if($list_num) { $list_num = $list_num; } else { $list_num = "10"; }

// ☆☆☆ 게시물 추출시 : 최근등록순 = 1, 램덤추출 = 2
if($num_rand) { $num_rand = $num_rand; } else { $num_rand = "1"; } 

// ☆☆☆ 이미지 클릭시 : 팝업 = 1, 해당글 이동 = 2 
if($img_target) { $img_target = $img_target; } else { $img_target = "1"; }

$c_del=$list_num - 1;                        // 스크립트 안의 slideimages 와 slidecaption, slidelinks의 마지막 붙는 콤마(,) 제거를 위해서..

if($slide_mode==0)         { $slide = "Spiral(Duration=1,gridSizeX=10,gridSizeY=10)"; }         // 중심을 향해서 사각으로 회오리.. 설명이 참... ㅡ_ㅡ;;
elseif($slide_mode==1)         { $slide = "Pixelate(maxSquare=10,duration=1)"; }                 // 픽셀이 분해되서 모이는효과입니다. 
elseif($slide_mode==2)         { $slide = "Fade(duration=1)"; }                                 // 이미지가 겹치면서 샤샥 변하는효과. 
elseif($slide_mode==3)         { $slide = "RandomDissolve(Duration=1,orientation=vertical)"; } // 흩뿌리기 효과. 
elseif($slide_mode==4)         { $slide = "GradientWipe(duration=1)"; }                         // 좌측에서 우측으로 바뀌는 효과.
elseif($slide_mode==5)         { $slide = "Blinds(Duration=1,bands=20)"; }                         // 블라인드 효과
elseif($slide_mode==6)         { $slide = "Checkerboard(Duration=1,squaresX=20,squaresY=20)"; }// 바둑판처럼 바뀌는 효과
elseif($slide_mode==7)         { $slide = "Strips(Duration=1,motion=rightdown)"; }                 // 왼쪽 위에서 오른쪽 아래로 대각선으로 벗기듯이 변하는 효과
elseif($slide_mode==8)         { $slide = "Barn(Duration=1,orientation=vertical)"; }                 // 중간에서 좌우로 열리는 효과
elseif($slide_mode==9)         { $slide = "Iris(Duration=1,motion=out)"; }                         // +(열십자)모양으로 중간에서 사방으로 열리는 효과
elseif($slide_mode==10) { $slide = "Wheel(Duration=1,spokes=12)"; }                         // 바퀴살처럼 그림이 변하는 효과
elseif($slide_mode==11) { $slide = "RadialWipe(Duration=1,wipeStyle=clock)"; }                 // 360도 회전하는 와이프효과
elseif($slide_mode==12) { $slide = "RandomBars(Duration=1,orientation=vertical)"; }         // 불규칙한 세로바가 나타나는 효과
elseif($slide_mode==13) { $slide = "Slide(Duration=1,slideStyle=push)"; }                 // 한장씩 오른쪽에서 왼쪽으로 슬라이드
elseif($slide_mode==14) { $slide = "Stretch(Duration=1,stretchStyle=push)"; }                 // 책장 넘기는 효과
elseif($slide_mode==15) {                                                                 // 위 15가지 랜덤으로 보이게 할 때
mt_srand((double)microtime()*500000); 
$rn=mt_rand(0,14); 
$ri=array("Spiral(Duration=1,gridSizeX=10,gridSizeY=10)","Pixelate(maxSquare=10,duration=1)","Fade(duration=1)","RandomDissolve(Duration=1,orientation=vertical)","GradientWipe(duration=1)","Blinds(Duration=1,bands=20)","Checkerboard(Duration=1,squaresX=20,squaresY=20)","Strips(Duration=1,motion=rightdown)","Barn(Duration=1,orientation=vertical)","Iris(Duration=1,motion=out)","Wheel(Duration=1,spokes=12)","RadialWipe(Duration=1,wipeStyle=clock)","RandomBars(Duration=1,orientation=vertical)","Slide(Duration=1,slideStyle=push)","Stretch(Duration=1,stretchStyle=push)");
$slide=$ri[$rn];
}
else {
$slide = "Spiral(Duration=1,gridSizeX=10,gridSizeY=10)"; }

if(
$num_rand==1) $num_rand = "order by no desc"
elseif(
$num_rand==2) $num_rand = "order by rand()"
else
$num_rand = "order by no desc"

$setup = mysql_fetch_array(mysql_query("select use_alllist from $admin_table where name='$board_id'"));
if(
$setup[use_alllist]) $target = "zboard.php?id=".$board_id;
else
$target = "view.php?id=".$board_id;

// 해당 게시판의 데이타 뽑아옴.. 
$result=mysql_query("select * from zetyx_board_$board_id $num_rand limit $list_num", $connect);
while(
$data=mysql_fetch_array($result)) { 

/* 해당글의 페이지를 찾기 위한 부분 시작*/
if($data[depth]>0){
$lasttemp=mysql_fetch_array(mysql_query("select count(*) from zetyx_board_$board_id where headnum <= $data[headnum] and arrangenum < $data[arrangenum]"));
}
else{
$lasttemp=mysql_fetch_array(mysql_query("select count(*) from zetyx_board_$board_id where headnum < $data[headnum]"));
}
$lasttotal=$lasttemp[0];
$setup2 = mysql_fetch_array(mysql_query("select memo_num from $admin_table where name='$board_id'"));
$page=(int)($lasttotal/$setup2[memo_num])+1;
/* 해당글의 페이지를 찾기 위한 부분 끝*/

// ☆☆☆ 한개의 글에서 하나만 출력합니다. 우선 순위는 순서대로 이니까 이건 알아서 수정하세요.
// 파일명에 한글이 있을 경우 엑박 방지를 위해서 urlencode..
if(eregi("\.gif|\.jpg|\.bmp",$data[sitelink1])) { // 사이트링크1에 이미지 확장자가 있을때...
$linkUrl=stripslashes($data[sitelink1]);
$linkUrl=eregi("^[0-9a-zA-Z./@~?&=_-]+$",$linkUrl)?$linkUrl:urlencode($linkUrl);
$linkUrl=str_replace("%3A", ":", $linkUrl);
$linkUrl=str_replace("%2F", "/", $linkUrl);
$img[]=$linkUrl;
$caption[]="<a href='".$_zb_url."".$target."&no=".$data[no]."&page=".$page."'>".$data[subject]."</a>";
$link[] = "".$_zb_url."".$target."&no=".$data[no]."&page=".$page."";
}
elseif(
eregi("\.gif|\.jpg|\.bmp",$data[sitelink2])) { // 사이트링크2에 이미지 확장자가 있을때...
$linkUrl=stripslashes($data[sitelink2]);
$linkUrl=eregi("^[0-9a-zA-Z./@~?&=_-]+$",$linkUrl)?$linkUrl:urlencode($linkUrl);
$linkUrl=str_replace("%3A", ":", $linkUrl);
$linkUrl=str_replace("%2F", "/", $linkUrl);
$img[]=        $linkUrl;
$caption[]="<a href='".$_zb_url."".$target."&no=".$data[no]."&page=".$page."'>".$data[subject]."</a>";
$link[] = "".$_zb_url."".$target."&no=".$data[no]."&page=".$page."";
}
elseif(
eregi("\.gif|\.jpg|\.bmp",$data[file_name1])) { // 업로드1에 이미지 확장자가 있을때...
$file_name=stripslashes($data[file_name1]);
$file_name=eregi("^[0-9a-zA-Z./@~?&=_-]+$",$file_name)?$file_name:urlencode($file_name);
$file_name=str_replace("%3A", ":", $file_name);
$file_name=str_replace("%2F", "/", $file_name);
$img[] = $_zb_url.$file_name;  // DQ엔진의 썸네일을 사용하고자 하시면 이 줄을 주석처리하고 밑에 줄을 주석처리 해제하세요.
//$img[] = "".$_zb_url."data/$board_id/small_".$data[no].".thumb";
$caption[]="<a href='".$_zb_url."".$target."&no=".$data[no]."&page=".$page."'>".$data[subject]."</a>";
$link[] = "".$_zb_url."".$target."&no=".$data[no]."&page=".$page."";
}
elseif(
eregi("\.gif|\.jpg|\.bmp",$data[file_name2])) { // 업로드2에 이미지 확장자가 있을때...
$file_name=stripslashes($data[file_name2]);
$file_name=eregi("^[0-9a-zA-Z./@~?&=_-]+$",$file_name)?$file_name:urlencode($file_name);
$file_name=str_replace("%3A", ":", $file_name);
$file_name=str_replace("%2F", "/", $file_name);
$img[] = $_zb_url.$file_name;  // DQ엔진의 썸네일을 사용하고자 하시면 이 줄을 주석처리하고 밑에 줄을 주석처리 해제하세요.
//$img[] = "".$_zb_url."data/$board_id/small_".$data[no].".thumb";
$caption[]="<a href='".$_zb_url."".$target."&no=".$data[no]."&page=".$page."'>".$data[subject]."</a>";
$link[] = "".$_zb_url."".$target."&no=".$data[no]."&page=".$page."";
}
else {
$img[]="".$_zb_url."images/noimage.gif";// 이미지가 없는 게시물 일때..
$caption[]="<a href='".$_zb_url."".$target."&no=".$data[no]."&page=".$page."'>".$data[subject]."</a>";
$link[] = "".$_zb_url."".$target."&no=".$data[no]."&page=".$page."";


?>

<script> 
<!-- 
// 이미지 사이의 시간 간격(1000 = 1초) 
var slidespeed=<?=$slidespeed;?>;
// 보여줄 이미지들의 경로를 갯수만큼 만들어줌 
var slideimages=new Array(<? for($i=0; $i <= $c_del; $i++){ echo "\"".$img[$i]."\""; if($i < $c_del) echo ","; } ?>);
// 각 이미지들의 제목을 갯수만큼 만들어줌 
var slidecaption=new Array(<? for($i=0; $i <= $c_del; $i++){ echo "\"".$caption[$i]."\""; if($i < $c_del) echo ","; } ?>);

<? if($img_target == "1") { ?>
// 각 이미지의 원본글의 주소를 만들어줌 
var slidelinks=new Array(<? for($i=0; $i <= $c_del; $i++){ echo "\"".$img[$i]."\""; if($i < $c_del) echo ","; } ?>); 
<? 
} else {
// }  elseif($img_target == "1") { 
?>
// 각 이미지들의 링크를 갯수만큼 만들어줌 
var slidelinks=new Array(<? for($i=0; $i <= $c_del; $i++){ echo "\"".$link[$i]."\""; if($i < $c_del) echo ","; } ?>); 
<? } ?>

var imageholder=new Array();
var ie55=window.createPopup;
for (i=0;i<slideimages.length;i++){ 
imageholder[i]=new Image();
imageholder[i].src=slideimages[i];
}

function gotoshow(what) { 

<? if($img_target == "1") { ?>

var imgwin = window.open('','','scrollbars=no,status=no,toolbar=no,resizable=1,location=no,menu=no,width=10,height=10'); 
imgwin.document.open(); 
imgwin.document.write("<html>\n"); 
imgwin.document.write("<title>♡ 갤러리 ♡</title>\n"); 
imgwin.document.write("<META HTTP-EQUIV='imagetoolbar' CONTENT='no'>\n"); 
imgwin.document.write("<script LANGUAGE=JavaScript>\n"); 

imgwin.document.write("function fitwin(){\n"); 
imgwin.document.write(" window.moveTo!((window.screen.width-document.body.clientWidth)/2,(window.screen.height-document.body.clientHeight)/2-45);\n"); 
imgwin.document.write("}\n"); 

imgwin.document.write("var isNav4, isIE4;\n"); 
imgwin.document.write("var windowX, windowY;\n"); 
imgwin.document.write("var bLargeImage = 0;\n"); 
imgwin.document.write("var x,y;\n"); 

imgwin.document.write("if (parseInt(navigator.appVersion.charAt(0)) >= 4)\n"); 
imgwin.document.write("{\n"); 
imgwin.document.write("isNav4 = (navigator.appName == 'Netscape') ? 1 : 0;\n"); 
imgwin.document.write("isIE4 = (navigator.appName.indexOf('Microsoft') != -1) ? 1 : 0;\n"); 
imgwin.document.write("}\n"); 

imgwin.document.write("function fitWindowSize()\n"); 
imgwin.document.write("{\n"); 
imgwin.document.write("if (isNav4) {\n"); 
imgwin.document.write("window.innerWidth = document.layers[0].document.images[0].width;\n"); 
imgwin.document.write("window.innerHeight = document.layers[0].document.images[0].height;\n"); 
imgwin.document.write("}\n"); 
imgwin.document.write("if (isIE4) {\n"); 
imgwin.document.write("window.resizeTo!(150, 150);\n"); 
imgwin.document.write("width = 150 - (document.body.clientWidth - document.images[0].width);\n"); 
imgwin.document.write("height = 150 - (document.body.clientHeight - document.images[0].height)\n"); 
imgwin.document.write("windowX = (window.screen.width-width)/2;\n"); 
imgwin.document.write("windowY = (window.screen.height-height)/2;\n"); 
imgwin.document.write("if(width>screen.width){\n"); 
imgwin.document.write("width = screen.width;\n"); 
imgwin.document.write("windowX = 0;\n"); 
imgwin.document.write("bLargeImage = 1;\n"); 
imgwin.document.write("}\n"); 
imgwin.document.write("if(height>screen.height - 45){\n"); 
imgwin.document.write("height = screen.height - 55;\n"); 
imgwin.document.write("windowY = 0;\n"); 
imgwin.document.write("bLargeImage = 1;\n"); 
imgwin.document.write("}\n"); 
imgwin.document.write("x = width/2;\n"); 
imgwin.document.write("y = height/2;\n"); 
imgwin.document.write("window.moveTo!(windowX,windowY);\n"); 
imgwin.document.write("window.resizeTo!(width, height);\n"); 
imgwin.document.write("}\n"); 
imgwin.document.write("}\n"); 

imgwin.document.write("function move() {\n"); 
imgwin.document.write("if(bLargeImage)\n"); 
imgwin.document.write("window.scroll(window.event.clientX - 45,window.event.clientY - 55);\n"); 
imgwin.document.write("}\n"); 

imgwin.document.write("</script>\n"); 
imgwin.document.write("<body onclick='window.close()' oncontextmenu='return false' ondragstart='return false' onkeydown='return false' onselectstart='return false' topmargin='0' onLoad='fitwin();fitWindowSize();' onmousemove='move();' leftmargin='0' marginwidth='0' marginheight='0''>\n"); 
imgwin.document.write("<center><a href=# onfocus=this.blur() style='cursor:move'>\n"); 
imgwin.document.write("<img src='"+slidelinks[whichlink]+"' border=0 onerror=\"this.src='<?=$zb_url?>images/noimage.gif';\">\n"); 
imgwin.document.write("</a></center>\n"); 
imgwin.document.write("</body>\n"); 
imgwin.document.write("</html>\n"); 
imgwin.document.close(); 

<? 
} else {
// }  elseif($img_target == "1") { 
?>

window.open(slidelinks[whichlink], "_self", "");

<? } ?>


function showPicture(src,caption) {
window.location!=src;
return;
}

//-->
</script>

<style>
body,a {font-size:9pt;text-decoration:none;color:#000000;}
a.hover {font-size:9pt;text-decoration:none;color:#FF9900;}
.title { background-color:#CAD9BC; } /* 타이틀공간 백그라운드 색상 */
.content { background-color:#F0F0F0; } /* 그림공간 백그라운드 색상 */
.border { background-color:#E0E0E0; } /* 테두리 색상 */
</style>

<table cellpadding=0 cellspacing=0 border=0 width=<?=$width+12;?> align=center>
  <tr height=1><td rowspan=3 width=1></td><td width=1></td><td width=1></td><td class=title></td><td width=1></td><td width=1></td><td rowspan=3 width=1></td></tr>
  <tr height=1><td colspan=2 class=title></td><td class=title></td><td colspan=2 class=title></td></tr>
  <tr height=1><td class=title></td><td colspan=3 class=title></td><td class=title></td></tr>
</table>

<table cellpadding=0 cellspacing=0 border=0 class=title width=<?=$width+12;?> align=center>
  <tr>
<td width=1 class=title></td>
<td height='27' align=center valign=top>  </td>
<td><img src=<?=$_zb_url?>images/gallery_title.gif><br></td>
<td align=left width=100%> <a href='<?=$_zb_url?>zboard.php?id=<?=$board_id;?>'><b><?=$board_title;?></a></td>
<td width=1 class=title></td>
</tr>
</table>

<table cellpadding=0 cellspacing=0 border=0 class=content width=<?=$width+12;?> align=center>
  <tr><td width=1 class=border></td><td align=center valign=top>

<TABLE border=0 cellspacing=0 cellpadding=0 width=<?=$width+10;?>>
     <tr>
        <td height=<?=$height+5;?> align=center>
          <a href="javascript:gotoshow()" onfocus=blur()><img src="<?=$img[0]?>" name="slide" style="filter:progid:DXImageTransform.Microsoft.<?=$slide?>;border-color:aaaaaa" border=1 width="<?=$width?>" height="<?=$height?>" onerror="this.src='<?=$_zb_url?>images/noimage.gif';" GALLERYIMG="no"></a><br>
        </td>
     </tr>
     <tr>
        <td height=25 align=center>
          <font id='img_caption' style="font-size:9pt; color:#000000;" align=center>캡션이미지 위치입니다.</font>
        </td>
     </tr>
</TABLE>

        </td><td width=1 class=border></td>
    </tr>
</table>

<table cellpadding=0 cellspacing=0 border=0 width=312 align=center>
  <tr height=1><td rowspan=3 width=1></td><td rowspan=2 width=1 class=border></td><td colspan=3 class=content></td><td rowspan=2 width=1 class=border></td><td rowspan=3 width=1></td></tr>
  <tr height=1><td width=1 class=border></td><td class=content></td><td width=1 class=border></td></tr>
  <tr height=1><td colspan=2></td><td class=border></td><td colspan=2></td></tr>
</table>

<script language="JavaScript1.1"> 
<!-- 
var whichlink=0; 
var whichimage=0; 
var pixeldelay=(ie55)? document.images.slide.filters[0].duration*1000 : 0; 
function slideit(){ 
if (!document.images) return 
if (ie55) document.images.slide.filters[0].apply();
document.images.slide.src=imageholder[whichimage].src;
img_caption.innerHTML = slidecaption[whichimage];
if (ie55) document.images.slide.filters[0].play();
whichlink=whichimage;
whichimage=(whichimage<slideimages.length-1)? whichimage+1 : 0;
setTimeout("slideit()",slidespeed+pixeldelay);

slideit();
//--> 
</script>

Posted by 알 수 없는 사용자
,

미리보기 : http://oxtag.com/php/p/adult.php


<? 
// 년도에 따른 19금 (성인인증)
// 디비 입력된 생년월일 1985/6/3
if(date("Y") - substr($Mdata[birth],0,4)<19
){
echo
"미성년자"

}else{ 
echo
"성인"


?>



<?
// 월에 따른 19금 (성인인증)
// 생년월일 1985/6/3
$birth = "1985/06/03"
;
$birth_exp=explode("/",$birth
); 
$birth_stamp=mktime(0,0,0,$birth_exp[1],$birth_exp[2],$birth_exp[0]+19
); 

$adult_stamp=mktime(0,0,0,date("m"),date("d"),date("Y"
)); 

if(
$adult_stamp > $birth_stamp


echo
"성인"
;

else 

echo
"미성년자"
;

?>

Posted by 알 수 없는 사용자
,
* 글에 앞서 이 기능은 오픈프로젝트 기반의 "평생무료" 이며 스팸방지 이외에 개인 정보 수집이나 가입유도 목적이 절대 없음을 알립니다.

-----------------------------------------------------------------------------------------------------------------------

안녕하세요.
제로보드 4에서 회원가입, 게시물 신규등록 등 이벤트에 대한 알림 방법을 설명 드리겠습니다.

순서대로 따라하시면 됩니다.


1. 소리라떼( http://www.sorilatte.com/)에 회원가입 후 아래와 같은 코드를 발급 받습니다.
코드 발급은 ADD-On 메뉴 > 웹플러그인 에서 로그인 후 [사용하기] 버튼을 이용해서 가능합니다.


사용하기를 누르면 위와 같이 고유 세션 ID가 발급됩니다. 


2. 필요한 URL은 다음과 같이 조합 됩니다. 



 빨간색으로 된 부분만 본인의 상황과 맞게 바꾸어 주면 됩니다.
 - YOUR_ID : 소리라떼 로그인 ID
 - YOUR_SESSION_ID : 1번에서 발급받은 고유 세션 ID
 - 받는사람 : 알림을 받을 휴대폰 번호 ( 자신의 핸드폰 번호)
 - 수신번호 : 받는사람 휴대폰에 표시 될 발신번호

3. 자신의 휴대폰에 아래와 같이 입력한다.

  1) 휴대폰의 주소록에서 신규로 그룹을 추가합니다. "소리라떼" 라고 입력해서 그룹을 만듭니다.
  2) 신규 전화번호를 등록합니다. 이때 전화번호는 본인이 원하는 아무번호나 상관없습니다. 단지 평소에
     본인이  사용하지 않는 번호면 좋습니다. 여기서는 010-123-1234 라고 정합니다.
     이 의미는 나중에 보시면 아시겠지만 내 휴대폰에 010-123-1234라는 번호로 전화가 오면 신규회원가입
     이라는걸 알려줄 수 있기 위해 미리 만들어 놓는것입니다.
  3) 2번과 같이 번호만 다르게 하고 게시판글 등록, 답글 등록, 리플 등록등 주소록에 추가합니다.
      여기서는 010-123-1234 는 신규회원가입, 010-234-2345는 게시판글등록, 010-345-3456은 답글등록으로
      사용하도록 하겠습니다.


4. 제로보드 소스를 다음과 같이 추가합니다. 
 - 노란부분을 추가 하고 노란부분 안의 빨간색은 자신의 값을 넣도록 합니다. 

  ● member_join_ok.php
   
   mysql_query("insert into $member_table (level,group_no,user_id,password,name,email,homepage,icq,aol,msn,jumin,comment,job,hobby,home_address,home_tel,office_address,office_tel,handphone,mailing,birth,reg_date,openinfo,open_email,open_homepage,open_icq,open_msn,open_comment,open_job,open_hobby,open_home_address,open_home_tel,open_office_address,open_office_tel,open_handphone,open_birth,open_picture,picture,open_aol) values ('$group_data[join_level]','$group_data[no]','$user_id',password('$password'),'$name','$email','$homepage','$icq','$aol','$msn',password('$jumin'),'$comment','$job','$hobby','$home_address','$home_tel','$office_address','$office_tel','$handphone','$mailing','$birth','$reg_date','$openinfo','$open_email','$open_homepage','$open_icq','$open_msn','$open_comment','$open_job','$open_hobby','$open_home_address','$open_home_tel','$open_office_address','$open_office_tel','$open_handphone','$open_birth','$open_picture','$picture_name','$open_aol')") or error("회원 데이타 입력시 에러가 발생했습니다
".mysql_error());
 mysql_query("update $group_table set member_num=member_num+1 where no='$group_data[no]'");

 if(!$mode) {
  $member_data=mysql_fetch_array(mysql_query("select * from $member_table where user_id='$user_id' and password=password('$password')"));

  // 4.0x 용 세션 처리
  $zb_logged_no = $member_data[no];
  $zb_logged_time = time();
  $zb_logged_ip = $REMOTE_ADDR;
  $zb_last_connect_check = '0';

  session_register("zb_logged_no");
  session_register("zb_logged_time");
  session_register("zb_logged_ip");
  session_register("zb_last_connect_check");
 }


 mysql_close($connect);
 
  // 서버 설정에 따라 file() 함수의 사용이 가능하게 한다.
  ini_set("allow_url_fopen","1");

  // 주의: 아래 내용을 인코딩 하지 않을 경우 빈칸 때문에 명령이
  // 짤려서 전송이 안될 경우가 있습니다.
 
$url="http://wp.sorilatte.com/?userid=본인ID&sessid=발급받은세션ID&type=1&name=제로보드회원가입알림&targetnum=받는사람번호&callbacknum=0101231234&ringterm_level=1";    // <-이부분의 값은 본인의 값으로 수정, 신규회원가입이니 3번에 정한것처럼 010-123-1234번으로 callbacknum으로 지정하였습니다. 단!! 전화번호사이에 -는 없도록 합니다.

  $sender = file($url);
?>


● write_ok.php/***************************************************************************
 * 답변글일때
 **************************************************************************/
  // 답글 데이타 입력;;
    mysql_query("Insert Into $t_board"."_$id (division,headnum,arrangenum,depth,prev_no,next_no,father,child,ismember,memo,ip,password,name,homepage,email,subject,use_html,reply_mail,category,is_secret,sitelink1,sitelink2,file_name1,file_name2,s_file_name1,s_file_name2,x,y,reg_date,islevel) values ('$division','$headnum','$arrangenum','$depth','$prev_no','$next_no','$father','$child','$member[no]','$memo','$ip','$password','$name','$homepage','$email','$subject','$use_html','$reply_mail','$category','$is_secret','$sitelink1','$sitelink2','$file_name1','$file_name2','$s_file_name1','$s_file_name2','$x','$y','$reg_date','$member[is_admin]')") or error(mysql_error());    
                                
  // 서버 설정에 따라 file() 함수의 사용이 가능하게 한다.
  ini_set("allow_url_fopen","1");

  // 주의: 아래 내용을 인코딩 하지 않을 경우 빈칸 때문에 명령이
  // 짤려서 전송이 안될 경우가 있습니다.
  $url="
http://wp.sorilatte.com/?userid=본인ID&sessid=발급받은세션ID&type=1&name=제로보드답글알림&targetnum=받는사람번호&callbacknum=0103453456&ringterm_level=1";    // <-이부분의 값은 본인의 값으로 수정, 신규회원가입이니 3번에 정한것처럼 010-345-3456번으로 callbacknum으로 지정하였습니다. 단!! 전화번호사이에 -는 없도록 합니다.
     
   $sender = file($url);

        
  // 원본글과 원본글의 아래글의 속성 변경;;
  $no=mysql_insert_id();
  mysql_query("update $t_board"."_$id set child='$no' where no='$s_data[no]'");
  mysql_query("update $t_category"."_$id set num=num+1 where no='$category'",$connect);




/***************************************************************************
 * 신규 글쓰기일때
 **************************************************************************/

  mysql_query("insert into $t_board"."_$id (division,headnum,arrangenum,depth,prev_no,next_no,father,child,ismember,memo,ip,password,name,homepage,email,subject,use_html,reply_mail,category,is_secret,sitelink1,sitelink2,file_name1,file_name2,s_file_name1,s_file_name2,x,y,reg_date,islevel) values ('$division','$headnum','$arrangenum','$depth','$prev_no','$next_no','$father','$child','$member[no]','$memo','$ip','$password','$name','$homepage','$email','$subject','$use_html','$reply_mail','$category','$is_secret','$sitelink1','$sitelink2','$file_name1','$file_name2','$s_file_name1','$s_file_name2','$x','$y','$reg_date','$member[is_admin]')") or error(mysql_error());
  $no=mysql_insert_id();
 
 // 서버 설정에 따라 file() 함수의 사용이 가능하게 한다.
  ini_set("allow_url_fopen","1");

  // 주의: 아래 내용을 인코딩 하지 않을 경우 빈칸 때문에 명령이
  // 짤려서 전송이 안될 경우가 있습니다.
  $url="
http://wp.sorilatte.com/?userid=본인ID&sessid=발급받은세션ID&type=1&name=제로보드신규글알림&targetnum=받는사람번호&callbacknum=0102342345&ringterm_level=1";    // <-이부분의 값은 본인의 값으로 수정, 신규회원가입이니 3번에 정한것처럼 010-345-3456번으로 callbacknum으로 지정하였습니다. 단!! 전화번호사이에 -는 없도록 합니다.
     
   $sender = file($url);
 
  // 현재글의 조회수를 올릴수 없게 세션 등록
  $hitStr=",".$setup[no]."_".$no;
  $zb_hit=$HTTP_SESSION_VARS["zb_hit"].$hitStr;
  session_register("zb_hit");



5. 위와 같이 수정 후 테스트 해봅시다. 그럼 아래와 같이 자신의 휴대폰에 나올것입니다.
본인이 수정한 본인의 사이트에서 회원가입으로 테스트를 해보십시요. 가입을 하면 전화가 올것입니다.

 위와같이 전화가 잠깐 왔다가 끊어집니다. 그럼 부재중 전화 1통으로 남게 됩니다.
 이로써 부재중 전화를 보면 신규회원가입이 되었다는걸 알수가 있습니다.




이것으로 소리라떼 웹 플러그인을 이용해 제로보드 4에 알림 기능을 추가 하였습니다.
이번 강좌에서는 게시판과 회원가입시 코드만 보여드렸습니다. 이 2가지만 보면 나머지는 알아서
하실 수 있을꺼라 생각하여 생략하였습니다.
이 기능을 이용해 더욱 확장 기능을 만들려고 하신다면 예를들어 자신의 글에 답글이나 리플이
달릴 경우 글쓴이에게 알려주는 기능도 만들 수 있을것입니다. 
많은 기능을 만드셔서 저희사이트의 커뮤니티>자작 플러그인에 공개해주십시요^^
 
좋은 정보 많은 공유 부탁드리겠습니다.



원본글은 http://www.sorilatte. com/?article_srl=975 입니다

자세한 메뉴얼은
http://update.sorilatte.com/download/WEBPlugInManual.ppt
에서 다운받으실 수 있습니다.



뭐.. 응용하면 다른 게시판도 가능하겠죠..;;

Posted by 알 수 없는 사용자
,
특정월에 대한 생일인 사람들의 리스트를 뽑는 쿼리문입니다.

단순히 양력만 사용한다면 아주 쉽게 할 수 있고,
음력포함하더라도 오늘 날짜 (특정일) 의 생일 목록도 쉽게 나오는데..
음력이 포함된 특정 달.. 이거 생각보다 상당히 복잡해지네요..
일단 음력 생일 데이타가 거의 없어 제대로 테스트는 안 되었습니다.
대충 해보니 잘 나오는거 같습니다.
비용은 크게 마니 안 드는거 같은데... 일단 쿼리문에서 반복이 좀 많은데...
이걸 어캐 좀 간단하게 처리할 방법은 없을까요? 반복구문을 함수로 만들긴 좀.... 뷰도 곤란하고..
의견있으신분 댓글 달아주세요..

PostgreSQL 용입니다만.. 쿼리문이 특별한 부분이 없으므로 타 DBMS 에서도 아주 조금만 고치면 얼마던지 적용 가능할 거 같습니다.
(이하 존칭 생략)


member - 회원테이블중 일부
user_id      text    : 사용자 아이디
birth_year  smallint : 생년월일 중 년도
birth_md    char(4)  : 생년월일 중 월일
solar          boolean  : 양/음 구분 (양력 true)

lunar - 양/음력 변환 테이블 중 일부
lumar_md char(4)  : 음력 년월일 중 월일
solars      integer  : 음력에 해당하는 양력을 년월일로 붙여 만든 숫자형
                            date 형의 컬럼도 있지만.. to_char 등의 함수를 쓰야 하기 때문에..
yun        boolean  : 윤달 여부 (윤달 true)

select lunar_y, lunar_md, solar, yun, solars from lunar;
-------+---------+------------+-------+-----------
lunar_y  lunar_md    solar      yun    solars
-------+---------+------------+-------+-----------
  1899 |    1201 | 1900-01-01 | f    | 19000101
  1899 |    1202 | 1900-01-02 | f    | 19000102
  1899 |    1203 | 1900-01-03 | f    | 19000103
  1899 |    1204 | 1900-01-04 | f    | 19000104
  ...........


<참고>
  1. PostgreSQL 에서는 날짜형이 엄격하기 때문에 음력을 제대로 표현할 수 없다.
      이럴테면 1990-02-30 과 같은 경우이다.
      그래서 음력 표현 방법중 년도와 월일을 분리하고 년도는 숫자 월일은 문자로 했다.
  2. 양/음력을 프로그램으로 변환할 수도 있지만 완벽하지 않으므로
      돌아다니는 1900 ~ 2200 까지의 음력 데이타 를 이용하였다.
  3. 윤달을 전혀 고려하지 않았다. 만일 윤달이라면 yun 을 true 로 하면 된다.
  4. 생일에 대한 년도는 필요없으나, 특정월에 대한 년도는 필요하다. (년마다 음력 날짜가 틀리므로)


먼저 특정 년월에 대한 마지막날을 구하는 함수를 만든다.
물론 만들 필요없이 바로 해당 위치에 집어 넣어도 아무런 상관은 없지만,
마지막일을 구하는 일은 종종 발생할 수 있기 때문에 미리 함수로 만들어놓으면 편하다.

create or replace function last_date (integer) returns date as
$$
  select (to_date($1, 'YYYYMM') + interval '1 month' - interval '1 day')::date;
$$ language sql;


select last_date(200702);                                           
 last_date 
------------
 2007-02-28

이런식으로 나옵니다.


prepare get_birthday (integer) as
(
  select * from member
  where (birth_md between
                                to_char(last_date($1), 'MM01')
                          and to_char(last_date($1), 'MMDD')
            and solar = true
            )
    or case when
            (select lunar_md from lunar
            where solars = ($1 || '01')::int
                and yun = false
            )
              >
            (select lunar_md from lunar
            where solars = to_char(last_date($1), 'YYYYMMDD')::int
                and yun = false
            )
        then (
                  (birth_md between
                                      (select lunar_md from lunar
                                      where solars = ($1 || '01')::int
                                          and yun = false
                                      )
                                and '1231'
                  )
                  or
                  (birth_md between
                                      '0101'
                                and (select lunar_md from lunar
                                      where solars = to_char(last_date($1), 'YYYYMMDD')::int
                                          and yun = false
                                      )
                  )
                  and solar = false
                )
        else
                (birth_md between
                                    (select lunar_md from lunar
                                    where solars = ($1 || '01')::int
                                        and yun = false
                                    )
                              and (select lunar_md from lunar
                                    where solars = to_char(last_date($1), 'YYYYMMDD')::int
                                        and yun = false
                                    )
                and solar = false
                )
        end
  order by user_id
);




샤용법은
execute get_birthday(200706);

prepare 로 지정하지 않고
저것 자체를 function 으로 만들고 함수 인자를 interger 로 받아 써도 좋겠죠?
Posted by 알 수 없는 사용자
,

히라가나를 한글 발음으로 변환


카타카나를 한글 발음으로 변환


가타카나를 한글 발음으로 변환


일본어 번역


일본어 한국어 번역


한국어 일본어 번역


http://oxtag.com/php/p/jap-han-bal-um.php


예를 들어 다음과 같은 변환입니다.

あいうえお  → 아이우에오

Posted by 알 수 없는 사용자
,

미리보기 : http://oxtag.com/html/ex/imgResize20070824/

<script language="javascript" src="img_resize.js" type="text/javascript"></script>

<table width="620" cellspacing="0" cellpadding="0" align="center" style="table-layout: fixed; overflow: hidden; word-wrap:break-word; word-break:break-all;">
                <tr><td height="10"></td></tr>
                <tr><td>
        <img src='img/2097668193_b07e9513_img_1393658_1042_0.jpg' name='target_resize_image[]' onclick='image_window(this);' style='cursor:pointer;' title=''>
                <p>
                <img src='img/2097668193_cfd0a951_img_1393658_1042_1.gif' name='target_resize_image[]' onclick='image_window(this);' style='cursor:pointer;' title=''>
                <p><p>
        <img src='img/2097668193_b07e9513_img_1393658_1042_0.jpg' name='target_resize_image[]' onclick='image_window2(this,"1707","1100");' style='cursor:pointer;' title=''>
                <p>
                <img src='img/2097668193_cfd0a951_img_1393658_1042_1.gif' name='target_resize_image[]' onclick='image_window2(this,"397","612");' style='cursor:pointer;' title=''>

                        </td></tr>
                <tr>
                        <td align="right">
                                        </td>
                </tr>
                </table>


<script language="JavaScript">
<!--
// HTML 로 넘어온 <img ... > 태그의 폭이 테이블폭보다 크다면 테이블폭을 적용한다.
function resize_image()
{
    var target = document.getElementsByName('target_resize_image[]');
    var image_width = parseInt('630');
    var image_height = 0;

    for(i=0; i<target.length; i++) {
        // 원래 사이즈를 저장해 놓는다
        target[i].tmp_width  = target[i].width;
        target[i].tmp_height = target[i].height;
        // 이미지 폭이 테이블 폭보다 크다면 테이블폭에 맞춘다
        if(target[i].width > image_width) {
            image_height = parseFloat(target[i].width / target[i].height)
            target[i].width = image_width;
            target[i].height = parseInt(image_width / image_height);
        }
    }
}

window.onload = resize_image;

function file_download(link, file)
{
document.location!.href = link;
}
//-->
</script>

Posted by 알 수 없는 사용자
,
<script language="JavaScript">
<!--
function sleep(sec) {
    var now = new Date();
    var exitTime = now.getTime() + (sec*1000);
    while (true) {
          now = new Date();
          if (now.getTime() > exitTime) return;
    }
}

sleep(5);
alert('메롱');
//-->
</script>

지정시간 일시 멈춤
Posted by 알 수 없는 사용자
,