http://www.php.net/manual/en/function.mb-detect-encoding.php


데이터의 캐릭터셋을 판단하는 아주 유용한 함수이다.

string mb_detect_encoding ( string $str [, mixed $encoding_list [, bool $strict ]] )

mb_detect_encoding() detects character encoding in string str . It returns detected character encoding.

encoding_list is list of character encoding. Encoding order may be specified by array or comma separated list string.

If encoding_list is omitted, detect_order is used.

strict specifies whether to use the strict encoding detection or not. Default is FALSE.



Example#1 mb_detect_encoding() example

<?php
/* Detect character encoding with current detect_order */
echo mb_detect_encoding($str);

/* "auto" is expanded to "ASCII,JIS,UTF-8,EUC-JP,SJIS" */
echo mb_detect_encoding($str, "auto");

/* Specify encoding_list character encoding by comma separated list */
echo mb_detect_encoding($str, "JIS, eucjp-win, sjis-win");

/* Use array to specify encoding_list  */
$ary[] = "ASCII";
$ary[] = "JIS";
$ary[] = "EUC-JP";
echo
mb_detect_encoding($str, $ary);
?>


UTF-8 에 대한 좋은 문서들 링크

http://wyb330.egloos.com/3535249

http://sizuha.egloos.com/2563282

http://kldp.org/node/91358

http://blog.wystan.net/2007/08/18/bom-byte-order-mark-problem

http://b.mytears.org/2005/01/101

http://b.mytears.org/2005/03/136

1. 개요
OpenVZ host system(www)에 apache와 php를 설치한다.
OpenVZ guest system(db)에 mysql을 설치한다.

2. 현재상황 및 시스템 상태
kernel : gentoo-2.6.18
특별한 커널 작업은 없다.

3. 설치

db 호스트에 mysql을 설치한다.
mysql을 USE 변수보다 package.use 파일에 flag를 기입하는것을 권장한다.

It is *strongly* recommended that you use the /etc/portage/package.* files instead of USE=" " on the command line if you want to enable a USEflag for one package. The biggest benefit of this is that on future upgrades of the package, your same use flags will be applied.

To add custom use flags to a package, first create the /etc/portage directory. It does not exist by default. Next, create a package.use file. The format of this file is very simple, do not add the version number to the packagename.



db # emerge dev-db/mysql

기본적인 데이터베이스를 설치한다
db # emerge --config dev-db/mysql

mysql 데몬을 구동한다
db # /etc/init.d/mysql start
db # rc-update add mysql default

mysql 보안관련 세팅을 한다
db # mysql_setpermission

mysql_setpermission은 perl로 만들어진 보안관련 스크립트이다.
기존, mysql 설치작업 후 호스트, 사용자, db 등등의 작업을 수동으로 해주었는데 이 스크립트는 대화식 모드에서 손쉽게 보안설정을 하게 해준다.



www에 apache2를 설치한다.

/etc/make.conf USE 변수에 "apache2"를 추가한 다음 emerge 한다.
www # emerge apache

apache를 기동한다.
www # /etc/init.d/apache2 start
www # rc-update add apache2 default

참고로 apache 버전 2.0.54-r10 부터 설정파일 디렉토리 구조가 바뀌었다.

Use Old Path New Path
Server Root /etc/apache2/ /usr/lib/apache2/
Configuration Directory /etc/apache2/conf/ /etc/apache2/
Configuration /etc/apache2/conf/apache2.conf /etc/apache2/httpd.conf
Configuration /etc/apache2/conf/commonapache2.conf /etc/apache2/httpd.conf
Vhosts Configuration /etc/apache2/conf/vhosts/ /etc/apache2/vhosts.d/
Modules Configuration /etc/apache2/conf/modules.d/ /etc/apache2/modules.d/
Module Binaries /usr/lib/apache2-extramodules/ /usr/lib/apache2/modules/



www에 php5를 설치한다.

www # cat /etc/portage/package.use
dev-lang/php apache apache2 mysql ctype unicode pcre session gd ftp cli iconv truetype xml

기타 필요한 flag는 알아서 추가한다.
USE flag 는 다음 url에서 참조한다.

http://gentoo-wiki.com/USE_Flags_explained

www # emerge dev-lang/php

/etc/conf.d/apache2 파일을 수정한다.
www # cat /etc/conf.d/apache2
APACHE2_OPTS="-D DEFAULT_VHOST -D PHP5"
www # /etc/init.d/apache2 restart


www에 phpmyadmin을 설치한다
www # cat /etc/portage/package.use
dev-db/phpmyadmin vhosts
www # emerge phpmyadmin

mysql_setpermission으로 www의 ip에서 root로 접속할 수 있게 권한을 준다.
webapp-config 를 실행한다.

www # man webapp-config
www # webapp-config -I -d /phpmyadmin/ phpmyadmin 2.10.1

브라우저로 접속한다.
http://www.ddong.ac.kr/phpmyadmin/

접속실패 나오고 configuration file 설정하면 다음부터 웹에서 원격으로 mysql을 컨트롤 한다.


4. 참조 url
http://gentoo-wiki.com/Apache2_Install
http://gentoo-wiki.com/Apache_Modules_PHP
http://gentoo-wiki.com/HOWTO_MySQL


하늘이 무너져도 솟아날 구멍은 있다고 했는데...

암튼, 삽질의 연속이었지만 얻은게 많은 하루였다.


참조 url

커널컴파일 : http://blog.naver.com/kill_9/100001510182

apm configuration : http://blog.naver.com/kill_9/100011126785


참조 url2

http://apache.org

http://www.apache-kr.org

http://phpschool.com

http://bbs.kldp.org


얼마전 회사서버중 하나의 커널버전이 너무 낮아 커널 컴파일을 했었다.

물론, scsi와 ethernet 만 잡고 나머지는 죄다 없애고...


회사에서 서비스하는 모듈에 이상이 생겼다.

플래시를 동적으로 링크해서 어쩌구저쩌구 하는 부분인데 이게 실행이 안되는 것이었다.

관련 데몬은 예전 어떤 업체에서 돈 주고 샀었는데 그 회사의 사장이란 사람의 마인드가 영 글러먹어 관련 매뉴얼 및 실행소스, 바이너리를 줄 수 없다고 한 것이다.

비용을 지불하고 서비스를 받으라는 것인데, 명색이 오픈소스를 사랑하고 서버의 세팅에 관련된 부분에 비겁하게 돈주고 처리하는게 싫어서 내가 설치한다고 했다.


그 한마디가 지금 이렇게 회사에서 삽질기를 쓰고 있는 가장 큰 이유이기도 하고...


문제는 새로 업데이트한 커널에 관련된 모듈이 설치가 되지 않았다는 것이다.

물론, 소스나 실행바이너리가 있으면 어떻게 해보겠는데 그런 기술지원이 전혀 없고(그 사장새끼 생각할 수록 열받네..) 해서 이전 커널로 재부팅을 했다.

다행히 해당 모듈들이 로딩이 되었고 서비스가 정상으로 되돌아 오나 싶었는데 문제는 전혀 다른 곳에서 터져버렸다.


다행히 아파치 모듈관련 부분인데 불행하게도 커널업그레이드 할때 apm 까지 업그레이드를 해버려 이전 정보는 전혀 남아 있지 않는 상태.. 더욱 불행한건 디스크를 절약하기 위해 이전 설정파일들을 삭제 해버린것... OTL


그나마 다행인건 이전 아파치 설정파일을 백업해 두었었고(역시 백업의 중요성이란..) 더더욱 다행인건 해당서버와 거의 동일한 환경의 서버가 한대 더 있었다는 것이다.


phpinfo로 두 서버의 아파치 모듈을 비교해보니 역시나 하나가 빠져있었다.


mod_fpsock.so


http://apach.org 에 가서 해당 모듈을 검색했는데 없었다... 헉..

아무리 뒤져봐도 이런 희안한 모듈이 보이지 않았다.

하는 수 없이 이전 아파치 디렉토리의 libexec/ 디렉토리에 가보니 mod_fpsock.so 파일이 있는 것이었다.

거의 지푸라기라도 잡는 심정으로 php+apache 세팅을 했다.


# apache_1.3.33 ] ./configure --prefix=/www --activate-module=src/modules/php4/libphp4.a --enable-module=so --enable-shared=max --add-module=src/modules/standard/mod_so.c


아파치 1.3 버전 이후부터 DSO(Dynamic Shared Object) 방식을 지원하게 되었는데 이는 아파치의 기능들을 모듈화 시켜서 서버관리자 측면에서 보다 관리의 편리성을 주기 위해 만들어졌는데 아파치 1.1 버전을 슬랙웨어라고 보면 현재의 아파치는 요즘 나오는 모듈화 기반의 리눅스 커널이라고 생각하면 맞는 표현이라고 생각한다.

즉, 특정 모듈을 설치하기 위해 기존의 apache를 지우고 재설치하는게 아니라 해당 모듈만 컴파일하고 아파치 설정파일에서 해당 모듈만 추가해주고 데몬을 재실행 시키면 작동하는 방식이다.


DSO 방식으로 구동되기위해선 mod_so.so 모듈이 반드시 설치되어야 한다.

mod_so.so 파일은 실행시 동적으로 라이브러리를 적재하고 필요치 않을때 메모리에서 해제하는 등의 역활을 하는 모듈이다.

아파치 기본 설정에는 이 항목이 disable 상태인데 DSO 방식으로 컴파일하기 위해선 configure 옵션에서 --enable-module=so 항목을 추가해야 한다.


컴파일하고 설치한 다음 백업된 기존 파일들을 적당히 수정한다.

httpd.conf 파일을 수정한다.


LoadModule env_module         libexec/mod_env.so

LoadModule fpsock_module libexec/mod_fpsock.so

......

AddModule mod_env.c

AddModule mod_fpsock.c

.......


위 부분을 모듈로써 사용한다는 말인데 반드시 LoadModule 와 AddModule 는 쌍을 이루어야 한다.

그리고 예전 libexec/ 디렉토리의 mod_fpsock.so 파일을 같은 위치에 복사하고 아파치 데몬을 재기동 시키니 비로소 정상적인 결과가 나올 수 있었다.


# /www/bin/apachectl start

/www/bin/apachectl start: httpd started


메시지가 나왔을때의 감동이란... 유에서 무를 창조한 느낌이었음..(너무 오버센스인가?)


사용자 삽입 이미지



TAG DSO, php