php2012. 10. 17. 16:52

글 목록을 보여줄 때 현재 시간으로 보여주는 경우도 많지만 많은 SNS에서 지금으로부터 얼마 전에 써진 글인지 표시해주는 경우도 많습니다.
이런 경우에 사용할 수 있는 함수 예제입니다.

function readableTime($datetime) {
  $sec = time() - strtotime($datetime);
  if($sec < 60) return $time . '초';
  $min = $sec / 60;
  if($min < 60) return intval($min) . '분';
  $hour = $min / 60;
  if($hour < 24) return intval($hour) . '시간';
  $day = $hour / 24;
  if($day < 7) return intval($day) . '일';
  $week = $day / 7;
  if($time < 5) return intval($week) . '주';
  $month = $day / 30;
  if($month < 24) return intval($month) . '개월';
  $year = $day / 365;
  return intval($year) . '년';
}

Posted by 다오나무
php2012. 10. 14. 20:42

FTP함수의  종류와  사용법  

(1)  ftp_connect  :  FTP서버에  연결한다.  
-----------------------------------------------  
int  ftp_connect  (string  host  [,  int  port])  
$ftp=ftp_connect("서버주소  또는  도메인명",21);  
-----------------------------------------------  

(2)  ftp_login  :  계정과  패스워드로  서버에  접근한다.  
-----------------------------------------------  
int  ftp_login  (int  ftp_stream,  string  username,  string  password)  
$ftplogin  =  ftp_login($ftp,  "$ftp_user_name",  "$ftp_user_pass");  
-----------------------------------------------  

(3)  ftp_pwd  :  현재  디렉토리  값을  리턴한다.  
-----------------------------------------------  
int  ftp_pwd  (int  ftp_stream)  
$ftp_dir  =  $ftp_pwd($ftp);  
-----------------------------------------------  

(4)  ftp_cdup  :  가장  상위  디렉토리로  이동  
-----------------------------------------------  
int  ftp_cdup  (int  ftp_stream)  
$ftp_dir  =  $ftp_cdup($ftp);  
-----------------------------------------------  

(5)  ftp_chdir  :  FTP  디렉토리의  변경  
-----------------------------------------------  
int  ftp_chdir  (int  ftp_stream,  string  directory)  
$chdir=ftp_chdir  ($ftp,  $ftp_dir);  
-----------------------------------------------  

(6)  ftp_mkdir  :  디렉토리를  만들고  만든  디렉토리명을  반환한다.  
-----------------------------------------------  
string  ftp_mkdir  (int  ftp_stream,  string  directory)  
$mkdir  =  ($ftp,"만들  디렉토리명");  
-----------------------------------------------  

(7)  ftp_rmdir  :  디렉토리를  삭제한다.  
-----------------------------------------------  
int  ftp_rmdir  (int  ftp_stream,  string  directory)  
$mkdir  =  ($ftp,"삭제할  디렉토리명");  
-----------------------------------------------  

(8)  ftp_nlist  :  디렉토리의  파일이름을  배열로  반환한다.  
-----------------------------------------------  
int  ftp_nlist  (int  ftp_stream,  string  directory)  
$contents  =  ftp_nlist(  $ftp,  "디렉토리명");  
-----------------------------------------------  

(9)  ftp_rawlist  :  디렉토리의  파일이름과  읽고  쓰고  실행할  권한을  파일  당  한  줄의  배열로  반환한다.  
-----------------------------------------------  
int  ftp_rawlist  (int  ftp_stream,  string  directory)  
$contents  =  ftp_nlist(  $ftp,  "디렉토리명");  
-----------------------------------------------  

(10)  ftp_systype  :  FTP서버의  타입을  리턴하는데  리눅스는  UNIX로  표시해준다.  
-----------------------------------------------  
int  ftp_systype  (int  ftp_stream)  
echo  ftp_systype($ftp);  
-----------------------------------------------  

(11)  ftp_get  :  FTP로부터  파일을  다운로드  받는다.  
-----------------------------------------------  
int  ftp_get  (int  ftp_stream,  string  local_file,  string  remote_file,  int  mode)  
$download  =  ftp_get($ftp,  "저장할  파일명",  "다운받을  파일명","FTP_ASCII  or  FTP_BINARY");  
-----------------------------------------------  

.pl  또는  .cgi  같은  Perl  CGI인  경우에는  FTP_ASCII로  다운  받고  다른  파일은  FTP_BINARY로  다운  받아야  한다.  

(12)  ftp_fget  :  FTP로부터  파일  포인터를  다운받는다.  
-----------------------------------------------  
int  ftp_fget  (int  ftp_stream,  int  fp,  string  remote_file,  int  mode)  
$download  =  ftp_fget($ftp,  "저장할  파일명",  "다운받을  파일명","FTP_ASCII  or  FTP_BINARY");  
-----------------------------------------------  

(13)  ftp_put  :  FTP서버에  파일을  업로드  한다.  
-----------------------------------------------  
int  ftp_put  (int  ftp_stream,  string  remote_file,  string  local_file,  int  mode)  
$upload  =  ftp_put($ftp,  "업로드할  파일명",  "업로드될  파일명","FTP_ASCII  or  FTP_BINARY");  
-----------------------------------------------  

(14)  ftp_fput  :  FTP서버에  파일  포인터를  업로드한다.  
-----------------------------------------------  
int  ftp_fput  (int  ftp_stream,  string  remote_file,  string  local_file,  int  mode)  
$upload  =  ftp_fput($ftp,  "업로드할  파일명",  "업로드될  파일명","FTP_ASCII  or  FTP_BINARY");  
-----------------------------------------------  

(15)  ftp_size  :  파일의  사이즈를  구한다.  
-----------------------------------------------  
int  ftp_size  (int  ftp_stream,  string  remote_file)  
$filesize  =  ftp_size(  $ftp,  $contents[$i]  );  
-----------------------------------------------  
ftp_nlist  나  ftp_rawlist에  의해  구한  파일명에  대한  배열값인  $contents[$i]에는  각  파일명과  속성이  저장되어지는데  이  파일명을  사이즈로  구하면  파일이면  사이즈가  리턴되고  디렉토리이면  -1이  리턴된다.  

(16)  ftp_mdtm  :  파일의  마지막  수정시간을  timestamp  값으로  리턴한다.  
-----------------------------------------------  
int  ftp_mdtm  (int  ftp_stream,  string  remote_file)  
$filemdth  =  ftp_size(  $ftp,  "파읾명");  
-----------------------------------------------  

(17)  ftp_rename  :  파일명을  변경한다.  
-----------------------------------------------  
int  ftp_rename  (int  ftp_stream,  string  from,  string  to)  
$rename  =  ftp_rename(  $ftp,  "바꿀  파일명",  "바뀐  후  파일명");  
-----------------------------------------------  

(18)  ftp_delete  :  해당  파일을  삭제한다.  
-----------------------------------------------  
int  ftp_delete  (int  ftp_stream,  string  path)  
$delfile  =  ftp_delete($ftp,  "지울  파일명");  
-----------------------------------------------  

(19)  ftp_quit  :  연결된  FTP의  접속을  끊는다.  
-----------------------------------------------  
int  ftp_quit  (int  ftp_stream)  
ftp_quit  ($ftp);  
-----------------------------------------------  

Posted by 다오나무
php2012. 10. 11. 17:44

우분투로 APM을 설치하면...php 설정중 오류가 발생하면 에러 내용이 출력되지 않는다.

php.ini 설정 중에 출력할 지 여부를 설정 할 수 있다.(우부투 보통 /etc/php5/apache2/php.ini)

display_errors = On

으로 해주면 에러가 출력된다.

혹시나 Notice가 같이 출력된다면,

error_reporting = E_ALL & ~E_NOTIC 

으로 설정해주면...에러 리포팅이 모든 오류(E_ALL) 와(&) NOTIC을 제외한(~E_NOTIC)으로 정해주면 된다.

php.ini 의 자세한 설정은 아래 사이트에서 ^^ 

http://www.php.net/manual/kr/errorfunc.configuration.php  


설정후!

아파치를 재시작 해주면 된다!

Posted by 다오나무
php2012. 10. 9. 18:48

일정 규모 이상의 웹 사이트라면 여러 대의 웹서버로 Web farm을 구성하는 경우가 
많습니다. 
Windows 제품에 내장된 Windows Load Balancing Service(WLBS)를 사용하거나 
Layer 4 이상의 스위치 장비를 Web farm 앞단에 붙여서 여기저기로 분산 
시키거나 
DNS 서버로 하여금 한 도메인에 대해 여러 아이피를 돌아가며 응답하게 하는 등 
여러가기 방법을 사용할 수 있습니다. 

가능하면 비슷한 H/W 환경에 
똑 같은 S/W 환경 (특히 컴포넌트)을 구성해주고 
DB Connection String을 한 지점의 DB로 물려주기만 하면 크게 문제 없이 Web 
farm이 구성됩니다. 
하지만, 몇가지 정도 단일 서버 환경과는 달리 고려해야 할 점이 있는데요. 

1. 세션 유지의 문제 
Web farm으로 사용자가 접속한다는 것은 사용자가 A 서버 붙었다가 B 서버 
붙었다가 이리저리 서버마다 돌아 다니며 접속할 가능성이 있다는 얘기입니다. 
웹 서버단에서 단순히 In-proecss 세션 관리를 한다면 A 서버에 로그인 했는데, B 
서버 단으로 붙었을 때는 로그인 한 상태가 아닌 것이 되는 등 혼란이 야기될 수 
있습니다. 

이런 문제를 해결하기 위해 쿠키나 URL에 사용자의 Identity 정보를 유지를 
하거나 
State Server를 중립 지점에 두고 웹 서버 간에 세션 정보를 공유 하거나 
아예 DB 서버에 세션 정보를 유지하는 방법을 사용합니다. 

2. 파일 업로드의 문제 
사용자가 A 서버의 게시판에 붙어 파일을 업로드를 했다면, B 서버의 게시판에 
붙어서 파일을 다운로드 하려는 사용자는 어떻게 될까. 
저는 항상 중간 지점에 파일 서버 두는 방법을 사용했습니다. 그리고, 모든 웹 
서버에 UNC 경로로 가상 디렉토리를 잡아 동일한 지점의 저장소를 공유하도록 
했습니다.(마치 DB 처럼) 
이 과정에서 서버 간에 웹 사용자에 대한 인증을 통과시켜주는 것이 이슈가 
되므로 주의해야 합니다. 

3. View State의 문제 
이건 ASP.NET 응용프로그램에 해당하는 얘기인데, 
클라이언트가 이 서버 저 서버 돌아가며 붙을 수 있다는 얘기는 
서버에서 GET 으로 Web form을 받은 후 B 서버로 POST 때릴 수 있다는 
얘기입니다. 
이 때, A 서버에서 View State를 Encoding 할 때 사용했던 Key와 B 서버에서 
Decoding 할 때 사용하는 Key가 다른 문제 때문에 View State를 해독해 내지 
못하는 문제가 발생합니다. 
이럴 때는 모든 웹 서버가 같은 Key를 사용하도록 강제 설정해 주는 조치가 
필요합니다. 

4. 캐싱의 문제 
종종 웹 서버의 메모리에 DB의 Data를 Caching 해서 DB 서버와의 Round-trip 수를 
줄이고 속도 향상을 효과는 보는 경우가 많은데요. 
만약 웹 서버가 여러 대가 된다면? 
서버에 캐싱을 해 놓고, 캐싱된 데이터가 없는 B 서버에 다음 Request가 도착할 
수 있으므로 이런 상황을 항상 염두에 두고 개발하는 것이 필요합니다. 
아울러 웹 서버가 일정 대수 이상 많아지는 경우 웹 서버단에 동일한 내용을 
중복해서 캐싱하는 것이 오히려 효율이 떨어지게 되는 임계점이 있습니다. 이럴 
때는 미들 웨어를 중간 지점에 배치하는 등 multi-tier로 Farm을 구성하는 
전략적인 접근이 필요합니다. 

ASP 뉴스그룹에 좋은글이 있길래 가져왔습니다.

Posted by 다오나무
php2012. 10. 8. 13:41

서버를 분리하면서 알게된 방법입니다. 

디비 서버를 분리하는 것은 별문제가 아니지만 

웹서버와 이미지 서버를 분리할 때는 그리 간단하지 않을 것이라 생각하는데요. 

웹서버가 첨부파일을 받아서 이미지 서버로 전송해 주어야하는데 

PHP의 FTP 관련 함수로 실시간으로 전송하는 방법으로 구현했습니다. 

자료를 찾아보니 PHP 4.xx 버젼에서는 속도가 느리다는 지적이 있었는데요 

실제로 PHP 4.4xx 버전에서 테스트 해보니 접속 속도가 조금 떨어지더군요 

그래도 어느정도 쓸만하다고 생각됐구요. 
  

PHP 5.1.4 버젼에서 해보니 실시간으로 로컬에서 저장하는 것처럼 

속도의 문제가 없어 권해드립니다. 

아래는 제가 사용하는 전송 프로그램입니다. 

여러개 파일을 한꺼번에 전송할 수 있도록 했습니다. 

img 라는 디렉토리에 a.jpg b.jpg c.jpg 파일을 전송한다면 

파일은 , 로 구분하고 서브 디렉토리 생성이 필요할 경우 thum/e.jpg 식으로 하시면 

디렉토리가 생성되도록 했습니다. 


$ftp_host = ""; 
$ftp_user = ""; 
$ftp_pass = ""; 

내용을 설정하시구요. 

// $files = "a.jpg,thum/b.jpg,orig/c.jpg"; // 서브 디렉토리의 형식도 가능  
$files = "a.jpg,b.jpg,c.jpg";  // 전송할 파일들 
$source_dir = "img"; // 파일 저장 디렉토리 
$target_dir = "img"; // FTP 서버로 전송할 디렉토리 

ftp_upload($files,$source_dir,$target_dir); 

이런식으로 사용하시면 됩니다. 
참고로 100개 파일씩 루프로 전송을 해보았는데 
전혀 문제가 없었습니다. 


function ftp_upload($files,$source_dir,$target_dir){ // files 에서 (,)로 구분 

    $ftp_host = ""; 
    $ftp_user = ""; 
    $ftp_pass = ""; 

    $result = 0; 

    $conn_id = ftp_connect($ftp_host); // FTP 서버 연결 
    $login_result = ftp_login($conn_id, $ftp_user, $ftp_pass); // 접속 

    if(!$conn_id || !$login_result) return;  // 접속실패시 결과 반환 

    $dir = ftp_chdir($conn_id, $target_dir); // 해당 디렉토리로 이동 
     
    $files = explode(',',$files); // 파일구분 
     
    foreach($files as $file){ 

        $file = trim($file); 
        $d =  explode('/',$file); // 서브 디렉토리 
         
        if(count($d)>1){ 
             
            $dir_sub = ""; 

            for($i=0;$i<count($d)-1;$i++){ 

                if($dir_sub){ $dir_sub .= "/".$d[$i]; } 
                else{ $dir_sub = $d[$i]; } 

                @ftp_mkdir($conn_id, $dir_sub);  // 서브 디렉토리가 없을 경우 생성 
            }     
        } 

        $up = ftp_put($conn_id, $file, $source_dir."/".$file, FTP_BINARY); // 파일 전송 

        //echo "$up = $source_dir/$file -> $target_dir/$file<br>\n"; 

        if($up){ $result++; } 
    } 

    ftp_close($conn_id); //연결 끊기 

    return $result; 



PS  서버를 분리하는데 좋은 팁있으며 부탁드립니다.

'php' 카테고리의 다른 글

php.ini설정 - display_errors(php 에러 출력 설정)  (0) 2012.10.11
서버 분배(로드밸런싱... )  (0) 2012.10.09
php 썸네일 이미지 만들기  (0) 2012.09.29
코드이그나이터 한국 포럼  (0) 2012.09.24
파일 존재 여부 함수  (0) 2012.09.10
Posted by 다오나무
php2012. 9. 29. 02:52

업로드한 파일이나 이미 저장된 파일을 축소해서 썸네일을 생성하는 방법을 요약하면

1. 원본이미지를 불러온다

2. 새로이 생성될 이미지가 들어갈 집을 만든다

3. 만들어진 집에 원본이미지를 축소하여 붙여 넣는다

4. 저장한다.

예를들어 400*200 인 origin.gif 를 200*100 의 copy.gif 로 만드는 과정을 보자

// 원본 이미지 load

$path = "/images/origin.gif";

$o_img = imagecreatefromgif($path);

// 썸네일 이미지가 들어갈 집 만들기

$n_img = imagecreatetruecolor(200,100);

// 생성한 집에 원본이미지를 축소해서 넣기

imagecopyresampled($n_img,$o_img,0,0,0,0,200,100,400,200);

// 이미지 저장하기

$n_path = "/images/copy.gif";

imagegif($n_img, $n_path);

// 썸네일 생성

imagecopyresampled($n_img, $o_img, 0,0,$offsetX,$offsetY,$w,$h,$cropW,$cropH);

각각의 파라미터들은 썸네일이 될 이미지, 원본 이미지, x좌표 기준점, y좌표 기준점, x좌표, y좌표, 축소할 길이, 축소할 세로길이,

원본에서 잘라낼 가로길이, 원본에서 잘라낼 세로길이..

참 많다..

Posted by 다오나무
php2012. 9. 24. 07:39

http://codeigniter-kr.org


코드이그나이터 한국 포럼

Posted by 다오나무
php2012. 9. 10. 23:08

$name = '홍길동';
$filepath = '그림폴더/이름'. $name .'.gif';
if(file_exists($filepath)) {
echo "이미지 출력 html"; // 경로에 화일이 존재한다면
} else {
echo ""; // 공백처리
}

'php' 카테고리의 다른 글

php 썸네일 이미지 만들기  (0) 2012.09.29
코드이그나이터 한국 포럼  (0) 2012.09.24
페이징 처리  (0) 2012.07.31
[PHP] 정규표현식 - preg_replace, preg_match, str_replace  (0) 2012.07.26
사이트 긁어오기  (0) 2012.07.25
Posted by 다오나무
php2012. 7. 31. 07:49

$page_line=20; // 페이지당 line 수
 $page_block=10; // 블록당 page 수

 
 
<?php
 // 페이징 처리 시작
  if (!$page) $page=1;
  $pages = ceil($count/$page_line);
  $first = 1;
  if ($count>0) $first = $page_line*($page-1);
  $page_last=$count-$first;
  if($page_last>$page_line) $page_last=$page_line;
  if($count>0) mysql_data_seek($result, $first);
  // 페이지 처리 끝
 
  for ($i=0;$i<$page_last;$i++){
   $rs = mysql_fetch_array($result);
  
 ?>
 
 
-------------------------------------------------------------------------
 
 
<?php
// 블록 처리 시작
$blocks = ceil($pages/$page_block); // 전체 블록수
$block = ceil($page/$page_block); // 현재 블록
$page_s = $page_block * ($block-1); // 현재 페이지
$page_e = $page_block * $block;  // 마지막 페이지
if ($blocks <= $block) $page_e = $pages;
// 블록 처리 끝
?>
<!-- 블록 테이블 시작 -->
<table width="800" border="0" cellpadding="0" cellspacing="0">
 <tr>
  <td height="30" class="cmfont" align="center">
<?php
if ($block > 1) {
$tmp = $page_s;
?> <BR><ahref='product.php?page=<?php echo $tmp;?>&sel1=<?php echo $sel1?>&sel2=<?php echo $sel2?>&sel3=<?php echo $sel3?>&sel4=<?php echo $sel4?>&text1=<?php echo $text1?>'><img src="images/i_prev.gif" align="absmiddle" border="0"></a>&nbsp;
<?php
}
for ($i=$page_s+1; $i<=$page_e;$i++) // 현재 블록의 페이지
{
 if ($page == $i) {
  echo "<font color=\"#FC0504\"><b>$i</b></font>&nbsp;";
 } else{
 echo"<ahref=\"product.php?page=$i&sel1=$sel1&sel2=$sel2&sel3=$sel3&sel4=$sel4&text1=$text1\"><font color=\"#7C7A77\">[$i]</font></a>&nbsp;";
 }
}
?>
<?php
if ($block < $blocks) // 다음 블록으로
{
 $tmp = $page_e+1;
?><BR><ahref='product.php?page=<?php echo $tmp;?>&sel1=<?php echo $sel1?>&sel2=<?php echo $sel2?>&sel3=<?php echo $sel3?>&sel4=<?php echo $sel4?>&text1=<?php echo $text1?>'><img src="images/i_next.gif" align="absmiddle" border="0"></a>&nbsp;
<?php
}
?>
  
  </td>
 </tr>
</table>
<!-- 블록 테이블 끝-->
Posted by 다오나무
php2012. 7. 26. 19:23

//iframe 제거

 $STRING = preg_replace("!<iframe(.*?)<\/iframe>!is","",$STRING);
 

 //script 제거

 $STRING = preg_replace("!<script(.*?)<\/script>!is","",$STRING);
 

 //meta 제거

 $STRING = preg_replace("!<meta(.*?)>!is","",$STRING); 
 

 //style 태그 제거

 $STRING = preg_replace("!<style(.*?)<\/style>!is","",$STRING); 
 

 //&nbsp;를 공백으로 변환

 $STRING = str_replace("&nbsp;"," ",$STRING);
 

 //연속된 공백 1개로

 $STRING = preg_replace("/\s{2,}/"," ",$STRING);
 

 //태그안에 style= 속성 제거

 $STRING = preg_replace("/ style=([^\"\']+) /"," ",$STRING); // style=border:0... 따옴표가 없을때
 
$STRING = preg_replace("/ style=(\"|\')?([^\"\']+)(\"|\')?/","",$STRING); // style="border:0..." 따옴표 있을때
 

 //태그안의 width=, height= 속성 제거

 $STRING = preg_replace("/ width=(\"|\')?\d+(\"|\')?/","",$STRING);
 $STRING = preg_replace("/ height=(\"|\')?\d+(\"|\')?/","",$STRING);
 

 //img 태그 추출 src 추출

 preg_match("/<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>/i",$STRING,$RESULT);
 preg_match_all("/<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>/i",$STRING,$RESULT);

'php' 카테고리의 다른 글

파일 존재 여부 함수  (0) 2012.09.10
페이징 처리  (0) 2012.07.31
사이트 긁어오기  (0) 2012.07.25
snoopy class를 이용한 youtube 이미지 저장 (php)  (0) 2012.07.25
PHP5: Screen scraping with DOM and XPath  (0) 2012.07.24
Posted by 다오나무