Q&A

외부 페이지 캐시 이용

2023.08.11 09:30
61
0
CMS/프레임워크 Rhymix 2.1
개발 언어 PHP 7.4

안녕하세요.

 

외부 페이지 캐시를 이용하려고하고 있습니다.

 

<?php

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

    if ($data)

   {
           return $data;

    }

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

    return $data;
}

 

echo $data

 

?>

 

 

이런식으로 api를 통해서 data 값을 캐시에 저장 시켰습니다.

 

echo $data 를 해봐도 공백이나오네요

 

이캐시된 데이터를 불러오는 코드는 어떻게 될까요?

 

캐시에 데이터를 저장 했으면 불러와야할것 같은데

 

제가 원리를 잘못이해하고있는것일까요?

 

도움 부탁드립니다.

톰캣 Lv. 11
시대의 흐름에 뒤떨어지지 않도록 아주 천천히지만 노력하고 있습니다.

댓글 7

  • 2023.08.11 11:18 #1780037
    코드만 보면 정상적으로 데이터가 나오는게 맞습니다만, 캐시는 말 그대로 데이터를 저장하는 임시 장소입니다.

    캐시에 내가 지정한 시간까지 무조건 데이터가 저장되어있을것이다! 라는 가정은 절대 하시면 안됩니다.

    캐시에 데이터가 저장되자마자 삭제되어도 본 동작에는 무리가 없게 설계하셔야 합니다.



    그리고 문제에 대해 추정을 해보자면 Cache 클래스는 라이믹스의 캐시 수단을 활용하고 있습니다.

    혹시 라이믹스 설정에서 라이믹스 캐시 방식을 apc 혹은 그 외의 수단으로 설정했는지 확인해보시겠어요?

    캐시 사용안함으로 설정되어있으면 캐시에 데이터가 저장되지 않는게 정상입니다.
    => 저장되지 않았으니 get을 해도 아무런 값이 안나오는게 정상이죠 ㅎㅎ
  • 2023.08.11 12:52 #1780095

    답변 감사합니다.

    특별히 외부 캐시를 쓰는곳은 없습니다.

     

    페이지에서 캐시를 60분 주니깐
    echo date('Y-m-d H:i:s');를 해보니 마지막에 실행한 시간에 멈춰 있는것 같네요.
    일반 html 캐시로 작동하는 것같아요.

  • 2023.08.11 14:39 #1780141
    말씀 주신것처럼 캐시 사용안함으로 되어있었네요
  • 2023.08.11 12:14 #1780067

    getMyDataFromAPI() 함수를 정의하기만 하고, 실행(호출)하는 부분이 안 보이는데요.

    내가 그의 이름을 부르기 전에는 그는... 아무튼 뭐 아무 일도 일어나지 않죠.

     

    만약 호출한다 해도, 함수 안에서 사용한 $data라는 변수는 함수 바깥의 세상에는 존재하지 않습니다.

    함수는 입력값(input)과 리턴값(output)을 통해서만 바깥 세상과 데이터를 주고받을 수 있지요.
     

    $data = getMyDataFromAPI();

     

    이렇게 함수를 실행한 결과를 받아와서 $data에 담아야

    함수 바깥에도 $data가 존재하게 되겠지요.

  • 2023.08.11 12:51 #1780091

    혹시
    rxe와 연결 되어있는 아무 외부 문서에서
    $data = getMyDataFromAPI();
    를 호출하면 아까 저장해놓았던 저 data의 캐시값을 가져올 수 있게 되는건가요?

    사실 방금 getMyDataFromAPI() 함수를 정의한 문서는 여전히 로딩이 느리더라구요. (아마 계속 캐시키 aaaaaaaa에 새값을 저장하는 듯한 느낌)

    그게 맞다면 getMyDataFromAPI() 함수를 정의한 문서를 클론탭에 넣고 사용자에게는

    rxe와 연결 되어있는 아무 외부 문서에서

     

    <?php
    $data = getMyDataFromAPI();
    echo ($data);
    ?>

    {@ $data = getMyDataFromAPI()}
    {@ echo ($data);}

     

    $data = getMyDataFromAPI(); 를 호출하고
    데이터를 출력해주면 된다 로 이해한게 맞을까요?

     

    로 해보니 정의된 것이 없다보니 500에러가 나오네요

  • 2023.08.11 13:06 #1780100
    그리고 추가 적으로 데이터를
    data 하나만말고
    data,data2,data3,data4,data5,data6,data7,data8,data9,data10
    이 정도는 캐시 시켜야하는데

    이것다 나열을 해야할까요?

    if ($data)

    {
    return $data;

    }

    이렇게 하나만 하기엔 정보를 담는게 부족하네요


    지금 처럼 통 html을 다 넣기엔 또 뭔가 아쉽고 ㅎㅎ
  • 2023.08.11 13:30 #1780109
    캐시 키를 여러개 사용하세요

    Rhymix\Framework\Cache::set('key1', $data1, $ttl);
    ...
    Rhymix\Framework\Cache::set('key2', $data2, $ttl);
    ...