내 블로그나 홈페이지에 검색엔진을 장착해 보고 싶다면 엔진으로 스핑크스(Sphinx)를 선택해보는 것도 좋을 것 같습니다. 오픈 소스이고 PHP, Perl, C/C++, 등의 프로그래밍 언어 API 를 제공하고 있으므로 PHP 로 개발된 텍스트큐브와 같은 설치형 블로그에 검색을 붙이려면 PHP 용 API 를 이용하며 될 것입니다. 이미 텍스트큐브에도 검색이 있지만 레코드수가 많아서 검색해야할 항목이 많아질 경우 검색 시간이 많이 소요되고 복잡한 조건의 검색을 할 수 없는 문제가 있습니다. 개발언어를 다룰 수 있다는 조건 하에 스핑크스 검색엔진을 사용해볼 것을 권해봅니다.
스핑크스 검색엔진이 어떤 것인지 체험 해보려면 간단히 아래에 설명하는 방법으로 설치하고 테스트 해보면 됩니다. 참고로 리눅스 CetOS 5.x 에서 테스트 되었습니다. 물론 소스 코드가 공개 되어 있으므로 윈도우즈와 다른 리눅스, 유닉스 계열 OS 를 사용할 수 있습니다.

[root@sphinx ~]# yum -y install mysql-devel
[root@sphinx ~]# cd /usr/local/src
[root@sphinx src]# wget http://www.sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz
[root@sphinx src]# tar xvzf sphinx-0.9.8.1.tar.gz
[root@sphinx src]# cd sphinx-0.9.8.1
[root@sphinx sphinx-0.9.8.1]# ./configure
[root@sphinx sphinx-0.9.8.1]# make
[root@sphinx sphinx-0.9.8.1]# make install


위와 같이 설치하면 아래와 같은 스핑크스 관련 파일들이 기본 폴더(/usr/local/bin)에 설치됩니다.

  /usr/local/bin/indexer
  /usr/local/bin/searchd
  /usr/local/bin/search
  /usr/local/bin/spelldump

또한 아래와 같은 설정 파일 샘플과 MySQL 용 SQL 샘플이 설치됩니다.

 /usr/local/etc/sphinx.conf.dist
 /usr/local/etc/sphinx-min.conf.dist
 /usr/local/etc/example.sql

MySQL 에 접속해서 테스트용 데이타베이스(test) 를 만들고 user 와 password 를 만들고 이 데이타베이스(test)에 권한을 부여 합니다. test로 데이타베이스를 정할 경우 이미 생성되 있으므로 권한 부여만 합니다.

[root@sphinx sphinx-0.9.8.1]# mysql -uroot -p
Enter password: ********
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 116
Server version: 5.0.45 Source distribution
 
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
 
mysql> grant all privileges on test.* to user@"localhost" identified by "password";
Query OK, 0 rows affected (0.05 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
 
mysql> exit
Bye
[root@sphinx sphinx-0.9.8.1]#


데이타베이스 설정이 완료 되었으면 스핑크스 셋팅 파일을 만들어줍니다.

[root@sphinx sphinx-0.9.8.1]# vi /usr/local/etc/sphinx-min.conf.dist
[root@sphinx sphinx-0.9.8.1]# cp /usr/local/etc/sphinx-min.conf.dist /usr/local/etc/sphinx.conf
[root@sphinx sphinx-0.9.8.1]# cat /usr/local/etc/sphinx.conf
#
# Minimal Sphinx configuration sample (clean, simple, functional)
#
source src1
{
        type                                    = mysql
 
        sql_host                                = localhost
        sql_user                                = user
        sql_pass                               = password
        sql_db                                  =
test
        sql_port                                = 3306  # optional, default is 3306
 
        sql_query                               =
                SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content
                FROM documents
 
        sql_attr_uint                   = group_id
        sql_attr_timestamp              = date_added
 
        sql_query_info                  = SELECT * FROM documents WHERE id=$id
}
index test1
{
        source                                  = src1
        path                                    = /var/data/test1
        docinfo                                 = extern
        charset_type                    = sbcs
}
indexer
{
        mem_limit                               = 32M
}
searchd
{
        port                                    = 3312
        log                                             = /var/log/searchd.log
        query_log                               = /var/log/query.log
        read_timeout                    = 5
        max_children                    = 30
        pid_file                                = /var/log/searchd.pid
        max_matches                             = 1000
        seamless_rotate                 = 1
        preopen_indexes                 = 0
        unlink_old                              = 1
}
[root@sphinx sphinx-0.9.8.1]#


나 의 데이타베이스 설정에 맞게 위와 같이 설정이 완료되면 아래와 같이 스핑크스에서 제공하는 샘플 테이블을 MySQL 에 만들어줍니다. 그리고 커멘드라인 프로그램 indexer 를 실행해서 검색을 위한 인덱스를 생성합니다. 인덱싱이 완료 되면 커멘드라인 프로그램 search 를 실행해서 검색을 할 수 있습니다.

[root@sphinx sphinx-0.9.8.1]# mysql -uroot -p test < /usr/local/etc/example.sql
Enter password: ********
[root@sphinx sphinx-0.9.8.1]# mkdir /var/data
[root@sphinx sphinx-0.9.8.1]# indexer test1
[root@sphinx sphinx-0.9.8.1]# search number
Sphinx 0.9.8.1-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
 
using config file '/usr/local/etc/sphinx.conf'...
index 'test1': query 'number ': returned 3 matches of 3 total in 0.000 sec
 
displaying matches:
1. document=1, weight=1, group_id=1, date_added=Sat Dec  6 11:42:12 2008
        id=1
        group_id=1
        group_id2=5
        date_added=2008-12-06 11:42:12
        title=test one
        content=this is my test document number one. also checking search within phrases.
2. document=2, weight=1, group_id=1, date_added=Sat Dec  6 11:42:12 2008
        id=2
        group_id=1
        group_id2=6
        date_added=2008-12-06 11:42:12
        title=test two
        content=this is my test document number two
3. document=4, weight=1, group_id=2, date_added=Sat Dec  6 11:42:12 2008
        id=4
        group_id=2
        group_id2=8
        date_added=2008-12-06 11:42:12
        title=doc number four
        content=this is to test groups
 
words:
1. 'number': 3 documents, 3 hits
 
[root@sphinx sphinx-0.9.8.1]#


위와 같이 인덱싱이 완료되고 search 커멘드라인 명령어를 이용해 "number" 라는 검색어(키워드)로 검색하면 검색결과 3개의 문서가 검색되었다고 알려줍니다.
PHP 로 검색엔진을 제어하기 위해 아래와 같이 검색 데몬(searchd)을 띄우고 PHP 용 API 를 이용해서 검색할 수 있습니다.

[root@sphinx sphinx-0.9.8.1]# /usr/local/bin/searchd
Sphinx 0.9.8.1-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
 
using config file '/usr/local/etc/sphinx.conf'...
creating server socket on 0.0.0.0:3312
[root@sphinx sphinx-0.9.8.1]# cd api
[root@sphinx api]# php test.php number
Query 'number ' retrieved 3 of 3 matches in 0.000 sec.
Query stats:
    'number' found 3 times in 3 documents
 
Matches:
1. doc_id=4, weight=100, group_id=2, date_added=2008-12-06 11:42:12
2. doc_id=1, weight=1, group_id=1, date_added=2008-12-06 11:42:12
3. doc_id=2, weight=1, group_id=1, date_added=2008-12-06 11:42:12
[root@sphinx api]#


위 와 같이 검색 데몬 searchd 를 띄우고 샘플 PHP 소스 파일 test.php 를 실행하면 검색 결과를 확인할 수 있습니다. 샘플 소스 상단을 보면 sphinxapi.php 라는 파일을 Include 합니다. 이것이 PHP 용 API 입니다.

간단하게 스핑크스를 설치하고 테스트도 해봤습니다. 이제 내 블로그 데이터를 인덱싱하고 이를 검색할 수 있도록 검색 페이지를 만드는 일만 남았습니다.

오픈 소스 검색 엔진 스핑크스(Sphinx) 홈페이지
    -
http://www.sphinxsearch.com/
스핑크스(Sphinx)로 PHP로 커스텀 검색 엔진 구현하기
    -
http://www.ibm.com/developerworks/kr/library/os-php-sphinxsearch/index.html

출처 : http://v2.kitiwit.com/

sphinx 검색엔진 설정을

  charset_type  = utf-8
  charset_table = 0..9, A..Z->a..z, _, a..z, U+AC00..U+D7A3, U+1100..U+1159, U+1161..U+11A2, U+11A8..U+11F9
  ngram_len      = 1
  ngram_chars = U+AC00..U+D7A3

이렇게 하면 끝-

출처 http://spat.egloos.com/5241033



1. 서론

  스핑크스(sphinx) 1.x 버전에서 부터는 RT Index를 지원을 해주고 있다. 하지만 설명에서 이것저것 지원이 안되는 기능들이 좀 있는 것 같아 merging index를 테스트 해보기로 했다. 이 부분 또한 사이트(http://www.sphinxsearch.com)에 설명이 되있다. 하지만 이거 하면서 삽질한것들을 나중에 사이트만 보고 다시 하게 되면 또 할듯 해서 이렇게 글로 남겨 놓는다.


2. 목적

  documents라는 테이블에 100개의 row가 존재한다고 해보자. 우리는 이 100개의 row를 indexing해서 search 하게 될것이다. 그런데 여기서 추가적으로 10개의 데이터가 들어와 총 데이터가 110개가 됐을 경우를 생각해 보자. 이 경우 우리는 어떻게 해야 할까? 새롭게 Indexing을 해야 할까? 지금 예를 든것과 같이 데이터가 작을 경우는 문제가되지 않겠지만 데이터가 900만건 정도 되는 큰 데이터일 경우 상당한 문제가된다. 대략 1분 40초 가량의 인덱싱 시간을 소비하게 되는데 이걸 매번 할수는 없는 일이다. 비용적으로 말이 안된다. 그렇기 때문에 ReIndexing이 필요하다.


3. 테이블 정보 셋팅

  사이트에 보면은 main과 delta 라는 인덱스를 생성하고 delta라는 인덱스를 이용해 main에 최신 데이터를 갱신해 주게끔 설명이 되있어 설명에 따라 테스트를 진행했습니다.


테이블 정보(스핑크스 샘플 및 사이트의 예제를 통해 만든 테이블) :

document_counter(counter_id,max_doc_id)

documents(id, group_id, group_id2, date_added, title, content)


  1) document_counter의 경우 main 인덱스가 인덱싱한 documents의 마지막 id 값을 가지게 됩니다.

  2) documents의 경우는 실질적인 데이터를 가지게 됩니다.


4. sphinx.conf 셋팅

  config 파일의 경우 내용이 좀 길어서 첨부하겠습니다. 그리고 필요한 부분만 따로 글로 옮기겠습니다.


  - source main

    이곳에서는 쿼리만을 보면 될듯 합니다.

    그리 어렵지 않으니 한번 보면 알수 있을듯 합니다.

  우선 REPLACE INTO 부분을 보시게되면은 documents에 id의 max값을 구해 document_counter에 넣어주는것을 볼수 있습니다. 이것은 아래 sql_query를 보면은 왜 이렇게 하는지 알수 있을 겁니다. 결국 main의 인덱싱 되는 데이터의 범위를 정해주는 역할을 합니다.


  - source delta : main

    delta의 경우 main을 상속(?) 받습니다. 상속이라는 말이 맞는지 모르겠습니다. 하지만 여기서도 쿼리를 구성해서 실행을 하게 됩니다. 아래의 그림의 쿼리를 보게되면 main과 반대로 새로 들어온 데이터를 로드해오는것을 알수 있습니다. 결국 delta의 경우 최신 데이터를 가지고 있게 됩니다.


  중요한 부분은 여기까지입니다 그리고 나머지는 index 부분이 있는데 이 부분은 경로 및 charset_ 등을 셋팅해주는 작업이니 첨부된 config 파일을 보시면 알수 있을 듯 합니다.


5. 사용

  config가 셋팅이 됐다면 이제 해야 할 일은 indxer를 이용해 인덱싱 하는 일만 남았습니다.

  bash$ indexer main

  bash$ indexer delta


  데이터를 삽입 후

  bash$ indxer delta

  bash$ indexer --merge main delta --rotate


  ※ 저 같은 경우 위의 경우를 하는데 에러가 나서 한참 삽질을 했는데요. 결국 원인은 config 셋팅 문제 였습니다. 만일 안된다고 하시면 config 셋팅 부분을 다시 한번 살피시는게 좋을듯 합니다.


  위와 같이 indexer를 이용해 merge 한 후 search를 이용해 검색을 하게 되면 아래와 같이 main과 delta 두 군데에서 결과를 얻을수 있게 됩니다. 만약 데이터가 한쪽에만 있다고하면 한쪽에서 검색이 됩니다.


 

이게 스핑크스(sphinx)에서 말하는 분산 인덱스 기능인듯 합니다. 여러개로 인덱스를 나눠 놓고 search를 할 경우 searchd에서 알아서 여러개의 인덱스 파일에서 데이터를 match 시켜 찾는 겁니다. 분산처리를 하게 될 경우 매우 유용할듯 하지만 현재 테스트 중인 저에게는 그다리 필요가 없네요^^;


6. 마치며

  config 셋팅 때문에 삽질좀 했습니다. 테스트 할것들이 한두개가 아닌데 테스트 할 부분 정리를 하다가 갑자기 reindexing이 생각이 나서 찾아서 만들어 본다는게 시간이 꾀 걸렸네요. 이 다음에는 시스템 리소스를 얼마나 효율적으로 사용을 할수 있는지 조사를 해봐야 할듯 합니다. 이 부분 빨리 테스트를 진행하고 api를 활용해서 검색 부분을 만들어봐야 할듯 합니다. 


1. 준비물

   1) 스핑크스(sphinx) 다운로드- http://sphinxsearch.com/downloads/

   2) MySQL 다운로드 - http://dev.mysql.com/downloads/


2. 설치

   1) 다운로드 받은 스핑크스 파일을 /usr/local/src/ 경로에 복사

   2) tar xvfz sphinx-2.0.1-beta.tar.gz 압축 해제

   3) 스핑스크 압축 해제 후 폴더로 이동

   4) ./configure

   5) make (조금 기다려야 합니다.)

   6) make install


   위의 6단계를 거치면 우선 스핑스크 설치는 완료입니다. 제대로 설치 됐는지 확인을 해봐야겠죠..?

 

3. 컴피그 셋팅 및 한글 셋팅

  - 우선 /usr/local/etc/을 확인 합니다.

   파일 리스트를 확인하게 되면

   example.sql - 샘플로 사용할 테이블 정보 및 데이터 정보 쿼리가 들어 있습니다.

   sphinx-min-conf.dist - 잘 모르겠네요..ㅎ

   sphinx.conf.dist - DB 정보, 캐릭터 셋 정보, 인덱스 정보 등의 설정 정보를 담고 있습니다.


   위 파일 중 sphinx.conf.dist의 데이터를 수정합니다.

  1) 우선 가상 상위단에 보게되면은 데이터 베이스 셋팅 정보 부분이 있습니다. 저 부분에 자신의 데이터 베이스 정보를 적어 줍니다.

 

2) index 부분에서 charset_type, castset_table을 수정해 줍니다. 이 부분을 셋팅해야 한글을 사용할수 있습니다.

아래와 같이 셋팅을 해줍니다.

charset_type = urf-8

charset_table = 0..9, A..Z->a..z, _, a..z, U+AC00..U+D7A3, U+1100..U+1159, U+1161..U+11A2, U+11A8..U+11F9

 

※ 한글을 사용하기 위해서는 DB 캐릭터 셋 정보 또한 utf-8로 셋팅을 해줘야 한다는 겁니다. 이거 때문에 검색이 안되서 고생좀 했습니다.

 

우선 이렇게 하면은 기본 설정은 완성 됐습니다.

 

- 이번에는 /usr/local/bin/ 폴더로 이동합니다.

이곳에 이것저것 툴이 깔려 있습니다. 그중 바로 사용해 볼 것들은 indexer와 searchd 입니다.

우선 indxer는 위에서 설명한 컨피그 파일에서 셋팅된 쿼리와 DB 정보를 이용해 데이터를 가져와 document로 만들어 인덱싱 하게 됩니다. 이 과정을 거쳐야 검색을 할수 있게 됩니다.

1) searchd

 파일명 뒤에 d가 붙어 있죠. 이걸보면 대부분 아실거라 생각합니다. 이건 데몬 프로그램입니다. 이녀석이 하는일이 뭐냐 하면 백그라운드로 돌면서 스핑크스에서 제공해주는 API로 쿼리를 만들어 던져주면 그 쿼리를 처리하는 역할을 합니다. 그러니 PHP, JAVA, Ruby 등등 으로 API를 호출해서 검색을 하게 될 경우 이녀석은 항상 켜져 있어야 합니다.

 

2)indexer

 우선 indexer를 실행 하기 전 mkdir /var/data/ 폴더를 생성해 줍니다. 현지 컴피그 파일에 아마 저 경로로 셋팅이 되어있을 겁니다. 저 경로가 싫으신 분들은 컨피그 파일에서 셋팅 정보를 변경한뒤 디렉토리를 생성해 주시면 됩니다.

 

indexer [인덱싱 이름]

위와 같이 쳐주면 됩니다. 인덱싱 이름 같은 경우 임의로 정해주시면 됩니다.

저는 test1로 인덱싱 이름을 정했습니다. 그리고 테이블에 더미데이터로 900만건 정도의 데이터를 넣고 테스트를 진행했습니다. (C++로 제작되서 빠르다길래....) 그랬더니 1분 40초 가량이 걸리더군요. 현재 루신으로 테스트를 안해봐서 이게 빠른건지 모르겠습니다. 루신도 시간되는데로 테스트를 해봐야 할것 같습니다.

 

자~ 이렇게 되면은 검색할 준비가 다 됐습니다. 이제부터는 스핑크스에서 제공해주는 API로 구현된 샘플 코드들을 이용해서 검색을 해도 되고, 툴을 이용해서 해도 됩니다.

 

참고로 샘플 코드를 이용하려 한다면 PHP, JAVA 등이 될수 있는데요. JDK, PHP를 따로 설치를 해주셔야 합니다. 저는 우선 테스트를 위해 모두 설치를 해놨습니다.

 

- 검색 : 이런식으로 뜹니다. 900만건 정도의 데이터에서 검색을 해서 그런지 몰라도 속도는 빠르더군요. 거의 바로 뜹니다.


여기까지 설치 및 한글 셋팅 정보 입니다. 우선 이 부분들은 나중에 제가 보기 위해서 정리를 해놓으거니까 더 많은 내용이 필요하신 분들은 구글링.... 해주세요~ㅋ

'Search Engine > Sphinx' 카테고리의 다른 글

스핑크스 설정  (0) 2012.06.05
[설치/설정] 검색엔진]sphinx quick start  (0) 2012.02.13
Sphinx  (0) 2012.02.13
sphinx 검색엔진 한글 검색 설정  (0) 2012.02.13
스핑크스(sphinx) 검색 엔진 reindex  (1) 2012.02.13

[번역] PHP 코드를 최적화하는 40가지 팁

가끔 PHP로 웹페이지를 작성할 일이 있는데, 유용한 팁을 우연히 보게 되어 한글로 옮겨적어본다.

원문: Reinhold Weber씨의 40 Tips for optimizing your php Code

  1. 메쏘드가 static이 될 수 있다면 static으로 선언하라. 4배 빨라진다.
  2. echo가 print보다 빠르다.
  3. 문자열을 이어붙이지 말고, echo를 이용하여 여러 개의 파라미터를 적어라.
  4. for 루프을 위핸 최대값(탈출조건)을 루프 안에서가 아니고 루프 시작 이전에 지정하라.
  5. 메모리를 해제하기 위해 변수를 unset하라. 특히 커다란 배열은 그래야 된다.
  6. get, set, __autoload와 같은 마법을 피해라.
  7. require_once()는 비싸다.
  8. include와 require를 사용할 때, 경로를 찾는데 시간이 적게 걸리는 full path를 사용하라.
  9. 스크립트가 언제 실행했는지 알고 싶으면 time()보다 $_SERVER['REQUEST_TIME']이 좋다.
  10. 정규표현식보다는 가능하면 strncasecmp나 strpbrk, stripos를 사용하라.
    1. 역주
    2. strncasecmp: 두 문자열의 앞쪽 일부가 대소문자 구분없이 일치하는지 확인할 때 사용
    3. strpbrk: 문자 집합에 속한 특정 문자가 문자열에 나타나는지 확인할 때 사용
    4. stripos: 대소문자 구분없이 특정 문자열이 다른 문자열에 포함되는지 확인할 때 사용
  11. str_replace가 preg_replace보다 빠르지만, strtr은 str_replace보다 4배 빠르다.
  12. 만약 문자열 교체 같은 함수가 배열과 문자열을 인자로 받아들이면, 그리고 그 인자 리스트가 길지 않다면, 배열을 한 번에 받아들여서 처리하는 것 대신에 한 번에 문자열을 하나씩 넘겨서 처리하는 것을 고려해봐라.
  13. 여러 개의 if/else if 문장 대신에 select 문장을 사용하는 게 더 좋다.
  14. @를 이용한 에러 출력 방지는 매우 느리다.
  15. Apache의 mod_deflate를 켜라.
    1. 역주
    2. mod_deflate는 서버의 출력을 클라이언트에게 보내기 전에 압축하는 모듈임
  16. DB를 다 사용했으면 연결을 닫아라.
  17. $row['id']가 $row[id]보다 7배 빠르다.
  18. 에러 메시지는 비싸다.
  19. for 루프의 표현식 안에서 함수를 사용하지 마라. for ($x = 0; $x < count($array); $x)에서 count() 함수가 매번 호출된다.
  20. 메쏘드 안에서 지역 변수를 증가시키는 것이 거의 함수 안에서 지역 변수를 호출(증가?)하는 것만큼 빠르다.
  21. 전역 변수를 증가시키는 것이 지역 변수를 증가시키는 것보다 2배 느리다.
  22. 객체의 멤버변수를 증가시키는 것이 지역 변수를 증가시키는 것보다 3배 느리다.
  23. 값이 지정되지 않은 지역 변수를 증가시키는 것이 미리 초기화된 변수를 증가시키는 것보다 9~10배 느리다.
  24. 전역 변수를 함수 안에서 사용하지 않으면서 그저 선언하기만 해도 (지역 변수를 증가시키는 것만큼) 느려진다. PHP는 아마 전역 변수가 존재하는지 알기 위해 검사를 하는 것 같다.
  25. 메쏘드 호출은 클래스 안에서 정의된 메쏘드의 갯수에 독립적인 듯 하다. 왜냐하면 10개의 메쏘드를 테스트 클래스에 추가해봤으나 성능에 변화가 없었기 때문이다.
  26. 파생된 클래스의 메쏘드가 베이스 클래스에서 정의된 것보다 더 빠르게 동작한다.
  27. 한 개의 매개변수를 가지고 함수를 호출하고 함수 바디가 비어있다면(함수 내부에서 아무것도 실행하지 않는다면) 그것은 7~8개의 지역변수를 증가시키는 것과 똑같은 시간을 차지한다. 비슷한 메쏘드 호출은 마찬가지로 15개의 지역변수를 증가시키는 연산쯤 된다.
  28. 문자열을 이중 따옴표 대신에 단일 따옴표로 둘러싸는 것은 좀 더 빠르게 해석되도록 한다. 왜냐하면 PHP가 이중 따옴표 안의 변수를 찾아보지만 단일 따옴표 안에서는 변수를 찾지 않기 때문이다. 물론 문자열 안에서 변수를 가질 필요가 없을 때만 이렇게 사용할 수 있다.
  29. 문자열을 echo할 때 마침표 대신에 쉼표로 분리하는 것이 더 빠르다.
    1. 주의: 이것은 여러 문자열을 인자로 받아들이는 함수인 echo로만 작동한다.
  30. Apache에 의해 PHP 스크립트는 정적 HTML 페이지보다 최소 2에서 10배 느리게 서비스된다. 더 많은 정적 HTML 페이지와 더 적은 스크립트를 사용하려고 노력하라.
  31. PHP 스크립트는 캐시되지 않으면 매번 재 컴파일된다. 컴파일 시간을 제거함으로써 25~100%만큼의 성능을 증가시키기 위해 PHP 캐싱 도구를 설치하라.
  32. 가능한 한 많이 캐시하라. memcached를 사용하라. memcached는 고성능 메모리 객체 캐싱 시스템이다.
  33. 문자열을 가지고 작업하며 문자열이 특정 길이인지 확인할 필요가 있을 때, strlen() 함수를 쓸 것이다. 이 함수는 계산없이 zval 구조체에서 사용할 수 있는 이미 알려진 문자열 길이를 반환하기 때문에 매우 빠르다. 그러나 strlen()이 함수이기 때문에 여전히 조금 느리다. 왜냐하면 함수 호출은 언급된 함수의 실행 뒤에 lowercase와 hashtable lookup같은 여러 개의 연산을 호출하기 때문이다. 어떤 경우에는 isset() 트릭을 이용하여 코드의 스피드를 증가시킬 수도 있다.
    if (strlen($foo) < 5) { echo "Foo is too short"; }
    if (!isset($foo{5})) { echo "Foo is too short"; }

    isset()을 호출하는 것은 strlen()과는 달리 isset()이 언어 기본문법이고 함수가 아니기 때문에 함수 찾와 lowercase 작업을 필요로 하지 않으므로 strlen()보다 더 빠를 수도 있다. 이것은 가상적으로 문자열의 길이를 결정하는 실제 코드에 과부하가 없다는 것을 의미한다.

  34. 변수 $i의 값을 증가시키거나 감소키킬 때, $i++은 ++$i보다 조금 더 느릴 수 있다. 이것은 PHP의 특징이고 다른 언어에는 해당되지 않으니 좀 더 빨라질 것을 기대하면서 C나 Java 코드를 바꾸러 가지 마라. 안 빨라질 것이다. ++$i는 PHP에서 좀 더 빠른데 그것은 $i++에 4개의 opcode가 사용되는 대신에 3개만 필요하기 때문이다. 후증가는 사실 증가될 임시변수의 생성을 초래한다. 반면에 전증가는 원래 값을 직접 증가시킨다. 이것은 opcode가 Zend의 PHP optimizer처럼 최적화하는 최적화 기법의 하나이다. 모든 opcode optimizer들이 이 최적화를 수행하는 것은 아니고 많은 ISP와 server들이 opcode optimizer없이 수행되고 있기 때문에 명심하는 게 좋을 것이다.
  35. 모든 것이 OOP일 필요는 없다. 종종 그것은 너무 많은 과부하가 된다. 각각의 메쏘드와 객체 호출은 메모리를 많이 소비한다.
  36. 모든 데이터 구조를 클래스로 구현하지 마라. 배열도 유용하다.
  37. 메쏘드를 너무 많이 분리하지 마라. 어떤 코드를 정말 재사용할지 생각해봐라.
  38. 항상 메쏘드의 코드를 나중에 필요할 때 분리할 수 있다.
  39. 수많은 미리 정의된 함수를 활용해라.
  40. 매우 시간을 소비하는 함수가 있다면, C 확장으로 작성하는 것을 고려해봐라.
  41. 당신의 코드를 프로파일해봐라. 프로파일러는 코드의 어떤 부분이 가장 많은 시간을 소비하는지 보여준다. Xdebug 디버거는 이미 프로파일러를 포함하고 있다. 프로파일링은 전체적인 병목을 보여준다.
  42. Apache 모듈로 사용가능한 mod_gzip은 실행 중에 데이터를 압축하여 전송할 데이터를 80%까지 줄일 수 있다.

웹 2.0 스타일의 로딩 애니메이션 gif (또는 다른 타입의 이미지)를 구할 수 있는 사이트들과 자바스크립트 프레임워크를 사용하여 Loading  패널을 구현할 수 있게 하는 정보들을 모은 사이트들입니다.

사용자 삽입 이미지

http://www.ajaxload.info/

JQuery 를 사용하여 Loading 패널을 띄우기

http://docs.jquery.com/Ajax/load

YAHOO YUI 를 사용하여 Loading Panel 만들기
http://developer.yahoo.com/yui/examples/container/panel-loading.html

GIF loading images
http://www.webscriptlab.com/

Load Info GIF Generator
http://www.loadinfo.net/

출처 : http://www.youngsam.kr/

vmware server manual pdf!

'virtualization > vmware' 카테고리의 다른 글

Examples Using the VMware Virtual Disk Manager  (0) 2011.12.07

Daniel Vecchiato님(?)의 Using Zend Framework components in Code Igniter에서 잘 설명이 되어있는데요.

CodeIgniter가 아니더라도 일반 php 프로그래밍에서도 적용이 가능합니다.

참고할 부분은 include_path에 Zend Framework가 설치된 경로를 추가하는 부분인데요.

  1. ini_set('include_path', ini_get('include_path').':'.Zend Framework Path);

입니다. 기본적인 php 설명은 생략합니다. ^^;

다만 저는 개인적으로 만들어놓은 Framework를 사용하고 부족한 부분을 외부 Library는 따로 모아서 관리하고 최대한 가벼운 Library를 사용하기 위해 global function을 만들어 사용하고 있습니다. php5를 php4처럼 사용하는 것이 좀 걸리지만...

여하튼 제가 사용하는 방법은... 부끄럽지만....

  1. function load_library($filename, $extend = false)
  2. {
  3. require_once SYSPATH.'libraries/'.$filename.'.php';

    if (true === $extend && defined('EXTEND_LIBRARY') === false) {

  4. ini_set('include_path', ini_get('include_path').':'.SYSPATH.'libraries/');
  5. define('EXTEND_LIBRARY', true);
  6. }
  7. }

SYSPATH는 Using Zend Framework components in Code Igniter에 나와있는 BASEPATH와 비슷한 개념입니다. 물론 Window의 경우는 굵게 표시된 ':' 대신 ';'을 사용하셔야 합니다. Using Zend Framework components in Code Igniter에서 처럼

결론은 include_path에 설치 경로를 추가.

출처 : http://egg.pe.kr/147

+ Recent posts