블로그 이미지
veresuke's House!!
verere

calendar

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      

Recent Comment

Recent Trackback

  • 33,209total
  • 0today
  • 8yesterday
2009/03/07 23:29 Study/Web

정말 간만에 올리는 공부글이 아닌지 ㅋ


코딩을 하다가 배열을 상수로 사용할 필요가 생겼다.

constant, define을 이리저리 사용해보다가 생각만큼 안 돼서

인터넷을 뒤적 뒤적~~

그러다가 발견한게 var_export()eval()을 이용한 방법이다.

요렇게~~


<?PHP

 Define(
   '_TESTARRAYCONSTANT',
   var_export(
     array(
       '1'  => 'the value is 1',
       '10' => 'the vaue is 10',
       '100' => 'the value is 100',
       '1000' => 'the value is 1000'
      ),
     true
    )
  );

 $testDefine = eval('return ' . _TESTARRAYCONSTANT . ';');

 print _TESTARRAYCONSTANT;

 print '<BR /><BR />';

 print $testDefine[10];
 print '<BR />';
 print $testDefine[1000];

?>


결과를 보면 짐작들 하시겠지만 요렇다~

array('1'  => 'the value is 1', '10' => 'the vaue is 10', '100' => 'the value is 100',  '1000' => 'the value is 1000')

the vaue is 10
the vaue is 1000


이 방법을 사용하면서 좀 신경써야 할 부분은

var_export() 부분이다.

var_export()의 파라미터 중 두 번째 파라미터에 꼭!! true를 해줘야 한다는 것이다.

true를 안 하면 접근이 안 된다는 ㄷㄷㄷ


슬슬 이쯤에서 var_export()와 eval에 대해 살펴보는 시간을 ㅋ


var_export()

변수의 표현을 출력하거나 문자열로 반환하는 함수로 함수의 형태는 요렇다
mixed var_export ( mixed expression [, bool return])

파라미터로 받은 변수에 대해 구조 정보를 반환하는데 언뜻 보면 PHP 디버깅을 할 때 많이 쓰이는 var_dump()와 비슷하기도 하다.
하지만 var_dump()와의 차이점은 반환하는 표현이 유요한 PHP 코드이고 또 다른 점은 PHP5에서 객체의 protected, private 속성을 반환한다는 것이다.
두 번재 파라미터를 살펴보면 bool return으로 되어있다. 말 그래도 반환을 할 것인지 안 할 것인지 결정한다. 디폴트는 false다. 변수 표현을 반환하길 바란다면  true로 셋팅해 주시길 ㅋ

eval()

문자열로된 PHP 코드를 실행, 해석, 인식 시켜주는 함구로 함수의 형태는
mixed eval ( string code_str) 이렇다
요 함수는 다로 설명할 만한게....
그냥 짤막한 예를 들어면
$testPlusVar = '\$resultSum = 1 + 2;';
이렇게 있을 때
eval('$testPlusVar');
print $resultSum;
한다면 결과는
3
이렇다;;


오늘도 대충 글이 끝난것(?) 같다.

오늘도 이쯤에서 끝을... ㅋ

'Study > Web' 카테고리의 다른 글

[PHP]배열을 상수로 사용하기  (0) 2009/03/07
[JSON]클라이언트에서 JSON 데이터 사용하기  (0) 2008/11/06
[AJAX]timeout  (1) 2008/11/05
[PHP] 가변변수에 대해서  (2) 2008/10/24
posted by verere
2008/11/13 11:31 Study/ETC
어느날 일정 시간마다 서버의 특정 폴더의 모든 내용들을 삭제해야 하는 일이 생겼다. 일정 시간마다 작업을 수행하는 것은 crontab을 이용하면 되었으나 문제는 파일 삭제였다.
ssh나 파일형태로 작업할려니 비밀번호가 노출될 수 있기때문에 다른 방법이 없을까 생각하던 중 갑자기 뇌리를 스쳐가는 명령어 하나!! +ㅁ+ rsync!!!
'rsync를 역으로 사용하면 해결되지 않을가'라는 생각에 무턱대고 시도하기 시작했고 다시 문제에 봉착했다. ㅠ
우씨.. 명령어가 안 먹자나!!!!! 나와 같은 생각을 한 사람이 있을거라는 생각에 무작정 인터넷을 뒤적뒤적.. 결국 발견 =ㅁ=
대상 서버의 rsync 설정옵션을 변경해줘야 한다는거!! ㅋㅋㅋ
설정옵션을 보면 read only 라는 부분이 있는데 기본 셋팅은 yes로 돼어있다(/etc/rsyncd.conf 요 파일이다). 이것을 no로 변경~ 그리고 다시 실행하면 OK~~!!!!
이로써 또 하나의 문제가 해결되는 순간이다 +ㅁ+

이쯤에서 rsync에 대해 알아보자구~~
rsync란 무엇인가하면 
'원격 서버의 파일을 네트워크를 거쳐서 전송하는 실행 소프트웨어로 시큐어 셸(SSH) 등과 병용할 수 있어서 파일 전송 시 보안도 확보할 수 있다.' 
라고 네이놈 사전에 나와있다. ㅋ
조금 더 알아보면 rcp와 비슷한 동작을 하지만 더 다양한 옵션이 있고, 더 효율적으로 데이터를 전송한다(출발지와 목적지 사이에 다른 부분만을 전송하기 땜시;; 여기서 다른 부분은 파일크기의 변화나 시간의 변화 등이 있다).
rsync는 동기화 프로토콜로 rcp나 ssh를 사용하는데 이를 사용하지 않도라도 원격 rsync 서버에 TCP 포트 873을 이용 접속할 수 있다.
하지만 이 경우(873 port를 이용할 경우)에는 inetd.conf 에 추가로 설정을 해줘야한다(rsync 873/tcp # rsync 요 내용 없으면 추가. 추가 후에는 inetd 데몬은 다시 띄워주는 센스!!).

Tip - 설정옵션에 대한 짤막한 설명
path : 공유할 디렉토리
comment : 설명
uid : 접근할 user id
gid : 접근할 group id
use chroot : chroot를 사용할지 여부, 특별한 이유가 없는 이상 꼭 사용할 것
read only : 읽기만 가능할 것인지 설정
host allow : 접근 가능한 호스트 설정. 백업서버만 접근 가능하도록 설정
max connection : 최대 몇개의 커넥션을 연결할 수 있는지 설정
timeout : 타임아웃 시간 설정

Tip - rsync 옵션
-a : 아카이브 모드. 심볼릭 링크, 속성, 퍼미션, 소유권 등 보존
-v : 상세하게 보여움
-z : 전송시 압축을 함.
-u : update only(새로운 파일을 덮어쓰지 않음)
-r : recursive (하위 디렉토리까지 포함)
-l : 심볼릭 링크 재생성
-p : 퍼미션 업데이트
-t : 변경시간 전송 (이것이 없으면 전송한 시간으로 바뀜)
-g : 그룹이름 변경
--delete : 서버쪽에 없고 클라이언트쪽에만 있는 파일을 지움
--exclude : 특정 패턴을 가지는 모든 파일은 rsync에서 제외함(--exclude=PATTERN)

rsync -a --delete www.web1.com::backup/data/ /home/backup/data
www.web1.com 서버의 backup/data/ 에 있는 데이터를 /home/backup/data 폴더와 동기화 시킨다. 이 때 --delete 옵션으로 인해 서버

쪽에 없고 클라이언트쪽에만 있는 파일을 지운다.

rsync -a --delete /home/backup/tmp/ www.web1.com::backup/data/
이것은 rsync를 이용하여 서버의 데이터를 지우는 방법으로 --delete 옵션을 사용해야 한다.
/home/backup/tmp/ 폴더의 파일을 www.web1.com 서버의 backup/data/ 폴더와 동기화 시키는 것으로 /home/backup/tmp/ 폴더는 비어있어야 서버의 데이터가 지워진다.

Tip - ':'과 '::'의 차이는 또 무었이냐
':'은 rsh나 ssh를 사용하는 것이며 '::'은 rsync 자체에서 지원하는 기능을 이용 자료를 가져오는 것으로 873 TCP 포트를 사용한다. ':'에서 기본은 rsh를 이용하지만 -e ssh 옵션을 이용하여 ssh를 사용할 수 있다. ssh를 사용하려면 비밀번호를 입력해야하는데 이것도 파일형태로 만들어서 옵션에서 지정해주면 된다.

이로써 얼렁뚱땅 또 하나의 허접한 글이 올라간다 =ㅅ=;;

'Study > ETC' 카테고리의 다른 글

[LINUX]rsync에 대해  (0) 2008/11/13
[LINUX] crontab을 사용해보자구!!  (0) 2008/11/07
posted by verere
2008/11/10 15:02 Study/DB
MySql에서 데이터베이스를 백업하기 위해, 혹은 복구하기 위해 mysqldump라는 것을 사용한다.
 mysqldump의 옵션을 살펴보면
-A, --all-databases : 모든 DB를 덤프 
--add-locks : 덤프 전에 lock 덤프 후에 unlock 
--add-drop-table : 덤프이후에 출력물의 앞에 drop table명령 추가
복구할 때 사용키 위해서 
-B, --databases : 여러 DB를 동시에 덤프 할 때 사용 
-f, --force : 에러를 무시 
-h, --host : 지정한 호스트의 데이터를 덤프 
-t, --no-create-info : 데이터만 덤프 
-d, --no-data : 데이터를 제외하고 스키마만 덤프 
-p : 사용자의 암호를 지정 
-P : 포트번호 지정 
-u : 사용자명 지정

대충 이렇다.
--add-locks와 --add-drop-table 말고는 한글을 안다면 이해가 가실듯..-ㅛ-;;

--add-locks는 백업 도중 디비에 데이터가 추가 또는 삭제, 변경 될 수 있으므로 lock을 걸어 디비 변경을 방지하고 완료후에 unlock을 하는 것이고,
--add-drop-table은 백업된 파일을 이용하여 복구할 때 테이블을 삭제한 후 복원한다는 의미이다.
아마 이게 맞을것이다... 자신이 없다 ㅋ

실제 사용하는 예를 보면
● 현재 시스템내의 모든 데이타베이스를 백업
mysqldump -u root -p -A > first.sql
모든 데이타베이스를 1.sql 이란 파일명으로 백업을 받는다.
first.sql 파일을 열어보면 각각의 데이타베이스를 create 시키는부분과 각각의 데이타베이스마다 테이블을 create 시키는부분, 그리고 테이블에 데이터를 insert 시키는 부분들이 모두 나열되어 있다.
● 특정 데이타베이스만 백업
mysqldump -u root -p --databases some_db > second.sql
some_db 라는 데이타베이스만 백업을 받는다.
second.sql 파일을 열어보면 soma_db 라는 데이타베이스를 create 시키는 부분과 각각의 테이블을 create 시키는부분 그리고 각각의 테이블에 데이터를 insert 시키는 부분이 있다.
● 특정 데이타베이스의 특정 테이블만 백업
mysqldump -u root -p some_db some_tb > third.sql
some_db 라는 데이타베이스의 some_tb라는 테이블만 백업을 받는다.
third.sql 파일을 열어보면 테이블을 create 시키는 부분과 테이터들을 테이블에 입력하는 부분이 있다. 특정 테이블만 백업을 받기 때문에 데이타베이스를 create 시키는 부분이 없음을 주의해야 한다.
이 밖에도 데이터만 백업받으려면 옵션에 -t 혹은, --no-create-info 옵션을 추가하면 되고 스키마만 백업을 받으려면 -d 혹은, --no-data 옵션을 추가하면 된다.
● 데이터베이스 복원
mysql -u root -p < 백업한파일명.sql
복원은 정말 간단하다. 별거 없다 -ㅅ-
테이블을 백업한 파일을 복원하기 위해서 디비 이름을 적어주는 센!스!
mysql -u root -p some_db < 백업한파일명.sql

아.. 오늘도 별거 없다ㅋ
귀찮아서 이제 그~만 =ㅁ=ㆀ

'Study > DB' 카테고리의 다른 글

[DB] MySql - mysqldump  (1) 2008/11/10
가볼만한 곳(DB)  (0) 2006/08/15
posted by verere
2008/11/07 14:17 Study/ETC
우선 cron에 대해서 알아보면, 원하는 시간에 명령(?)을 실행하는 데몬으로 일종의 스케줄러라고 보면 된다.
이런 cron을 설정하기 위해 crontab이란 명령어를 사용한다.

crontab의 옵션은 -l, -r, -e가 있는데
-l 은 설정 내용을 조회하는 것이고 -r 은 설정 내용을 삭제, -e 은 설정내용을 에디터하는 것이다.

crontab의 파일 형식을 보면
* * * * * 명령어
첫 번째는 분, 두 번째는 시, 세 번째는 일, 네 번째는 월, 다섯 번째는 요일, 마지막 여섯 번째는 실행할 명령어이다.

예를 들어보면
$ crontab -e
# 매일 새벽 4시30분, 낮 12시30분마다 /home 디렉토리를 /BACKUP/home으로 백업. /BACKUP/log/에 로그파일 기록
30 4,12 * * *  /usr/bin/rsync -avxH --delete /home /BACKUP/home >> /BACKUP/log/`date +%Y%m%d%H%M`.log
#
# 매년 1월 1일 자정에 /home 디렉토리를 /BACKUP/home으로 백업. /BACKUP/log/에 로그파일 기록
0 0 1 1 *  /usr/bin/rsync -avxH --delete /home /BACKUP/home >> /BACKUP/log/`date +%Y%m%d%H%M`.log

이번에도 쉽다 ^^
이러고보니 매번 쉬운것만 다루는듯......

'Study > ETC' 카테고리의 다른 글

[LINUX]rsync에 대해  (0) 2008/11/13
[LINUX] crontab을 사용해보자구!!  (0) 2008/11/07
posted by verere
2008/11/06 13:52 Study/Web
가끔 JOSN으로 서버와 데이터를 주고 받다 보면
하나의 request에 여러 데이터?를 받게되는 경우가 있다.

request를 http://xxx.xxx.xxx/xxx.xxx?yy=y(GET 방식. POST나 다른 방식으로 넘겨줘도 무방해요~^^) 넘겨주면
서버에서는 요렇게~     참고로 아래는 php임돠ㅋ

$oResponseJsonData = '{ "REQUEST":{"REQ_DATA1":"data1", "REQ_DATA2":"data2"}, "RESULT_LIST":[';

for($i=0; $i<$nCount; $i++) {
if($i == ($nCount-1))
$oResponseJsonData .= '{"RESULT":{"RST_DATA1":"data1", "RST_DATA2":"data2", "RST_DATA3":"data3", "RST_DATA4":"data4"}}';
else
$oResponseJsonData .= '{"RESULT":{"RST_DATA1":"data1", "RST_DATA2":"data2", "RST_DATA3":"data3", "RST_DATA4":"data4"}},';
}

$oResponseJsonData .= '] }';

클라이언트로 넘겨주게 된다.
그렇다고 서버에서 꼭 저렇게 넘겨주는 것은 아니다. 그냥 한 예일 뿐이며, 지극히 내 맘... -ㅅ-;;
넘겨주는 형식이 중요할 뿐이므로 패쑤~~

여기서 '[', ']' 이게 중요!!!!!! 그래야 각 하위 엘리먼트(여기서는 각 RESULT 부분)에 접근할 수 있다.
'{ }' 이렇게 감싸면 제일 마지막의 엘리먼트만 접근이 가능하다는..
'{ }' 요게 혹시 가능하다면 저한테 코멘트 좀....;;

서버에서 넘겨주는 데이터의 구성은 아래와 같이 된다.

{ "REQUEST":{ "REQ_DATA1":"data1", "REQ_DATA2":"data2" },
  "RESULT_LIST":[
{"RESULT":{ "RST_DATA1":"data1", "RST_DATA2":"data2", "RST_DATA3":"data3", "RST_DATA4":"data4" }},
{"RESULT":{ "RST_DATA1":"data1", "RST_DATA2":"data2", "RST_DATA3":"data3", "RST_DATA4":"data4" }},
{"RESULT":{ "RST_DATA1":"data1", "RST_DATA2":"data2", "RST_DATA3":"data3", "RST_DATA4":"data4" }}
  ]
}

이걸 어떻게 클라이언트에서 사용해야 될까?
우선 Ajax의 reponseText를 이용해 받게된다면 eval(text를 object 형식으로 변환하여 사용하기 위해)을 이용하자.
다른 방식도 있는데 parseJSON()을 사용해도 된다. parseJSON의 역은 toJSONString()으로 object를 text로 변환해준다.

실제 예를 함 보자. text를 object로 변환 ㄱㄱㅆ~~

var sResponseVal = Object.responseText;
var oVal = eval("(" + sResponseVal + ")");

이 상태에서 REQUEST의 REQ_DATA2에 접근할려면
oVal.REQUEST.REQ_DATA2 이렇게 접근하면 된다 ^^

RESULT_LIST의 3번째 RESULT의 RST_DATA3에 접근하려면
oVal.RESULT_LIST[3].RESULT.RST_DATA3 이렇게 ㅎ

간단하다. 나머진 각자 입맛에 맞게 바꾸면 끝~~

'Study > Web' 카테고리의 다른 글

[PHP]배열을 상수로 사용하기  (0) 2009/03/07
[JSON]클라이언트에서 JSON 데이터 사용하기  (0) 2008/11/06
[AJAX]timeout  (1) 2008/11/05
[PHP] 가변변수에 대해서  (2) 2008/10/24
posted by verere