Language 2009. 11. 21. 00:51

PHP 5.3.0 이상의 버전에서 mail() 함수로 메일을 발송할때
메일이 깨져서 발송되는걸 확인했다.

왜 그럴까 하고 메일헤더를 열어봤더니 평소에 볼 수 없던
'X-PHP-Originating-Script' 라는 헤더가 추가된걸 발견할 수 있었다.

도대체 이놈이 왜 붙나 한참을 고민하다 php.net을 찾아봤더니
PHP 5.3.0 부터 php.ini에 mail.add_x_header 라는 지시어가 추가된 것을 알 수 있었다.

이놈이 뭔가 했더니 스크립트의 UID와 파일명을 가지는 X-PHP-Originating-Script를 추가한다고 한다.

간단히 말해서..
'난 foobar.php 라는 놈에서 실행됐고 uid가 500으로 되어 있다.
의도하지 않은(인젝션 등) 메일이 발송된것이라면 이 파일을 잘 다듬어 봐라'
뭐 대략 이런 의도로 추가되지 않았을까 싶다.

우리 회사에서 저게 필요할까? 하고 잠깐 생각해봤으나
웹으로 메일 쏠 일이 매우 한정적이므로 불필요한 옵션이라 판단하고,
php.ini에서 mail.add_x_header = Off 시켜줌으로써 해결했다.

posted by 티니
:
리눅스 2009. 11. 3. 13:34
L4, LVS, DNS RR 등으로 여러대의 웹서버를 운영하다보면
늘 고민하게 되는게 세션 공유일 것 같다.

물론 L4의 Metric 중에 Hash를 이용하면 어느정도 해결 될 수 있는 문제이지만,
가끔 클라이언트가 다른 서버로 세션이 할당되는 경우를 볼 수 있다.

나 또한 이 문제로 많은 고민을 했고, 여러 많은 HOW를 보았지만 썩 마음에 드는것이 없었다.
아마 세션 공유를 위해서 사용되는 방법은 아래의 3가지가 가장 보편적이지 않을까 싶다.

1. NFS, Samba
특정 서버의 디렉토리를 다수의 웹서버에서 Network를 통해 공유하는 것이다.
그럼 한곳의 디렉토리에 모든 세션 파일이 존재할 것이고 문제는 해결이 된다.
그렇지만 NFS나 Samba는 Write 효율성이 상당히 떨어지는 데몬이다.
세션은 그 특성상 read/write가 매우 빈번히 일어나기 때문에 효율성 면에서는 좋지 않다.
(개인적으로 이 방법을 사용하다가 피본적이 있다-_-;;)

2. DBMS
세션 데이터를 DBMS와 연동하여 DB에 저장하는 방식이다.
보편적으로 주로 사용되는 방법이지만, 접속자가 매우 많은 환경에서는
DB서버에 부하가 늘어날 수 밖에 없는 구조이다.
또한 DBMS에서 생기는 lock도 무시못할 변수로 떠오를 수 있다.

3. Daemon
말 그대로 데몬을 이용하여 세션을 공유하는 방식이다.
세션서버를 따로 구축하기에 제일 적절한 방법이 아닐까 싶다.

늘 그렇지만.. 난 언제나 서론이 참 길다.
오늘은 sharedance 라는 데몬을 소개하고자 한다.
지인의 소개로 알게된 데몬인데..
약 2년정도를 15대의 웹서버에 적용해서 사용하고 계신다는데.. 별 문제는 없으시다고 한다.
그래서 현재 우리 회사에서도 적용중인 데몬이다.

1. 세션 서버 구성
이 데몬은 세션 서버로 사용될 서버에만 설치해주면 된다. 웹서버에는 설치할 필요가 없다.
sharedance의 최신버전은 http://sharedance.pureftpd.org/ 여기서 구할 수 있으며,
RPM으로 구하고 싶다면 http://rpm.pbone.net/ 에서 sharedance로 검색하면 된다.

1-1. RPM 설치
설치 끝났다. 참 쉽다. -_-

1-2. config 설정
sharedance의 환경설정 파일은 /etc/sysconfig/sharedance 에서 해주면 된다.
설정할 내용이 많은 것도 아니고, 달랑 2개면 된다.
SHAREDANCE_DIR="/var/lib/sharedance"
SHAREDANCE_OPTIONS="--expiration=1800 --timeout=1800"
SHAREDANCE_DIR 은 세션 파일이 저장될 디렉토리를 의미한다.
SHAREDANCE_OPTIONS 는 데몬을 시작할때 사용할 옵션을 지정해주는 것이다.
어떤 옵션들이 있는지 보고 싶다면 sharedanced --help 라고 치면 나온다.

1-3. sharedance 시작
[root@localhost]# /etc/init.d/sharedance start
이제 sharedance 사용 준비가 모두 완료 되었다.


2. Client 설정 (웹서버)
웹서버는 크게 설정하거나 설치할 내용이 없다.
단순히 php.ini에서 sharedance의 handler 파일만 호출해주도록 설정하면 된다.

2-1. handler 파일 준비
이 파일을 직접 만들 필요는 없고, sharedance 에서 제공하는 파일을 그대로 가져다 쓰면 된다.
세션서버에서 sharedance를 RPM으로 설치했다면,
/usr/share/doc/sharedance-0.6/php/ 에 핸들러 파일이 존재할 것이다.
[root@localhost]# ls /usr/share/doc/sharedance-0.6/php
session_handler.php  sharedance.php  test_session.php  test_sharedance.php
필요한 파일은 session_handler.php와 sharedance.php 파일이다.
이 2개의 파일을 웹서버로 전송한다.

2-2. handler 파일 복사 및 설정
세션서버에서 전송받은 핸들러 파일을 적당한곳에 잘 복사해두면 된다.
필자는 편의상 서버 운영에 필요한 파일을 한곳에 몰아서 관리하고 있기 때문에
/etc/sadmin/httpd/sharedance 에 복사를 했다.

핸들러 파일이 세션서버를 이용할 수 있도록, 핸들러 파일을 약간 수정해야 된다.
그렇지만 그리 어려운 내용은 아니기 때문에 쉽게 수정할 수 있다.
[root@localhost]# vi /etc/sadmin/httpd/sharedance/session_handler.php
define('SESSION_HANDLER_HOST', '192.168.0.100');
이 부분은 세션서버를 지정해주는 부분이다.
만약 세션서버가 같은 서버에서 돌고 있다면 localhost로 지정하면 될 것이고,
다른 서버에서 돌고 있다면 그 서버의 ip 혹은 host를 적어주면 된다.

[root@localhost]# vi /etc/sadmin/httpd/sharedance/sharedance.php
define('SHAREDANCE_DEFAULT_PORT', 1042);
define('SHAREDANCE_DEFAULT_TIMEOUT', 10);
이 부분은 세션서버의 listening port와 timeout 시간을 설정해주는 부분이다.
만약 세션서버에서 데몬의 포트가 다르게 설정되어 있다면 이곳에서 수정을 해주면 된다.

2-3. php.ini 설정
이제 모든 준비가 끝났으므로 웹서버의 PHP에서 session을 이용할때
sharedance의 핸들러를 통해 세션서버와 통신하도록 설정해주기만 하면 된다.
[root@localhost]# vi /etc/php.ini
...
auto_prepend_file = /etc/sadmin/httpd/sharedance/session_handler.php
...
session.save_handler = user
php.ini 수정이 모두 끝났으면 웹서버를 재시작하여 변경된 php.ini의 내용을 reload 시킨다.

3. sharedance 확인
모든 설정과 준비가 끝났다.
세션서버에 세션파일이 잘 생성 되는지 확인을 해보자.
[root@localhost]# ls /var/lib/sharedance
01c6hof0u872jp3grka4ifo3u4  4u44789jq4vtjt7l2fp3t1ime6  e7d6nq244j27l8bllif792pp25
...
...
위와 같이 세션파일이 생성이 된다면, 정상적으로 웹서버와 세션서버가 통신하고 있는 것이다.
posted by 티니
:
Language 2008. 5. 28. 14:19

------
원문 출처를 모릅니다.. 아시는분 알려주세요..
------

이 속도 테스트 보다 더 중요한 것이 PHP보안 입니다. 보안이 가장 중요함당 !!!

PHP로 코딩 함에 있어서 알아야 할 속도 테스트 입니다.
조금더 빠른 PHP 속도를 유지 하기 위한 것이죠 ^^

작은 것이 모여서, 대따 오랜 시간이 걸릴 수 가 있는 것 입니다. !!
되도록이면 속도가 빠른 것을 사용하시는 것이 좋습니다.

물론 함수 마다 기능 마다 장단이 있지만요....^^

다른 비교가 있으면 알려주셍 ^^ 답변 달아 주세용 ^^
계속 적으로 업글 됩니다.

★ mysql 총 게시물 수 세기

<?php
    $numresults=mysql_query("select code from $board");
    $numrows=mysql_num_rows($numresults);
    //2초 이상 ...게시물 10만개
?>
VS
<?php
    $numresults=mysql_query("select count(code) as code from $board");
    $row_num=mysql_fetch_array($numresults);
    $numrows=$row_num[code];
// 0.2  ...게시물 10만개
?>
아래것이 훠얼씬 빠름다..
도대체 mysql_num_row() 는 왜 만들어 놓은 것일까용???
 


★ mysql_fetch_row  > mysql_fetch_array >>> mysql_result 입니다.


row 가 array 보다 약간 빠르고, result 보다는 훠얼씬 빠름당 ^^
row 는 불편한게 숫자로 칼럼을 불러와서 불편합니다.
array 가 약간 느리지만, 문자 칼럼을 불러 올 수 있으니 array 쓰는 것도 양호 ^^
아직도 mysql_result() 를 사용하시나요?
 


★print , echo ,printf 함수 속도 비교

HTML 출력 >> echo > print >> printf

print 와 printf 함수는 복잡한곳에 적격이고, 약간 느리다.
echo 는 단순한곳에 적격이고...빠르다.
printf 는 형식화된 출력을 해주므로 그래도 좋죠 ^^
 


★  인라인


a.php
<?php
    $aa="sdsdsdsd";
    echo ("
      <table>
      <td> $aa </td>
      </table>
      ");
?>
위 랑..

b.php
<?php $aa="sdsdsdsd"; ?>
<table>
<td><?=$aa;?></td>
</table>

랑 도대체 어케 코딩 하느냐죠 ?
솔직히 코딩은 a.php 가 편합니다.
<?php ?> 를 한번 만 쓰니까 효율적일 수 있습니당..
그러나 아무리 아무리 PHP가 빠르다고 해도 HTML 이 더 빠릅니당.. !!!
쿠쿠쿠
b.php 처럼 코딩 하는 습관을 가지세용 ^^
변수가 많아 질 경우 b.php 파일이 느립니다.
그러나 소스 코드 분리 측면에서는 b.php 파일 형태가 좋습니다.
이 부분은 여러분들이나 저나 각종소스를 가지고 연구해 봐야만 할검당 ^^
 


★ zend cache , APC ,Bware 캐쉬 비교

Zend cache > APC > Bware
zend cache 는 캐쉬 입니다. 울나라에서 포탈에서도 몇군데 사용하죠.
PHP 프로그램 변환 없이 속도를 빠르게 해 줍니다. ^^
zend cache 를 살 돈이 없으시다구용?
그러면 APC 나 zend optimizer 를 반드쉬 설치 하세용 !!
■ 그런디 Zend Cache 만한 무료 캐쉬가 나왔다고 합니당...^^
http://www.php-accelerator.co.uk/index.php
도대체 캐쉬의 작동 원리는 어케 되는가?
캐쉬는 여러가지로 작동 할 수 있습니다.
가장 많이 아는 것이 메모리에 페이지를 띄워 놓고 읽어 오는 것입니다.
하드에서 읽는 것 보다 빠르기 때문이죠.
그리고 HTML 로 만드는 것도 캐쉬 입니다.조금 더 빠르다면 캐쉬 라고 할 수 있습니다.
게시판 목록 보기 페이지는 디비 연결이 많습니다. 쓰기 보다 , 읽기가 20배 정도 많습니다.
게시판을 마니 운영해 봤다면 아시겟죠 ^^?
그래서 게시판 목록을 HTML 로 저장 시키고, 쓰기, 삭제 가 있을때 마다 HTML 로 만들어 주는 것 입니다.
그러면 디비 부하는 상당히 줄어 듭니다.
또는 코딩을 할때 enter 이나 tab 키를 많이 사용해서 합니다.
저번에 본 캐쉬는 enter 이나 tab 키를 없에 주는 캐쉬 였습니다.
enter 이나 tab 를 없엘 경우 최대 1-2k 정도 절약이 되죵 ^^
 


★ ereg_replace <<<  preg_replace 정규표현식

ereg_replace () 가 장난 아니게 느림다.
40개 정도 변환 하는데 1초나 걸려요.preg_replace 는 0.3초 정도요.
되도록이면 preg_replace() 를 사용하세요 !!!
www.php.net/preg_replace
tood.net preg_replace 강좌
http://www.tood.net/tood/toodboard/toodread.php?board=tootech&tcode=907
 


★ foreach , list 함수 속도 차이 35%

foreach($string as $a);  >>>  while(list(,$a) = each($string));
foreach() 를 사용하는 것이 35% 정도 빠릅니다...!!
 


★ explode() Vs split() Vs preg_split

explode() 와  split() 와 preg_split 는 문자열을 자르는 함수 입니다.
테스뚜 해보시면 아시겟지만 explode() 가 훨 빠릅니당..!!!
70% 정도 빠릅니다.
 



★mysql_connect Vs mysql_pconnect

서로 장단이 있다 합니다.
mysql_pconnect 가 더 빠르다고 합니다.
persistant
메뉴얼에 영구적인 이렇게 되어 있으니까요..
일정시간 동안 mysql 을 열어 놓기 때문에, 다시 열 필요가 없어서 빠르다고 합니다.
단점은 계속 열기 때문에 메모리를 많이 잡아 먹슴당...^^
mysql_pconnect 경우는 최소 메모리가 1G 이상 되어야 사용하시는 것이 좋습니다.
 


★ 큰따옴표(") , 작은 따옴표(')

큰따옴표는 PHP가 파싱을 합니다. 그러나 작은 따옴표는 파싱을 하지 않습니다.
작은 따옴표를 사용하시는 것이 빠릅니다.
코딩시 echo ' test '.$aaa.' tood ';
요런식으로 하시는 게 가장 빠름당 !!
 


★ mysql 데이터 저장 공간 크기 ?

id int(11) unsigned NOT NULL auto_increment,
   bbs smallint(5) unsigned NOT NULL,
   lens mediumint(8) unsigned NOT NULL,
  
int 도 무자게 많슴당..
각각의 크기에 맞게 하는 것이 속도가 빨라 집니당 ^^
not null 를 주는 것도 속도가 빨라 집니당..
작은 사이트 조회수 경우 1만을 넘기도 힘듭니다. 그럴 경우 smallint 를 사용하시면 됩니다.
 


★ where 절에 모든 것은 인덱스를 걸어라 !!!

mysql 에서 쿼리시에 where 절에 사용되는 비교의 칼럼은 반드쉬 인덱스를 거세용 !!!
mysql 인덱스 가 여러 분들의 게시판 속도를 업 시켜 줍니당 !!
 


★메인페이지에서 속도를 빠르게 하려면, .htm 으로 만드는 것이 좋습니다.

그러니까..제 사이트 페이지 오른쪽 에는 모두 최신 게시물로 디비를 불러오는 부분
입니다.
디비 연결은 부하를 줄 수 있습니다.
그러니까..이예는 사이트가 상당히 활성화된 사이트일 경우 입니다.
하루에 2번 정도 .htm 으로 만들어 페이지를 업시키는 것이 좋습니다.
아무리 PHP가 빨라도 HTML 보다는 빠르지 않습니다.. !!!
HTML 로 만드는 것은 생각 할것이 게시판 목록수 만큼 파일이 생성이 됩니다. 1만개 게시물이면 1만개 HTML
이 생기죠. 그런데 조회수가 보통 1000-3000 을 넘는 게시판 경우는 효율성이 중대 됩니다.
그러나 조회수가 100 비스므리 하다면...생각해봐야 합니다.
그러기 위해서는 ★cron 를 알아야 합니다 PHP강좌 게시판에서 cron 으로 검색하세용 !!
윈도우 사용자는 멀 쓰는지 잘 모르겠슴당...아시면 답글 부탁  ^^
 


★ 초보자 Vs 전문가

www.zend.com 에서 제가 2000년 5월에 퍼온건데용 ^^  
함 주석을 붙일까 해서용^^

Beginner vs Experienced   
Author:  Boaz Yahav   
Date  23/05/2000   
Beginner : echo "$var";  
Experienced : echo $var;  

Beginner:echo "<a href=\"http://www.php.net\">PHP</a>";  ;
Experienced : ?><a href="http://www.php.net">PHP</a> color="#0000CC"><?  ... ?>  
◆ "(따옴표) 가 굉장히 중요한것이라는 한 대목이죵 ^^
전 보통의 경우 php 변수 값이 들어갈 경우는 초보자 처럼 쓰구요 ^^ 안들어 갈 경우 는 전문가 처럼 씀다.
Beginner : $a[0]=1; $a[1]=2; $a[2]=3;  
Experienced : $a = array(1,2,3, 1);  
둘다 사용하는 데요. 전문가 쪽이 편함다. ^^
Beginner : if($a>1) { $b=2; } else { $b=3; }  
Experienced : $b = ($a>1) ? 2:3;  
요건 완존히 소스 어렵게 짜는 넘이 최고 라는 소리 같네용 ^^
전문가 쪽것은 C 언어 에서 배웠는데도 역시 전 if 씀다. ^^
Beginner : $result=mysql_query(...);  
Experienced: $result=mysql_query(...) OR die   
        (mysql_error());  
요즘 들어 새삼 전문가 쪽으로 씀다.^^
보통의 경우
<?php
$result=mysql_query(...)  
if (!$result)
{
     echo error()."<P>";
     echo errno();
}
?>
이렇게 사용함다. ^^
or 이 설명이고 no 가 에러 번호 일 검다. ^^
 


★MySQL,ADODB,PHPLib,PEAR 벤치마킹  

ADODB > PHPlib > PEAR
MySQL     1.14      -
ADODB     1.45     27%
PHPLib    1.60     40%
PEAR     2.87     152% (fetchInto)
MySQL,ADODB,PHPLib,PEAR  는 모두 데이터베이스 인가요? 당근 아닙니다.
MySQL만 데이터베이스 구요.
ADODB,PHPLib,PEAR 는 PHP 프로그램 입니다.
3개 다 MySQL연결을 편하게 하는 클래스 프로그램 입니다.
그런디 벤치 마킹 결과 MySQL 에서 직접 쿼리하는 것 다음으로 ADODB 가 뽑혔슴당 ^^
PEAR 가 굉장히 늦군요. PEAR DB 나 ADODB 를 사용해 보았는데, 움..역시나 ADODB 가 좋군요.
오라클, mysql , ms sql 연결시 1개의 API 만 사용할 수 있는 프로그램 들 이 PEAR 과 ADODB 입니당 ^^
 


★ 페이지 네비게이션- 페이지 분활

페이지 분활도 속도 차이가 납니다. 각각의 페이지 분활을 테스트 해보시면 아시겟지만,
10만개,20만개의 데이터를 넣어 보세요. 빠른것은 0.03초 정도, 느린것은 3초나 걸립니다.
인덱스를 걸어서 빨리 뜨는데, 머가 늦는 걸까 했는데, 페이지 네비게이션 알고리즘이 문제더군요. ^^
 


★ 속도 테스트는 어케 하는가 ? microtime() 사용하면 됩니다.

<?php
function pageTime($page) {
$mstart = explode(" ", $m);
$mend = explode(" ", microtime());
$mtime = ($mend[1] - $mstart[1]) + ($mend[0] - $mstart[0]);
echo " $m[1]  $mend[1]<P>";
echo " $m[0]  $mend[0]<P>";
print("tood.net 페이지 로딩 시간 : " . $mtime . " microseconds");
}
pageTime(basename($PHP_SELF));
?>
 


조금 더 빠른 쿼리

$sql = "SELECT table.column FROM table WHERE criteria LIKE $myrow[variable]";
아래 처럼 하면 파싱 되지 않기 때문에 아주 아주 쪼금 빨라 짐다..0.0000x 초;
$sql = "SELECT table.column FROM table WHERE criteria LIKE " . $myrow['variable'];
 


최적화 컴파일 옵션 사용 !

PHP counfigure 시에 최적화 방법 입니다.
http://www.tood.net/tood/toodboard/toodread.php?board=tootech&tcode=1070

posted by 티니
:
Language 2006. 11. 9. 05:46
내가 미친게지-_-;;
새벽에 할 일 없어서 perl로 백업스크립트 짜더니..
이젠 php로 증분백업을 (...) 미친게야....

#!/usr/bin/php

<?php
// 제외할 목록 함수
function noUser($id){
switch ($id){
case "lost+found" :
case "test" : return false; break;
default : return true;
}
}

$oneDay=86400; //60*60*24초
$tmpTime=time();

$nYear=date("Y",$tmpTime);
$nMonth=date("m",$tmpTime);
$nDay=date("d",$tmpTime);

$nTime=mktime(0, 0, 0, $nMonth, $nDay, $nYear);
$nWeek=date("D",$nTime);

// 전체 백업 날짜가 바뀌면 아래 $allBackupDay 의 요일과 switch 문의 x 값을 바꺼준다.
// x 값은 전체 백업요일는 7 그 다음요일은 1 그다음은 2 .... 식으로하며 전체 백업요일 전은 6이다.
// 예를 들어 전체 백업날이 월요일이면 다음과 같다.
// Mon:7, Tue:1, Wed:2, Thu:3, Fri:4, Sat:5, Sun:6
$allBackupDay="Mon";
switch($nWeek){
case "Mon" : $x=7; break;
case "Tue" : $x=1; break;
case "Wed" : $x=2; break;
case "Thu" : $x=3; break;
case "Fri" : $x=4; break;
case "Sat" : $x=5; break;
case "Sun" : $x=6; break;
}

// 전주 일요일 날자 구함, 지워질 날짜 구함
$tTime=$nTime-($oneDay*$x);
$delTime=$tTime-($oneDay*7);
$tWeek=date("D",$tTime);

// 오늘이 일요일이면 오늘 날짜를, 아니면 전주 일요일 날짜를
if($nWeek==$allBackupDay) $backup_dir=date("Y-m-d",$nTime);
else $backup_dir=date("Y-m-d",$tTime);

$backup_root="/backup/"; // 백업 폴더
$backup_dir2=date("m-d",$nTime); // 2차 백업 폴더
$list_root="/sys/crond/list/"; // 리스트 관리 폴더
$delete_dir=date("Y-m-d",$delTime); // 삭제할 날짜 폴더

// /backup/2004-01-01/01-01/ 생성
// home백업 디렉토리 생성
// db백업 디렉토리 생성
exec("mkdir -p ".$backup_root.$backup_dir."/".$backup_dir2."/home");
exec("mkdir -p ".$backup_root.$backup_dir."/".$backup_dir2."/db");
if(!file_exists($list_root)) exec("mkdir -p ".$list_root);

if($nWeek==$allBackupDay){ // 전체 백업 날짜이면 디렉토리 생성
exec("rm -rf ".$backup_root.$delete_dir); // 2주전 데이터 삭제
exec("rm -f ".$list_root."*"); // 리스트 삭제
}

//시작 측정 시작
$time=date("Ymd-H:i:s",time());
exec("touch ".$backup_root.$backup_dir."/".$backup_dir2."/start-$time");

/********************* 매일 실행 될 부분 시작 *********************/

// 유저리스트 불러옴
exec("ls /home > ".$list_root."user_list");
$userList=file($list_root."user_list");
for($i=0;$i<count($userList);$i++) $userList[$i]=trim(str_replace("\n","",$userList[$i]));
exec("rm -f ".$list_root."user_list");

// 디비 리스트 불러옴
// 파일의 내용을 한줄씩 읽어서 배열로 저장
// 줄바꿈표시와 좌우 여백 삭제
// 디비리스트 삭제
// 디비 저장
exec("ls /db > ".$list_root."db_list");
$dbList=file($list_root."db_list");
for($i=0;$i<count($dbList);$i++) $dbList[$i]=trim(str_replace("\n","",$dbList[$i]));
exec("rm -f ".$list_root."db_list");
for($i=0;$i<count($dbList);$i++){
exec("tar -cpzf ".$backup_root.$backup_dir."/".$backup_dir2."/db/".$dbList[$i].".tar.gz /db/".$dbList[$i]." 2>/dev/null");
}

exec("tar -cpzf ".$backup_root.$backup_dir."/".$backup_dir2."/usr.local.tar.gz /usr/local 2>/dev/null");
exec("tar -cpzf ".$backup_root.$backup_dir."/".$backup_dir2."/etc.tar.gz /etc 2>/dev/null");
exec("tar -cpzf ".$backup_root.$backup_dir."/".$backup_dir2."/var.tar.gz /var 2>/dev/null");
exec("tar -cpzf ".$backup_root.$backup_dir."/".$backup_dir2."/sys.tar.gz /sys 2>/dev/null");

/********************* 매일 실행 될 부분 끝 ***********************/

for($i=0;$i<count($userList);$i++){
if(noUser($userList[$i])){
exec("tar -g ".$list_root.$userList[$i]." -cvpzf ".$backup_root.$backup_dir."/".$backup_dir2."/home/".$userList[$i].".tar.gz /home/".$userList[$i]." 2>/dev/null");
}
}

exec("chmod -R 600 ".$backup_root.$backup_dir);

$time=date("Ymd-H:i:s",time());
exec("touch ".$backup_root.$backup_dir."/".$backup_dir2."/end-$time");
?>
posted by 티니
: