Develop!/php
[펌]PHP로 구현하는 시스템 모니터링툴
출처 : TestMaster 님의 블로그
시스템 모니터링이라고 하면 뭔가 복잡하고 어려운 것부터 생각되고 실제로 귀찮은 작업이기도 합니다. 이유있는 문제도 있지만 그렇지 않은 경우도 많습니다. 시스템 에러의 원인을 알 수 없을 때는 참 답답합니다. 그렇다면 그 해결책을 무엇일까요? 스스로 간단한 시스템 모니터링 툴을 만들어 보는 것입니다. SNMP에 대한 기본 지식이 있다면 PHP를 이용해 간단하게 만들 수 있습니다. 리눅스에서 PHP와 SNMP를 이용한 간단한 시스템 모니터링에 대해 알아보겠습니다.
프로그래밍하다 보면 이유 없이 시스템이 다운되는 경우가 있습니다. 물론 이유가 없다는 말은 이유를 알 수 없는 경우입니다. 그렇다고 24시간 서버만 붙잡고 있을 수도 없을 것입니다. 그래서 나온 것이 시스템 모니터링 툴일 것입니다. 시스템 모니터링의 영역은 넓고 방대하지만 여기서 만들어보고자 하는 것은 SNMP를 가지고 직접 시스템의 필요한 부분을 모니터링해 보는 것입니다. 직접 만들어보면 필요한 부분을 원하는 방식으로 모니터링할 수 있습니다. 물론 직접 만드는 것이 복잡하다는 생각이 들 수도 있습니다. 그런 것을 어떻게 만들까 하는 생각이 들 수도 있습니다. 그러나 의외로 쉬운 방법이 있는데, 바로 SNMP의 값을 활용하는 것입니다. SNMP를 이용하면 매우 간단하게 시스템 모니터링에 필요한 값을 가져올 수 있습니다.
그렇다면 어떤 값을 가져올 수 있는지 먼저 알아야 합니다. SNMP로 쉽게 값을 가져올 수 있지만 그렇다고 해서 SNMP가 그리 만만한 것은 아닙니다. 왜냐하면 SNMP로 가져올 수 있는 시스템 모니터링 값 또한 매우 방대하기 때문입니다. 그러나 간단한 모니터링 프로그램을 만들어 보기 위해서 SNMP의 모든 부분을 알 필요는 없을 것입니다. 지금 필요한 부분만 익혀서 사용하면 되고 나중에 필요한 부분이 있으면 차근차근 알아가면 됩니다.
그렇다면 시스템 모니터링에 있어서 가장 필요한 값에는 어떤 것들이 있을까요? 그것은 바로 cpu와 메모리일 것입니다. 그리고 현재 시스템에 어떤 프로세스들이 있는지도 알아야할 것입니다. 이 정도 값만 알 수 있어도 간단하게 원격으로 서버를 모니터링할 수 있습니다. 그렇다면 이런 값들을 가져오기 위해서는 기본적인 프로그램이 설치되어 있어야 합니다. 여기서는 프로그램의 설치되어 있다는 가정 아래 실제로 SNMP 값을 가져오는 부분과 SNMP의 간단한 명령어를 익히게 됩니다. 그리고 PHP에서 SNMP 값을 가져오는 방법과 PHP에서 가져오는 값을 활용해서 모니터링 프로그램을 어떻게 만들어야 하는지도 알아보겠습니다.
SNMP 모니터링을 하기 위해서 필요한 것들
실제로 모니터링 프로그램을 만들기 위해서 필요한 것에는 어떤 것이
있는지 알아보겠습니다. 먼저 모니터링할 서버에 SNMP가 설치되어 있어야 합니다. 윈도우 서버와 리눅스 서버의 SNMP 값은
각각 다릅니다. 여기서 사용하는 것은 리눅스입니다. 리눅스에 일단 net-snmp(http://net-snmp.sourceforge.net/)
가 설치되어 있어야 합니다. 설치되어 있지 않다면 이 사이트에서 받아서 설치할 수 있습니다. 그리고 PHP에서 SNMP 함수를
사용할 수 있어야 합니다. 일반적인 웹사이트 서비스를 위해서 PHP가 설치되어 있다면 SNMP 관련 함수를 사용할 수 있도록
설치해 주면 됩니다.
이 두 가지만 갖추어져 있다면 이제 필요한 것은 SNMP 값을 가져오는 것입니다. 그리고 어떤 값을 가져올 지를 미리 정하는 것입니다. 그리고 가장 중요한 것은 SNMP에 대한 기본 지식이 있어야 합니다. 무조건 SNMP 값을 가져다 쓰는 것보다는 SNMP에 대한 기본 지식을 알고 있으면 더 좋을 것입니다. 여기서는 한 대의 서버를 모니터링하는 것이 아니라 여러 대의 서버를 모니터링할 수 있기 때문에 모니터링하는 서버 또한 SNMP가 설치되어 있어야 합니다. SNMP 또한 환경 설정을 따로 할 수 있기 때문에 값을 가져오는 방식이 조금 다를 수 있겠지만 여기서는 기본적인 SNMP 방식으로 설명하겠습니다.
SNMP 기본 명령어 익히기
서버에서 SNMP 값을 가져오는 방법은 SNMP를 설치할 때 같이 설치되는 SNMP
관련 프로그램을 이용해서 가능합니다. 먼저 해당 서버에 SNMP가 설치되어 있는지 확인해야 합니다. 리눅스에서는 해당 서버에
SNMP 데몬이 실행되는 ps 명령으로 먼저 확인해 봅니다.
◆ 리눅스에서 SNMP 데몬이 있는지 확인하기
- ps -aux | grep snmpd
그리고 SNMP 값을 가져오는 데 주로 사용하는 명령어는 snmpwalk입니다. 물론 이 명령어 이외에도 몇 가지가
더 있습니다. 그러나 snmpwalk 명령어로 웬만한 값을 거의 다 가져올 수 있습니다. snmpwalk는 한 가지 값만 가져올
수도 있고 관련된 값을 모두 가져올 수도 있습니다.
◆ SNMP system 관련 값 가져오기
- snmpwalk localhost public system
- snmpwalk ****.com public system
이 명령은 localhost의 system 관련 값을 가져오는 것입니다. 그리고 해당 서버를 지정하면 그 서버의
값도 가져올 수 있습니다. 물론 다른 서버의 값을 가져오고자 할 경우 그 서버에 SNMP가 설치되어 있어야 합니다. 그렇다면
SNMP가 설치되어 있는 서버는 무조건 모니터링할 수 있을까요? 일단 그 서버에 접근 권한이 있어야 합니다. 그리고 SNMP
환경 설정에서 지정한 값만을 모니터링할 수 있습니다. 보안상 SNMP 값을 모두 모니터링하도록 허용한 것이 아니라 일부 값만
모니터링할 수 있도록 허용했을 수도 있습니다.
◆ SNMP system 관련 값의 일부
- system.sysDescr.0 = Linux localhost ...
- system.sysObjectID.0 = OID:
- enterprises.ucdavis.ucdSnmpAgent.linux
- system.sysUpTime.0 = Timeticks: (3526547) 15:33:12.22
- system.sysContact.0 = admin@****.com
- system.sysName.0 = ****.com
- system.sysLocation.0 = Unknown
= system.sysORLastChange.0 = Timeticks: (9) 0:00:00.09
system 관련 값의 일부입니다. 시스템에 관련된 값을 구할 수 있습니다. 그렇다면 이렇게 전부가 아닌 하나의 값만 구하려면 어떻게 할까요?
◆ 하나의 값만 구하기
- snmpwalk ****.com public system.sysDescr.0
- snmpwalk ****.com public sysDescr.0
하나의 값만 구하고자 할 경우에는 이렇게 해당 값을 지정해 주면 됩니다. 그리고 SNMP는 값을 구하는 것만이
아니라 해당 값을 설정할 수도 있습니다. 값을 구하는 것은 단순히 해당 서버의 값을 구하는 것이기 때문에 별다른 영향을 미치지
않습니다. 그러나 값을 설정하는 것은 해당 서버에 영향을 미칠 수도 있습니다. 여기서는 간단한 모니터링을 위한 SNMP 값을
이용하기 때문에 SNMP 값을 설정하는 부분은 다루지 않습니다.
CPU, 메모리 값 가져오기
모니터링하기 위해서 주로 사용되는 값인 cpu, 메모리 그리고 Load Averages
값을 가져오는 부분을 알아보겠습니다. cpu 값을 가져오기 위해서는 해당 MIB를 입력해 주면 됩니다. 여기서 사용되는 MIB
값은 공통적으로 사용되는 것입니다. MIB는 OID라는 숫자로도 표기될 수 있으며 정확하게 ssCpuUser의 계층구조까지 다
적는다면 nterprises.ucdavis.systemStats.ssCpuUser 표현될 수도 있습니다. OID 값으로 표현하면
1.3.6.1.4.1.2021.11.9.0이 됩니다. 모두 같은 의미입니다.
◆ cpu 관련 값 가져오기
- snmpwalk ****.com public ssCpuUser
- snmpwalk ****.com public ssCpuSystem
- snmpwalk ****.com public ssCpuIdle
이렇게 하면 각각 cpu 사용 퍼센트를 가져올 수 있습니다. 이 값은 리눅스에서 top 명령어를 실행했을 때 cpu
user, system, idle 값과 같은 값을 가져오게 됩니다. 해당 서버에 접속하지 않고도 SNMP를 이용하면 한 줄읱
명령으로 cpu 값을 가져올 수가 있습니다. 그렇다면 메모리 관련 값들에는 어떤 것이 있을까요?
◆ 메모리 관련 값 가져오기
- snmpwalk ****.com public memTotalReal
- snmpwalk ****.com public memTotalFree
- snmpwalk ****.com public memShared
- snmpwalk ****.com public memBuffer
- snmpwalk ****.com public memCached
이렇게 하면 메모리 관련 SNMP 값을 가져올 수 있습니다. 이 값 또한 top 명령을 실행했을 때 출력되는 메모리 관련 값들과 같습니다.
◆ Load Averages 값 가져오기
- snmpwalk ****.com public laLoad.1
- snmpwalk ****.com public laLoad.2
- snmpwalk ****.com public laLoad.3
각각 1, 5, 10분의 Load Averages 값을 가져옵니다. 이렇듯 SNMP를 이용하면 쉽고도 간단하게 다른
서버의 모니터링에 필요한 값을 가져올 수 있습니다. 이렇게 SNMP 값을 모니터링 값에 사용하려면 MIB 또는 OID를 알고
있어야 합니다. 그렇다면 MIB는 어떻게 알 수 있을까요? 여러 사이트와 문서가 있겠지만 net-snmp 사이트에서 제공하는
문서를 볼 수 있습니다. cpu, 메모리, Load Averages MIB가 포함되어 있는 문서는 http://net-snmp.sourceforge.net/mibs/UCD-SNMP-MIB.txt에서 볼 수 있습니다. 이 문서에 있는 MIB 값을 참고한다면 좀 더 다양한 값을 모니터링할 수 있을 것입니다.
MIB, OID는 같다
ssCpuUser, memTotalFree, laLoad.1 등 이런 값들을 MIB라고
부릅니다. MIB는 간단하게 설명하면 SNMP의 값들을 분류해 놓은 것입니다. 그리고 MIB에 해당하는 OID 값이 있습니다.
ssCpuUser는 축약한 것으로 enterprises.ucdavis.systemStats.ssCpuUser라고 써주면 됩니다.
그리고 이것의 OID 값은 1.3.6.1.4.1.2021.11.9가 됩니다.
◆ MIB와 OID 예
- MIB : enterprises.ucdavis.systemStats.ssCpuUser
(OID : 1.3.6.1.4.1.2021.11.9)
- MIB : enterprises.ucdavis.memory.memTotalFree
(OID : 1.3.6.1.4.1.2021.4.11)
- MIB : enterprises.ucdavis.laTable.laEntry.laLoad
(OID : 1.3.6.1.4.1.2021.10.1.3)
◆ MIB, OID로 값 얻기
- snmpwalk ****.com public ssCpuUser
- snmpwalk ****.com public enterprises.ucdavis.systemStats.ssCpuUser
- snmpwalk ****.com public .1.3.6.1.4.1.2021.11.9
각각 MIB, OID로 값을 가져오는 것입니다. MIB와 OID 값은 같습니다. MIB는 계층구조로 이뤄져
있습니다. 최상위 계층을 보면 System, Interface, IP, ICMP, TCP, UDP, EGP,
Transmission, SNMP 그룹들로 이뤄져 있고 하위 그룹은 트리구조를 이루고 있습니다.
SNMP는 어떻게 PHP 안에 들어갔을까?
일반적으로 PHP는 웹 사이트를 제작하는데 주로 사용되고 있습니다. 물론
다른 곳에도 사용되고 있습니다. 웹 사이트를 만드는 데만 주로 사용하다 보면 다른 곳에 사용할 생각을 잊어버리는 경우가
있습니다. ‘시스템 모니터링하는 프로그램을 만들어야 하는데 어떤 언어를 이용해서 만들 수 있을까?’는 질문에서 PHP를
떠올리기는 쉽지 않을 것입니다. 그러나 데이터베이스를 연동한 프로그램 이외에도 PHP로 할 수 있는 것은 많이 있습니다.
좀 더 자세히 살펴보면 의외로 PHP에는 많은 함수들이 존재하고 있다는 것을 알 게 될 것입니다. 꼭 필요하지 않는 함수라면 굳이 사용할 필요가 없겠지요. PHP를 오래 사용한 사람이라도 ‘이런 함수가 있었나?’고 할 정도로 다양한 함수군이 존재합니다. 그 중에서도 SNMP 관련 함수들이 있습니다.
그렇다면 어떻게 PHP에서 SNMP 함수를 사용할 수 있는 것일까요? 그것은 바로 PHP의 확장성입니다. 확장성이란 필요한 함수를 추가해서 사용할 수 있는 것입니다. SNMP 함수는 이미 누군가 개발을 해서 PHP에서 사용할 수 있도록 추가해 놓았기 때문에 우리는 함수를 호출해서 사용하기만 하면 되는 것입니다. 그렇다면 직접 SNMP 함수를 PHP에서 사용할 수 있도록 만들려면 어떻게 하면 될까요? PHP는 C언어로 만들어졌기 때문에 확장을 하려면 C언어로 확장할 수 있습니다. 물론 C, C++를 알아야 합니다. 그리고 C, C++로 PHP Extensions을 만들어서 추가할 수가 있습니다. SNMP 또한 PHP Extensions으로 만들어서 추가된 것입니다.
PHP에서 사용할 수 있는 SNMP 함수들
PHP에서는 SNMP 값을 어떻게 가져올 수 있을까요? 그것은 간단하게 SNMP 함수를 호출함으로서 가능합니다. 몇 가지의 함수들이 있는데 다음은 PHP에서 사용할 수 있는 SNMP 함수 입니다.
◆ PHP의 SNMP 함수
- 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
- snmpget
- snmpgetnext
- snmprealwalk
- snmpset
- snmpwalk
- snmpwalkoid
이 함수들 중에서 유용하게 사용할 수 있는 것은 snmpget, snmpwalkoid입니다. snmpget은 하나의
값을 가져 올 수 있으며 snmpwalkoid는 관련된 값들을 모두 가져올 수 있습니다. <리스트 1>을 보면
snmpget 함수의 사용 예가 있습니다. 먼저 snmp로 cpu 사용량을 가져오기 위해서는 값을 가져올 서버를 지정해야
합니다. 그리고 cpu idle 값에 해당하는 oid를 알고 있어야 합니다.
◆ cpu idle 에 해당하는 snmp oid
- .1.3.6.1.4.1.2021.11.11.0
그리고 snmp 설정에 따라서 다르겠지만 커뮤니티에 해당하는 값은 ‘public’으로 해주면 됩니다. 이 세 가지
값을 지정하면 snmpget 함수는 해당 서버의 cpu idle의 값을 가져오게 됩니다. 값을 가져오지 못했을 경우 false를
리턴하게 됩니다. 그리고 값을 정상적으로 가져왔을 경우에는 10, 20 등 이런 식으로 cpu idle 퍼센트 값이 들어 있게
됩니다.
<리스트 1> CPU 사용량 가져오기
<?php
// CPU 사용
$host = 'www.*****.com';
$oid = '.1.3.6.1.4.1.2021.11.11.0';
$timeout = 1;
// enterprises.ucdavis.systemStats.ssCpuIdle.0
$ssCpuIdle = @snmpget($host, 'public', $oid, $timeout);
// 값을 구하지 뭇했다면
if ($ssCpuIdle === false) {
$ssCpuUser = 'Error';
} else {
//(user, system) = 100 - idle
$ssCpuUser = 100 - $ssCpuIdle;
// CPU 사용
$ssCpuUser = $ssCpuUser . '%';
}
// cpu 사용량
echo $ssCpuUser;
?>
출력은 10%, 20% 등으로 해주면 됩니다. 그러나 여기서 구하고자 했던 값은 현재 cpu 사용량이었습니다.
그런데 왜 cpu 사용량을 구하지 않은 것일까요? 그 이유를 알기 위해서는 먼저 snmp에서 가져올 수 있는 cpu 관련 값을
알아야 합니다.
◆ snmp cpu 관련 값
- ssCpuUser
cpu user 값을 가져옵니다.
- ssCpuSystem
cpu system 값을 가져옵니다.
- ssCpuIdle
cput idle 값을 가져옵니다.
ssCpuUser + ssCpuSystem + ssCpuIdle = 100(%)
◆ 현재 cpu 사용량
ssCpuUser + ssCpuSystem
cpu 사용량 값을 퍼센트로 가져오게 됩니다. 세 가지 값을 합하면 100이 됩니다. 그래서 cpu idle 값을
가져온 후에 ‘100-idle’ 해주면 현재 cpu 사용량이 나오게 됩니다. 이 값은 cpu 사용의 퍼센트를 의미하므로 %를
붙여서 출력해 주면 됩니다.
echo $ssCpuUser . '%';
snmpget 함수를 이용해서 cpu 관련 값들을 가져오는 방법을 알아봤습니다.
메모리 관련 값 가져오기
snmpget 함수를 이용해서 메모리 관련 값을 가져오는 방법 또한 cpu의 값을 가져오는
것과 비슷합니다. 여기서 먼저 알아야할 것은 메모리 값을 가져오는데 필요한 SNMP OID 값입니다. <리스트 2>를
보면 메모리 관련 값을 가져오는 예가 있습니다. 먼저 값을 가져올 서버와 메모리 관련 OID 값을 지정합니다.
◆ 메모리 Free 구하기
// enterprises.ucdavis.memory.memTotalFree.0
$memTotalFree = @snmpget($host, 'public', $oid, $timeout);
메모리 Free량을 구하는 것입니다. 값을 구했을 경우에는 12444, 45442 이렇게 남은 메모리 량을 리턴하게
됩니다. 이 값은 KB 단위이므로 출력하고자 할 경우에는 K를 붙여서 12444K 이런 식으로 출력해 주면 됩니다.
◆ 전체 메모리 크기 구하기
// enterprises.ucdavis.memory.memTotalReal.0
$memTotalReal = @snmpget($host, 'public', $oid, $timeout);
SNMP에서 구하는 값은 실제 메모리 크기와는 차이가 있습니다. 메모리는 두 가지 값을 구했습니다. 그 이유는
무엇일까요? 그것은 남은 메모리의 크기를 퍼센트로 표현하기 위해서는 전체 메모리의 크기를 알아야 하기 때문입니다. cpu는
퍼센트 값을 리턴하기 때문에 상관이 없지만 메모리는 크기를 리턴하기 때문에 전체 메모리 크기와 Free 메모리 크기를 구해서
퍼센트를 계산해 주면 됩니다.
<리스트 2> SNMP 함수로 메모리 관련 값 가져오기
<?php
// 메모리 사용량 구하기
$host = 'www.*****.com';
$oid = '.1.3.6.1.4.1.2021.4.11.0';
$timeout = 200000;
// enterprises.ucdavis.memory.memTotalFree.0
$memTotalFree = @snmpget($host, 'public', $oid, $timeout);
if ($memTotalFree === false) {
memTotalFree = 'Error';
} else {
$memTotalFree = $memTotalFree . 'K';
}
id = '.1.3.6.1.4.1.2021.4.5.0';
// enterprises.ucdavis.memory.memTotalReal.0
$memTotalReal = @snmpget($host, 'public', $oid, $timeout);
if ($memTotalReal === false) {
$memTotalReal = 'Error';
} else {
$memTotalReal = $memTotalReal . 'K';
}
echo '메모리 크기 : ' . $memTotalReal;
echo '메모리 free : ' . $memTotalFree;
?>
SNMP는 시스템 리소스를 사용한다
SNMP 값을 가져오려면 일단 명령을 실행하는 서버와 값을 가져오려고
하는 서버에 모두 SNMP가 설치되어 있어야 합니다. 두 서버에 모두 설치가 되어 있으면 원하는 값을 가져올 수 있게 됩니다.
그렇다면 SNMP 값을 가져오는데 어느 정도의 시스템 리소스를 사용하게 될까요? 그것은 어떤 SNMP 값을 가져오는가에 따라서
다르게 됩니다. 그리고 시스템의 사양에 따라서도 조금씩 차이가 있습니다.
SNMP 값을 가져오는 데 해당 시스템의 리소스를 너무 많이 차지하게 된다면 서버에 영향을 미칠 수 있으므로 먼저 테스트해 보는 것이 좋습니다. SNMP 값을 가져오는 데는 주로 cpu system 리소스가 사용됩니다. 앞에서 테스트했던 cpu, Load Averages 값을 가져오는 것은 1% 미만의 cpu system을 사용하게 됩니다. 그러나 메모리의 값을 가져오는 것은 10% 정도까지 cpu system 리소스를 사용할 수도 있습니다. 물론 서버마다 차이가 있으니 테스트해 보면 됩니다.
그렇다면 1초에 한번씩 cpu 값을 가져오는 것은 큰 문제가 없어 보입니다. 해당 시스템을 모니터링하려면 1초에 한 번씩 값을 가져와서 출력해 주기 위해서입니다. 그러나 메모리의 값을 1초에 한 번씩 가져오는 것은 뭔가 문제가 있어 보입니다. 왜일까요? 1초에 한 번씩 해당 서버의 cpu system 리소스를 사용하게 되면 10% 정도의 cpu system 리소스를 사용하게 되기 때문에 뭔가 문제가 있어 보입니다. 그리고 프로그램을 하나만 실행시키는 것이 아니라 여러 사람이 모니터링 프로그램을 실행시켜서 사용하고 있다면 1초에 한 번씩 메모리 값을 가져오는 것은 문제가 있습니다. 그럴 경우에는 적당히 간격을 조정하면 됩니다. 한 5초 정도의 주기로 값을 가져오면 될 것입니다. 1초, 5초에 한 번씩 값을 가져오는 이유는 실시간 모니터링을 위해서입니다.
여러 서버의 Load Averages 구하기
서버가 여러 대 있을 때 현재 서버의 Load Averages를 보고자
할 경우 일반적으로는 리눅스에서는 서버에 접속해서 top 명령어를 실행해서 봐야 합니다. 물론 서버가 몇 대 없다면 충분히
가능한 일이겠지만 서버가 몇 십 대가 있을 경우 어떻게 해야 할까요? 일일이 서버에 접속해서 top 명령을 실행해서 결과를
보려고 해도 한참 걸릴 것입니다. 그러나 PHP에서 SNMP 함수를 이용한다면 간단하게 모든 서버의 Load Averages
값을 구할 수 있습니다. 그리고 더 중요한 것은 Load Averages 값이 큰 순서대로 정렬하는 것도 가능하다는 것입니다.
Load Averages 값이 크다는 것은 해당 서버의 부하가 높다는 것입니다. 어떤 서버의 Load Averages 값이
높은지 쉽게 파악이 가능하다는 것입니다.
<리스트 3> 여러 서버의 Load Averages 구하기
<?php
// 모니터링할 서버 목록
$hostList = array('server***1.net',
'server***2.net',
'server***3.net',
'server***4.net',
'server***5.net');
// 1분 Load Averages
$oid = '.1.3.6.1.4.1.2021.10.1.6.1';
$timeout = 1;
$sort = 'Desc';
// 각 서버의 Load Averages 값 구하기
for($z = 0; $z < $hostList; $z++) {
$host = $hostList[$z];
$valList[$host] = @snmpget($host, 'public', $oid, $timeout);
}
'Develop! > php' 카테고리의 다른 글
PHP를 이용한 다중 연결 소켓 통신 (2) (0) | 2011.10.07 |
---|---|
PHP를 이용한 다중 연결 소켓 통신 (1) (0) | 2011.10.07 |
두 날짜 사이의 차이 구하기 (0) | 2007.01.09 |
대량 메일 발송 삽질 후기... (9) | 2006.11.10 |
에디터 플러스에서 php로 콘솔 출력하기.. (0) | 2006.11.08 |
'Develop!/php'의 다른글
- 현재글[펌]PHP로 구현하는 시스템 모니터링툴