Extra Form
PHP PHP 7.2
CMS XpressEngine

요즘 외부페이지에  php와  html 로 쪼물딱 걸려서 출력하는 페이지를 만들었는데요.

 

캐시 쪽을 잘 모르다보니 매번 api 요청을 해서 데이터를 가져오게 하고 있는데

사실 가져온 데이터만 캐시에 잘 저장하고 만기 시간 지정하고 하면 api쪽 들르지 않아도 되서 좋은데

요거 쉽게 볼수 있는 예제 같은게 혹시 있을까 해서 질문 드립니다.

 

외부페이지 위젯화 해주는 것으로 해서 출력을 하고 있고 캐시를 줄 수 있긴 하지만 html 자체가 캐시되어서

문제가 좀 발생하는 여지가 많아서 이 캐시는 못쓰는 경우가 많고 하더라고요.

 

데이터만 캐시해서 그 데이터만 재활용하는게 정답일 듯 한데 앞으로 가능하면 구현해 보고 싶네요.

  • profile
    자료를 db에 넣고 db에서 가져오면 되죠.
    api요청은 서버사용하시니 크론잡으로 정기적으로 가져와서 db에 넣어주구요.
  • profile profile
    db 보다는 캐시로 하는게 효율적이고 빠르고 간편할 거 같아서요.
  • profile

    XE1

     

    $cache_key = '내가 사용하고 싶은 이름 ... 알파벳, 숫자, 콜론(:) 문자만으로 구성';

    $oCacheHandler = CacheHandler::getInstance('object');

    if ($oCacheHandler->isSupport() && $data = $oCacheHandler->get($cache_key)) {

        return $data;

    }

     

    ... 데이터를 불러와서 $data에 저장 ...

     

    $ttl = 캐시에 저장해놓을 기간 (단위: 초);

    if ($oCacheHandler->isSupport()) {

        $oCacheHandler->put($cache_key, $data, $ttl);

    }

    return $data;

     

     

    라이믹스

    (호환성을 위해 XE1 방식도 지원합니다.)

     

    $cache_key = '내가 사용하고 싶은 이름 ... 알파벳, 숫자, 콜론(:) 문자만으로 구성';

    $data = Rhymix\Framework\Cache::get($cache_key);

    if ($data) {

        return $data;

    }

     

    ... 데이터를 불러와서 $data에 저장 ...

     

    $ttl = 캐시에 저장해놓을 기간 (단위: 초);

    Rhymix\Framework\Cache::set($cache_key, $data, $ttl);

    return $data;

     

    함수 안에서 사용한다고 가정하고 $data를 반환하도록 예제를 작성했습니다.

    두 예제 모두 코어에서 오브젝트 캐시가 켜져 있어야 사용할 수 있습니다.

    오브젝트 캐시가 꺼져 있다면 처음에 $data가 돌아오지 않으므로 무조건 다음 단계로 진행합니다.

  • profile profile
    이게 외부 페이지에 직접 작성해도 될까요?
    외부페이지 위젯을 통해 돌리니 XE템플릿에서 사용하는 것 다 돌아가긴 합니다.
  • profile profile
    애드온이나 위젯 class 등에서 사용한다고 가정하고 작성한 예제입니다.
    템플릿에서 사용하려면 중괄호도 문제이지만
    빨리 return할 수 없기 때문에 조건을 좀더 복잡하게 만들어야 할 것 같습니다.
  • profile profile
    그냥 위젯으로 만들걸 그랬네요 ㅜㅜ
  • profile profile
    데이터 불러오는 함수만 php 파일에다가 따로 빼놓고
    그 파일을 include_once해서 외부페이지에서 사용하세요.
  • profile profile
    네. 시도해볼게요
  • profile profile
    api에서 요청하는 부분을

    ... 데이터를 불러와서 $data에 저장 ...

    에 넣으면 되는거죠?

    데이터 자체가 출력이 안되는거 보니 뭔가 제가 잘못하고 있나 봅니다.
  • profile profile

    네.

     

    function getMyDataFromAPI(변수 공유가 필요하면 여기서 전달)

    {

        ... 어쩌고 ...

        return $data;

    }

     

    이렇게 함수를 선언해 놓고

    템플릿에서는

     

    {@ $data = getMyDataFromAPI(변수 공유가 필요하면 여기서 전달)}

     

    이렇게 쓰시는 것이 좋습니다.

  • profile profile
    오~ 가르쳐주신대로 했더니 나옵니다!! 감사합니다.
    이제 캐시운영이 가능해졌네요.
  • profile profile
    속도가 이상해서 캐시가 되는지 확인해보려고 echo 를 넣어봤는데요.


    <?php
    function getMyCoronakDataFromAPI()
    {
    $cache_key_k = 'coronadata_k';
    $oCacheHandler = CacheHandler::getInstance('object');

    if ($oCacheHandler->isSupport() && $data_k = $oCacheHandler->get($cache_key_k)) {

    return $data_k;

    }


    $url = "";
    echo '22222222';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $response = curl_exec($ch);
    curl_close($ch);
    $data_k = json_decode($response);

    return $data_k;

    $ttl = 600;

    if ($oCacheHandler->isSupport()) {

    $oCacheHandler->put($cache_key_k, $data_k, $ttl);

    }

    return $data_k;
    }



    22222이 출력되는데 캐시가 안되는거지요???
  • profile profile
    불러온 데이터를 캐시에 저장하기 전에 return $data_k; 해버리고 있네요.
  • profile profile
    알려주신것을 제가 잘못해석했나보네요. 고쳐보겠습니다.
  • profile profile
    해당부분 삭제하니까 캐시 되자마자 22222 출력 안되고 빨라졌네요. 감사합니다.
    오늘도 많이 배웠습니다!!!!
  • profile profile

    웹지기 님과 기진곰님 댓글을 종합해 봤는데

    <?php

    function getMyDataFromAPI()
    {
        $cache_key = 'wave_chart';
        $data = Rhymix\Framework\Cache::get($cache_key);

        if ($data) {
            // 실제 API를 불러오는 내용
            $data = ...
            
            $ttl = 3600;
            Rhymix\Framework\Cache::set($cache_key, $data, $ttl);
            return $data;
        }
    }

    ?>

    로 이해한게 맞을까요?

  • profile profile

    <?php

    function getMyDataFromAPI()
    {
        $cache_key = 'wave_chart';
        $data = Rhymix\Framework\Cache::get($cache_key);

        if ($data)

       {
               return $data;

        }

        // 실제 API를 불러오는 내용
        $data = ...
            
        $ttl = 3600;
        Rhymix\Framework\Cache::set($cache_key, $data, $ttl);

        return $data;
    }

    ?>

    가 맞을 것같습니다.

  • profile profile
    근데 생각해봤는데 결국 가공전의 data만 캐시되는셈이 되는것 아닐까요?

    이 data를 여러개 만들어서 캐시키에 담아야할것 같기도하구요.

    제 머릿속에서 정의가 제대로 되지 않네요