1. iostat
  2. 별도의 설치 필요없음, 물리적 드라이버 별로 기본적인 Disk Read/Write 볼 수 있음
  3. 한 개 이상의 디스크 드라이브에 대한 입출력 통계와 CPU 활용량

    arg-cpu
    %user
    %nice
    %system
    %iowait
    %steal
    %idle
    마지막 재부팅 이후의 평균 CPU 활용량 어플리케이션 등 사용자 모드에 소모된 시간 nice를 사용하여 스케줄링 우선순위가 바뀐 프로세스에 소모된 시간 시스템(커널)이 사용한 시간 디스크I/O 요청 때문에 CPU가 대기한 시간 다른 가상 CPU가 서비스하는 동안 비자발적으로 대기한 시간 대기한 시간
    Device
    tps
    kB_read/s
    kB_wrtn/s
    kB_read
    kB_wrtn
    디바이스 구분 초당 전송(입출력) 수 초당 읽혀진 KB (Blk일 경우 512바이트 블록수) 초당 쓰여진 KB (Blk일 경우 512바이트 블록수) 지금까지 읽혀진 KB(Blk일 경우 512바이트 블록수) 지금까지 쓰여진 KB(Blk일 경우 512바이트 블록수)
  4. vmstat
  5. 별도의 설치 필요없음, 시스템의 리소스 상황(CPU, I/O, Memory)을 모니터링 할 수 있음 (http://jikime.tistory.com/286)

  6. vmstat(옵션없음) - 마지막 부팅 이후의 평균값

  7. vmstat 2 10 => 2초 간격으로 10회 정보 갱신

    procs memory swap io system cpu
    r b w swpd free buff cache si so bi bo in cs us sy id wa
    현재 실행중인 프로세스의 수(CPU 접근 대기 중인 실행 가능 프로세스 수) 인터럽트가 불가능한 sleep 상태에 있는 프로세스의 수 (I/O 처리를 하는 동안 블럭 처리된 프로세스) 강제로 스왑아웃된 프로세스 사용하고 있는 swap 메모리 양(사용된 가상 메모리 용량) 사용가능한 메모리 양 버퍼로 사용되고 있는 메모리 양 캐시로 사용되고 있는 메모리 양 swap in(디스크에서 메모리로 스왑된 메모리 용량) swap out(디스크로 스왑되어 나간 메모리 용량) 초당 블럭 디바이스로 보내는 블럭 수(블록 장치로 보내진 블록) 초당 블럭 디바이스로부터 받은 블럭 수(블록 장치에서 받아온 블록) 초당 인터럽트 되는 양 초당 context switch되는 양 사용자의 CPU 사용 시간 비율(CPU가 사용자 수준 코드를 실행한 시간, 백분율 단위) 시스템의 CPU 사용 시간 비율(CPU가 시스템 수준 코드를 실행한 시간, 백분율 단위) CPU idle time(백분율 단위) 입출력 대기
    1. top
    2. 별도의 설치 필요없음, CPU 점유 프로세스들을 실시간으로 조회하는 명령어 (http://weezzle.net/1360)

    • 1줄 top : 시스템의 전반적 상태(가동시간 등)

    • 2줄 Tasks : 프로세스들의 상황

    • 3줄 CPU : CPU의 상황

    • 4줄 Mem : 메모리 상황

    • 5줄 Swap : 스왑 메모리 상황

    • 6줄

      PID
      USER
      PR
      NI
      VIRT
      RES
      SHR
      S
      %CPU
      %MEM
      TIME+
      COMMAND
      프로세스 ID 프로세스를 실행시킨 사용자 ID 프로세스의 우선순위 NICE 값 가상 메모리의 사용량(SWAP+RES) 현재 페이지가 상주하고 있는 크기(Resident Size) 분할된 페이지, 프로세스에 의해 사용된 메모리를 나눈 메모리의 총합 프로세스의 상태(Sleeping, Running, sWapped out process, Zombies) 프로세스가 사용하는 CPU의 사용율 프로세스가 사용하는 메모리의 사용율 CPU TIME, hundredths 실행된 명령어
    1. free
    2. 시스템의 실제메모리와 스왑메모리에 대한 사용현황을 확인할 수 있는 명령어 (http://blog.naver.com/PostView.nhn?blogId=jwmoon74&logNo=100174011942)
    • 1줄 Mem : 시스템의 물리적인 메모리에 대한 사용량을 각 필드 단위로 표시

      total
      used
      free
      shared
      buffers
      cached
      전체 메모리의 용량으 Kbyte단위(default)로 표시 현재 시스템에서 사용중인 메모리의 량을 Kbyte 단위로 표시 현재 시스템에서 사용중이지 않은 메모리의 량을 Kbyte단위로 표시 현재 시스템에서 공유한 메모리의 용량을 표시 현재 시스템에서 buffering된 메모리의 량을 표시 현재 시스템에서 caching된 ㅣ메모리의 량을 표시
    • 2줄 -/+ buffers/cache : 현재 캐시 메모리에서 버퍼링된 사용량을 표시(used/free)
    • 3줄 Swap : 서버설치 시에 결정한 스왑메모리의 량, 스왑메모리는 디스크의 일부분을 메모리로 잡아서 설정되기 때문에 스왑메모리가 많이 사용되고 있다는 것은 시스템의 전체적인 속도가 떨어진다는 것을 의미하며 지속적으로 스왑메모리가 사용된다는 것은 결국 실제 메모리를 증설해야 한다는 것이다.

      total
      used
      free
      시스템의 전체 스왑메모리의 량을 표시 전체 스왑메모리 중에서 현재 사용중인 스왑메모리의 량을 표시 전체 스왑메모리중에서 사용되지 않고 남아 있는 메모리의 량
    1. iotop
      1. 별도의 설치 필요함, Python 2.5+, linux kernel 2.6.20+ 이 2개의 프로그램이 기본적으로 설치되어 있어야 함
      TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND

     

     


    CPU - perf, top, htop

    Memory - valgrind, smem

    Disk I/O - nmon, bonnie, sysstat

    Network - netperf, iftop, netstat

     

     

    출처 : http://visu4l.tistory.com/398

    Memory Allocator for Multithreaded Applications

    출처 : http://www.mimul.com/pebble/default/2011/05/15/1305469792430.html 

     

    응용 프로그램에서 메모리 사용은 필수 불가결한 거죠. 그런데도 메모리에 대한 사용상 효율, 성능을 잘 고려하지 않고 그냥 있는 malloc을 사용하고 말죠. 그런데 트래픽이 많은 서비스가 요즘 많아지다보니 메모리 사용에도 신경을 써야하는 경우가 많습니다.
    그래서 메모리 할당에 관해 정보를 정리하고 공유합니다.


    메모리를 할당받기 위해 사용하는 malloc()함수는 일반적으로 glibc에 포함된 메모리 할당자에서 구현이 되어 있습니다. 그리고 메모리 할당자는 ptmalloc입니다.
    메모리 할당자의 역할은 brk/sbrk/mmap등을 사용해서 시스템으로부터 큰 메모리 영역을 할당 받아서, 이것을 적절하게 분할하여 어플리케이션이 요청하는 메모리 할당을 처리하게 됩니다.
    하지만, 빈번하게 메모리를 할당/해제하고 수십 개의 쓰레드가 동작하는 프로그램에서는 어쩔 수 없이 메모리 단편화(Memory Fragmentation)가 발생하여 메모리 사용량이 늘어나게 되죠.
    그래서 규모가 큰 어플리케이션들은 glibc의 기본 메모리 할당자인 ptmalloc이 메모리 단편화 문제가 심하고, multi thread, multi processor에 대한 고려가 적어서 performance bottleneck이 존재하여 다른 메모리 할당자를 사용하는 경우가 있습니다.


    데이터 섹션(메모리 사용 구조)

     - 전역 메모리(Global Memory) : 지역 함수(Local Function), 전역 변수(Global Variable), 정적 변수(Static Variable)
     - 스택 메모리(Stack Memory) : 지역변수와 매개 변수가 저장된 곳. 컴파일 타임에 크기 결정. 메모리 생명 주기를 알기 때문에 단편화가 안일어남.
     - 힙 메모리(Heap Memory) : 동적 메모리 할당을 위한 곳. 프로그래머가 할당 및 해제해야 함. 런타임에 크기 결정. 메모리 생명 주기를 모르기 때문에 단편화가 일어남.

    컴파일러 및 링커가 메모리 할당 기능을 수행할 때에는 메모리 단편화가 일어나지 않습니다. 왜냐하면 컴파일러가 데이터의 수명을 알고 있기 때문입니다.
    메모리 할당자는 기본적으로 오버헤드, 내부 단편화, 외부 단편화 등 3가지 측면에서 메모리를 낭비합니다.

    메모리 낭비 종류

     - 오버헤드 : 메모리 할당자는 할당 상태를 설명해 주는 일부 데이터를 저장해야 하는데. 즉, 모든 자유 블록의 위치, 크기, 소유정보, 그리고 내부 상태와 관련된 정보를 저장해야 합니다. 일반적으로 메모리 할당자가 이러한 오버헤드(부가) 정보를 저장하기에 가장 좋은 장소는, 할당자가 자체 관리하는 메모리.
     - 내부 단편화 : 모든 메모리 할당 작업은 프로세서 아키텍처에 따라 4, 8, 16으로 나뉠 수 있는 주소에서 시작되어야 함. 이렇게 미리 정의된 크기로만 클라이언트에게 블록을 할당하는 데는 또 다른 이유가 있을 수 있다. 만약 클라이언트가 41바이트 블록을 요청하면 42, 48 또는 그 이상의 바이트를 얻게 된다. 클라이언트가 요청한 크기를 반올림한 결과 남게 되는 여분의 공간. 이것이 내부 단편화.
     - 외부 단편화 : 애플리케이션이 연속해서 세 블록을 할당한 후, 가운데를 제거하면 외부 단편화가 발생.


    Memory Allocator 종류

     - tcMalloc : Google에서 만들었고 오픈 소스며, 메모리 프로파일 기능도 제공함. Linux, 작은 사이즈의 allocation에 최적화 된 것, MacOsx, Windows 지원. 레퍼런스 가장 많음. 임베드 시스템에도 많이 활용됨, NUMA 아키텍처 지원
     - jemalloc : 오픈 소스며, Linux ,MacOsx에 최적화 되었고 Windows도 지원. FireFox, Facebook에서 쓰여 레퍼런스가 늘어가고 있음. NUMA 아키텍처 지원은 아직 레퍼런스 찾지 못함
     - nedMalloc : 오픈소스며 간단하고 Windows에 최적화. dlmalloc을 뿌리로 둠.

    싱글 스레드 환경에서는 ptmalloc과 위의 메모리 관리자와의 성능과 효율이 크게 다르지 않을 수 있고 멀티 쓰레드 환경에서 위의 메모리 할당자를 사용하므로써 많은 성능 향상을 보았다고 함.


    tcMalloc 소개

     1. 작동 방식(성능 향상 방식)
      - 중앙 메모리 관리자와 쓰레드별 메모리 관리자를 구분하고 작은 크기(32K 이하)의 메모리 할당/해제 요청은 쓰레드별 메모리 관리자가 처리하고, 부족할 경우 중앙 메모리 관리자에서 얻어오는 방식으로 처리함.
      - 큰 메모리(32K 이상)는 전역 관리자에서 페이지 크기(4K) 단위로 클래스를 나누어 mmap()을 이용하여 할당하는 함.
     2. 지원 환경
      - Linux (32 and 64 bit), Mac OSX, Windows (32 bit only), Solaris
      - NUMA-aware TCMalloc(NUMA아키텍처 지원됨)
     3. 사용 사례
      - Webkit, MySQL, HyperTable, Memcached, Redis, Nginx


    jemalloc 소개

     1. 작동 방식(성능 향상 방식)
      - 쓰레드별 메모리 관리자 Arena와 작은 단위의 잦은 메모리 할당의 경우, arena를 참조 하지 않고, 바로 malloc을 할 수 있도록, 각 스레드에게 thread cache라는 영역을 가지고 있어 성능 향상을 줌.
     2. 지원 환경
      - Linux(32, 64 bit), Windows, MacOSX
     3. 사용 사례
      - FireFox, FaceBook


    nedMalloc 소개

     1. 작동 방식(성능 향상 방식)
      - dlmalloc에서 출발했고, 오픈 소스며 내용은 간단하지만 성능도 좋다는 평으로 알려짐.
     2. 지원 환경
      - Windows(32) 최적화됨, MacOSX, Linux
     3. 사용 사례
      - 소소한 개인 사용자 위주. 윈도우 개발자들이 많이 채택함. 일부 Javascript 엔진에 사용


    SLAB Allocator

     - 슬랩은 내부 단편화 문제를 해결할 뿐만이 아니라 커널 내에서 흔히 일어나는 dynamic memory 할당의 overhead를 줄이기 위하여 캐싱하는 역할을 하여 성능 개선에도 큰 도움을 주고 있음.
     - 캐시는 관리가 필요한 오브젝트 종류별로(예를 들면task_struct, file, buffer_head, inode 등) 작성되고 그 오브젝트의 슬랩을 관리하고 슬랩은 하나 이상의 연속된 물리 페이지로 구성되어 있으며, 일반적으로 하나의 페이지로 구성된다. 캐시는 이러한 슬랩들의 복수개로 구성됨.
     - 자주 사용되는 오브젝트들을 미리 할당하여 놓고 사용자 요구가 있을 때 마다 바로 반환하는 것이다. 이것은 물리 메모리를 확보하기 위하여 검색 및 회수, 반환과 같은 긴 여행을 떠날 필요가 없으므로 시스템의 성능을 향상시킨다. 또한 다 사용된 오브젝트들을 반납받아 커널의 메모리 할당자에게 반환하지 않고 보관했다가 재사용하기 때문에 시스템의 성능을 향상시킬 수 있게 됨.


    응용 예(MySQL-tcMalloc)

     - MySQL 성능 향상 위한 tcMalloc 적용 예


    // 64bit 머신일 경우에만 필요함. libunwind
    wget http://download.savannah.gnu.org/releases/
      libunwind/libunwind-0.99-alpha.tar.gz
    tar zxvf libunwind-0.99-alpha.tar.gz
    cd libunwind-0.99-alpha/
    CFLAGS=-fPIC ./configure
    make CFLAGS=-fPIC
    make CFLAGS=-fPIC install
    
    wget http://google-perftools.googlecode.com/
       files/google-perftools-1.7.tar.gz
    tar zxvf google-perftools-1.7.tar.gz
    cd google-perftools-1.7/
    ./configure
    make && make install
    
    vi /etc/ld.so.conf
    /usr/local/lib 라인 추가
    /sbin/ldconfig
    
    vi /usr/local/mysql/bin/mysqld_safe
    export LD_PRELOAD=/usr/local/lib/libtcmalloc.so
    


    [참고 사이트]

     

     
     
    리눅스 랜카드 장치 모델명 확인
    리눅스 이더넷 모델명, 벤더 확인
    리눅스 NIC 카드 모델 확인
    • VM이 아니고, 인터페이스가 PCI인 경우에만 가능

    목차

      [숨기기

    모델명 확인

    명령어
    /sbin/lspci | grep -i Ethernet
    
    실행예시 (Dedi)
    [root@localhost ~]# /sbin/lspci | grep -i Ethernet
    04:00.0 Ethernet controller: NetXen Incorporated NX3031 Multifunction 1/10-Gigabit Server Adapter (rev 42)
    04:00.1 Ethernet controller: NetXen Incorporated NX3031 Multifunction 1/10-Gigabit Server Adapter (rev 42)
    04:00.2 Ethernet controller: NetXen Incorporated NX3031 Multifunction 1/10-Gigabit Server Adapter (rev 42)
    04:00.3 Ethernet controller: NetXen Incorporated NX3031 Multifunction 1/10-Gigabit Server Adapter (rev 42)
    0b:00.0 Ethernet controller: NetXen Incorporated NX3031 Multifunction 1/10-Gigabit Server Adapter (rev 42)
    0b:00.1 Ethernet controller: NetXen Incorporated NX3031 Multifunction 1/10-Gigabit Server Adapter (rev 42)
    11:00.0 Ethernet controller: NetXen Incorporated NX3031 Multifunction 1/10-Gigabit Server Adapter (rev 42)
    11:00.1 Ethernet controller: NetXen Incorporated NX3031 Multifunction 1/10-Gigabit Server Adapter (rev 42)
    71:00.0 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (rev 06)
    71:00.1 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (rev 06)
    7a:00.0 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (rev 06)
    7a:00.1 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (rev 06)
    
    → PCI 이더넷 장치가 12개 있다.
    실행예시 (VM)
    [root@localhost ~]# /sbin/lspci
    
    → 가상 머신에서는 lspci 결과가 나오지 않는다.

    기타

    벤더 및 서브시스템 모델명 확인

    보다 자세한 정보를 확인하려면 -m 옵션을 주면 된다.

    명령어
    /sbin/lspci -m | grep -i Ethernet
    
    실행예시
    [root@localhost ~]# /sbin/lspci -m | grep -i Ethernet
    04:00.0 "Ethernet controller" "NetXen Incorporated" "NX3031 Multifunction 1/10-Gigabit Server Adapter" -r42 "Hewlett-Packard Company" "NC375i Integrated Quad Port Multifunction Gigabit Server Adapter"
    04:00.1 "Ethernet controller" "NetXen Incorporated" "NX3031 Multifunction 1/10-Gigabit Server Adapter" -r42 "Hewlett-Packard Company" "NC375i Integrated Quad Port Multifunction Gigabit Server Adapter"
    04:00.2 "Ethernet controller" "NetXen Incorporated" "NX3031 Multifunction 1/10-Gigabit Server Adapter" -r42 "Hewlett-Packard Company" "NC375i Integrated Quad Port Multifunction Gigabit Server Adapter"
    04:00.3 "Ethernet controller" "NetXen Incorporated" "NX3031 Multifunction 1/10-Gigabit Server Adapter" -r42 "Hewlett-Packard Company" "NC375i Integrated Quad Port Multifunction Gigabit Server Adapter"
    0b:00.0 "Ethernet controller" "NetXen Incorporated" "NX3031 Multifunction 1/10-Gigabit Server Adapter" -r42 "Hewlett-Packard Company" "NC522SFP Dual Port 10GbE Server Adapter"
    0b:00.1 "Ethernet controller" "NetXen Incorporated" "NX3031 Multifunction 1/10-Gigabit Server Adapter" -r42 "Hewlett-Packard Company" "NC522SFP Dual Port 10GbE Server Adapter"
    11:00.0 "Ethernet controller" "NetXen Incorporated" "NX3031 Multifunction 1/10-Gigabit Server Adapter" -r42 "Hewlett-Packard Company" "NC522SFP Dual Port 10GbE Server Adapter"
    11:00.1 "Ethernet controller" "NetXen Incorporated" "NX3031 Multifunction 1/10-Gigabit Server Adapter" -r42 "Hewlett-Packard Company" "NC522SFP Dual Port 10GbE Server Adapter"
    71:00.0 "Ethernet controller" "Intel Corporation" "82571EB Gigabit Ethernet Controller" -r06 "Hewlett-Packard Company" "NC360T PCI Express Dual Port Gigabit Server Adapter"
    71:00.1 "Ethernet controller" "Intel Corporation" "82571EB Gigabit Ethernet Controller" -r06 "Hewlett-Packard Company" "NC360T PCI Express Dual Port Gigabit Server Adapter"
    7a:00.0 "Ethernet controller" "Intel Corporation" "82571EB Gigabit Ethernet Controller" -r06 "Hewlett-Packard Company" "NC360T PCI Express Dual Port Gigabit Server Adapter"
    7a:00.1 "Ethernet controller" "Intel Corporation" "82571EB Gigabit Ethernet Controller" -r06 "Hewlett-Packard Company" "NC360T PCI Express Dual Port Gigabit Server Adapter"
    

    벤더 목록 뽑기

    명령어
    /sbin/lspci -m | grep -i Ethernet | while read line
    do
            echo $line | awk '{split($0,a,"\""); print a[8]}'
    done
    
    실행예시
    [root@localhost ~]# /sbin/lspci -m | grep -i Ethernet | while read line; do echo $line | awk '{split($0,a,"\"); print a[8]}'; done
    Hewlett-Packard Company
    Hewlett-Packard Company
    Hewlett-Packard Company
    Hewlett-Packard Company
    Hewlett-Packard Company
    Hewlett-Packard Company
    Hewlett-Packard Company
    Hewlett-Packard Company
    Hewlett-Packard Company
    Hewlett-Packard Company
    Hewlett-Packard Company
    Hewlett-Packard Company
    

    서브시스템명 뽑기

    명령어
    /sbin/lspci -m | grep -i Ethernet | while read line
    do
            echo $line | awk '{split($0,a,"\""); print a[10]}'
    done
    
    실행예시
    [root@localhost ~]# /sbin/lspci -m | grep -i Ethernet | while read line; do echo $line | awk '{split(0,a,"\""); print a[10]}'; done
    NC375i Integrated Quad Port Multifunction Gigabit Server Adapter
    NC375i Integrated Quad Port Multifunction Gigabit Server Adapter
    NC375i Integrated Quad Port Multifunction Gigabit Server Adapter
    NC375i Integrated Quad Port Multifunction Gigabit Server Adapter
    NC522SFP Dual Port 10GbE Server Adapter
    NC522SFP Dual Port 10GbE Server Adapter
    NC522SFP Dual Port 10GbE Server Adapter
    NC522SFP Dual Port 10GbE Server Adapter
    NC360T PCI Express Dual Port Gigabit Server Adapter
    NC360T PCI Express Dual Port Gigabit Server Adapter
    NC360T PCI Express Dual Port Gigabit Server Adapter
    NC360T PCI Express Dual Port Gigabit Server Adapter
    

    같이 보기


     

     

    dmidecode 를 루트에서 실행하면 장비의 스팩을 출력해 준다.


    #dmidecode






    자세한 사용법은 http://bwhite.tistory.com/entry/Linux-%ED%95%98%EB%93%9C%EC%9B%A8%EC%96%B4-%EC%A0%95%EB%B3%B4-%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0-dmidecode-lshw



    출처 : http://blog.naver.com/PostView.nhn?blogId=affectionjs&logNo=140132417142


    회원 자동 가입 방지 코드가 필요해서 인터넷을 검색하다가

    GD라이브러리를 이용하여 간단히 만들 수 있을 것 같아서 만들어 보았다.

    이미지를 비튼다던가 아니면 글자를 읽어주던가 하는 이런 고급기능은 없다.

     

    준비물 - 배경이미지(없어도 됨), 각 글자 및 숫자 이미지(배경이미지와 겹치게 보이려면 배경이 투명인 PNG이미지가 좋다, 각 숫자 및 글자 이미지의 파일명은 숫자 및 글자와 같아야 한다. 예- 0.png, a.png 등)

    PHP설정에서 GD라이브러리를 포함하여야 한다.

     

    우선 직접 이미지를 보여주는 파일(secureimage.php)

    <?php

    $SI_CHAR_LEN = 5; // 보여줄 글자수
    $SI_IMAGE_WIDTH = 27; // 글자 이미지 하나의 폭
    $SI_IMAGE_HEIGHT = 35; // 글자 이미지 하나의 높이
    $SI_CHAR_ARRAY = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'); // 보여줄 글자 목록

    $img = imagecreatefrompng('images/copybg.png'); // 배경이미지를 읽어온다

    $char_num = count($SI_CHAR_ARRAY); // 글자목록 개수
    $RANDOM_KEY = '';
    $RANDOM_KEY_CHAR = '';
    for ($i = 0 ; $i < $SI_CHAR_LEN; $i++) {
     $RANDOM_KEY_CHAR = $SI_CHAR_ARRAY[rand(0, $char_num - 1)]; // 글자목록 중 임의로 한개를 선택한다.
    // $RANDOM_KEY .= $RANDOM_KEY_ARRAY[$i];

     $RANDOM_KEY .= $RANDOM_KEY_CHAR;

     $src = imagecreatefrompng('images/' . $RANDOM_KEY_CHAR . '.png'); // 선택된 임의의 글자 이미지를 읽어온다.
     imagecopy($img, $src, $SI_IMAGE_WIDTH * $i, 0, 0, 0, $SI_IMAGE_WIDTH, $SI_IMAGE_HEIGHT); // 배경이미지와 합친다
    }

     

    session_start();

    $_SESSION['SECURE_TEXT'] = $RANDOM_KEY; // 선택된 글자들을 세션변수에 저장한다.

    header('Content-type: image/gif');
    imagegif($img); // 이미지 뿌리기
    imagedestroy($img);
    ?>

     

    CAPTCHA 이미지 뿌리기

    <img src="secureimage.php" id="scureimage" />

    해당 이미지가 적용된 실제 예이다.

     

    CAPTCHA 이미지 갱신

    해당이미지를 읽을 수 없을 경우 이미지를 바꾸어 줘야 하는데 javascript 를 이용하면 된다.

    문제는 이미지를 갱신해도 소스가 같으면 브라우져가 캐시된 이미지를 보여주기때문에 갱신된 이미지를 보여주지 않는 경우가 있다

    이를 방지하기 위해 뒤에 쓰레기코드(?)를 추가해 준다.

     

    html코드

    <img src="secureimage.php?key=<?php echo rand(); ?>" id="scureimage" alt="중복가입방지코드" /><!-- captcha 이미지 -->

    <input type="text" name="securetext" /><!-- 텍스트 입력 박스 -->

    <a href="#secureimage" id="imagerefresh">[새로고침]</a><!-- 이미지 갱신 버튼 -->

     

    자바스크립트(jquery이용)

    $(document).ready(function(){

      $("a#imagerefresh").click(function(){ //  [새로고침] 클릭시

        $("img#securetext").attr("src", "secureimage.php?key=" + parseInt(Math.rand() * 100000, 10)); // 이미지 소스를 변경, 브라우져가 다른 이미지로 인식하도록 랜덤코드를 추가해준다.

        return false;

      });

    });

     

    입력된 텍스트가 맞는지 확인하는 법은 입력된 텍스트

    input#securetext 의 value값과 php세션에 저장되어있는 $_ SESSION['SECURE_TEXT']값을 비교하면 된다.

    form값을 통해 비교를 하던가 ajax를 이용하던가는 사용자 마음이다.

     

    PS. captcha 이미지는 시각장애인들은 인식할 수 없기 때문에 웹접근성에 부합하지 않는다. 이를 보완하기 위해 이미지를 음성으로 읽어주던가 아니면 이미지가 아닌 간단한 퀴즈를 보여주던가 하는 방법을 생각해 볼 수 있다.

     

    [출처] http://www.cyworld.com/psykey/3379396

    + Recent posts