* PHP를 통해서 원격에 있는 이미지를 긁어오거나 복사하고 싶을 때가 많은데 예외상황이 많을 것이다. 한번 예외상황들에 대해서 적어보고, 특히 php.ini를 마음대로 수정못하는 웹호스팅을 하고 있다면 꽤나 골치 아플 일이 많을 것이다.

 

: 일단 첫번째로 확인해야될 제약사항은 php.ini에서 "allow_url_fopen"이 "on" 되어있어야한다는 것이다. 만약 이것이 on 되어있다면 원격의 파일을 꽤나 쉽게 가져올 수 있다.

 

* copy 함수를 이용해서 원격 이미지 가져오기

: 우선 가장 간단하게 가져올 수 있는 방법은 copy 함수를 쓰는 것이다.

copy("http://remotedomain.com/image.jpg", "/tmp/local.jpg");

: 위와 같이 하면 바로 원격의 파일을 로컬로 복사해서 가져올 수 있다.

 

* file_get_contents, file_put_contents 함수를 이용하는 방법

: 위보다 조금은 복잡하게, 그러나 파일의 내용을 수정하고 싶거나 전체 흐름을 조율하고 싶다면 아래와 같이 할수도 있다.

$img = file_get_contents("http://remotedomain.com/image.jpg");
$save = file_put_contents("/tmp/local.jpg");

: 아니면 fwrite를 쓸수도 있다.

$img = file_get_contents("http://remotedomain.com/image.jpg");
$fp = fopen("/tmp/local.jpg", "w");
fwrite($fp, $img);
fclose($fp)
: fopen을 쓰고 싶다면 다소 복잡해지지만 가능은 하다. 물론 위의 allow_url_fopen이 설정되어있다면 가능한 것이다.
$rf = fopen($url, "r");
$fp = fopen("/tmp/local.jpg", "w");

while(!feof($rf)) {
  fwrite($fp, fread($rf, 1), 1);
}
fclose($rf);
fclose($fp);
 
: 아무튼 php.ini에서 "allow_url_fopen"이 설정되어있는 경우는 쉽게 되지만, 안되어있는 경우에는 별도로 curl을 사용해서 가져와야한다. 위의 방법들을 사용하고 싶다면 php.ini에 allow_url_fopen=on으로 설정하거나, 아파치 등 웹서버 설정에서 overwrite할 수 있다면, .htaccess에서 php_value allow_url_fopen on 등으로 설정하면 된다. (PHP 4.3.4 이상 버전 호환)
 
 
* curl을 이용하는 방법
: 웹서버의 제약이나 php의 제약으로 인하여 위의 allow_url_fopen을 설정할 수 없다면, 원격의 url에 fopen을 사용하지 못하면 직접 접속해서 가져와야할 것이다. 가장 쉽게는 curl을 사용하면 된다.
$fp = fopen("/tmp/loca.jpg", "w");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://remotedomain.com/image.jpg");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)");
curl_setopt($ch, CURLOPT_FILE, $fp);

curl_exec($ch);

fclose($fp);
curl_close($ch);
 

 

: 이외에서 http모듈을 사용하는 방법도 있지만, 아무리 막혀있어도 curl에서는 해결이 될 것이므로 이정도면 원격 URL의 파일을 가져오는데에는 성공할것이라 생각한다.

 

원격 URL의 파일을 로컬로 가져오기 끝.

 

출처: https://unikys.tistory.com/345 [All-round programmer:티스토리]

블로그 이미지

슬픈외로움

개발이 어려워? 모든것엔 답이있다...

,

오랫만에 자료 남깁니다.

MySQL 에서 날짜 계산하는 펑션을 소개 드립니다.

 

DATE_ADD 펑션을 사용하면 되구요.....

 

DATE_ADD(기준일, 기간) 형태로 사용하게 됩니다.  아래에 예시 쿼리를 남깁니다.

 

하루
SELECT COLUMN1,2.... FROM TABLE WHERE DATE_COLUMN BETWEEN DATE_ADD(NOW(),INTERVAL -1 DAY ) AND NOW();

일주일
SELECT COLUMN1,2.... FROM TABLE WHERE DATE_COLUMN BETWEEN DATE_ADD(NOW(),INTERVAL -1 WEEK ) AND NOW();

한달
SELECT COLUMN1,2.... FROM TABLE WHERE DATE_COLUMN BETWEEN DATE_ADD(NOW(),INTERVAL -1 MONTH ) AND NOW();

 

행복하세요!!

블로그 이미지

슬픈외로움

개발이 어려워? 모든것엔 답이있다...

,

pid로 프로세스를 종료하는 방법을 정리합니다. 사용하는 명령은 다음과 같습니다.

  • ps
  • grep
  • awk
  • kill

pid를 조회하여 프로세스 종료하는 명령은 다음과 같은 절차로 작성됩니다.

  1. 원하는 프로세스 목록만 가져오기 - ps, grep, pgrep(ps+grep)
  2. 프로세스 목록에서 pid만 가져오기 - awk
  3. kill 명령어로 한번에 프로세스 종료 - (backtick)

backtick은 다음 그림과 같은 위치의 문자를 의미합니다.


프로세스 목록 조회

ps 및 grep 명령을 대상 프로세스를 조회합니다.

 

ps -ef | grep hugo

501 6582 479 0 12:39AM ttys000 0:01.15 hugo server

501 6919 479 0 12:44AM ttys000 0:00.21 hugo server

501 7011 479 0 12:44AM ttys000 0:01.16 hugo server

501 7104 479 0 12:44AM ttys000 0:01.16 hugo server

501 7276 479 0 12:44AM ttys000 0:01.15 hugo server

501 7371 479 0 12:44AM ttys000 0:01.16 hugo server

501 7463 479 0 12:44AM ttys000 0:01.14 hugo server

501 7637 479 0 12:45AM ttys000 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn hugo

프로세스 목록에서 pid 출력

awk로 프로세의 정보를 출력합니다. 컬럼 지정은 작은 따움표로 설정합니다.

 

> ps -ef | grep hugo | awk '{print $1,$2,$3,$8}'

501 6582 479 hugo 501 6919 479 hugo

501 7011 479 hugo 501 7104 479 hugo

501 7276 479 hugo 501 7371 479 hugo

501 7463 479 hugo 501 7903 479 grep

>

 

두 번째 컬럼($2)으로 pid를 지정하여 출력합니다.

 

> ps -ef|grep hugo|awk '{print $2}'

6582

6919

7011

7104

7276

7371

7463

7952

>

프로세스 종료

쉡 스크립트에서 backtick(`) 사이의 명령은 실행되고 그 결과가 앞에 명령에 입력됨니다.

다음과 같이 pid는 kill 명령에 전달되어 종료됩니다.

 

>kill -9 `ps -ef | grep hugo|awk '{print $2}'`

kill: kill 8385 failed: no such process

[7] + 7463 killed hugo server

[6] + 7371 killed hugo server

[5] + 7276 killed hugo server

[4] + 7104 killed hugo server

[3] + 7011 killed hugo server

[2] + 6919 killed hugo server

[1] + 6582 killed hugo server

>

 

블로그 이미지

슬픈외로움

개발이 어려워? 모든것엔 답이있다...

,

특정 날짜가 해당 월의 몇주차인지 계산해주는 함수입니다.

 

사용법 :

$nowJucha = getWeekInfo(date("Y-m-d"));

또는

$nowJucha = getWeekInfo(date("2021-03-17"));

 

function getWeekInfo($_date)
{
    $BASIC_DOW = 1; // 1(mon) ~ 7(sun)
    list($yy, $mm, $dd) = explode('-', $_date);
    
    $dow = date('N', mktime(0, 0, 0, $mm, 1, $yy));
    
    if ($dow <= $BASIC_DOW)
    {
        $diff = $BASIC_DOW - $dow;
        $srt_day = $diff+1;
    } else {
        $diff = 7-$dow;
        $srt_day = $diff + $BASIC_DOW + 1;
    }

    if ($dd < $srt_day)
    {
        $new_date = date('Y-m-d', mktime(0, 0, 0, $mm, 0, $yy));
        return getWeekInfo($new_date);
    } else {
        $wom = ceil(($dd-($srt_day-1))/7);

        // 이곳을 수정하면 원하시는 결과로 리턴하셔도 됩니다.
        $new_date = (int)$mm. '-' .$wom; 
        return $new_date;
    }
}

 

즐프하세요~

블로그 이미지

슬픈외로움

개발이 어려워? 모든것엔 답이있다...

,

스케줄러나 업무일지등을 개발하다보면 날짜관련 컨트롤이 필요할때가 많습니다.

이때 애매한게.. 주간 날짜를 구하는거죠..

이번주 시작일과 끝날짜  이전주, 다음주 날짜 범위를 구하는 방법입니다.

 

$today = time();
$week = date("w");

$week_first = $today-($week*86400);
$week_last = $week_first+(6*86400);

지난주 = date("Y-m-d",$week_first-(86400*7))." ~ ".date("Y-m-d",$week_last-(86400*7));
이번주 = date("Y-m-d",$week_first)." ~ ".date("Y-m-d",$week_last);
다음주 = date("Y-m-d",$week_first+(86400*7))." ~ ".date("Y-m-d",$week_last+(86400*7));

 

응용해서 $today 부분을 특정 날짜로 하면 그날짜가 속한 주간 날짜범위를 구하실 수 있습니다.

 

$today = mktimemktime(23,59,59,03,17,2021);

 

이런식으루요~

 

그럼 즐프들 하십시요!

블로그 이미지

슬픈외로움

개발이 어려워? 모든것엔 답이있다...

,