php에서 데이터를 캐시해서 활용하는 법
CMS/프레임워크 | XE 1.x |
---|---|
개발 언어 | PHP 7.2 |
요즘 외부페이지에 php와 html 로 쪼물딱 걸려서 출력하는 페이지를 만들었는데요.
캐시 쪽을 잘 모르다보니 매번 api 요청을 해서 데이터를 가져오게 하고 있는데
사실 가져온 데이터만 캐시에 잘 저장하고 만기 시간 지정하고 하면 api쪽 들르지 않아도 되서 좋은데
요거 쉽게 볼수 있는 예제 같은게 혹시 있을까 해서 질문 드립니다.
외부페이지 위젯화 해주는 것으로 해서 출력을 하고 있고 캐시를 줄 수 있긴 하지만 html 자체가 캐시되어서
문제가 좀 발생하는 여지가 많아서 이 캐시는 못쓰는 경우가 많고 하더라고요.
데이터만 캐시해서 그 데이터만 재활용하는게 정답일 듯 한데 앞으로 가능하면 구현해 보고 싶네요.
댓글 18
api요청은 서버사용하시니 크론잡으로 정기적으로 가져와서 db에 넣어주구요.
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가 돌아오지 않으므로 무조건 다음 단계로 진행합니다.
외부페이지 위젯을 통해 돌리니 XE템플릿에서 사용하는 것 다 돌아가긴 합니다.
템플릿에서 사용하려면 중괄호도 문제이지만
빨리 return할 수 없기 때문에 조건을 좀더 복잡하게 만들어야 할 것 같습니다.
그 파일을 include_once해서 외부페이지에서 사용하세요.
... 데이터를 불러와서 $data에 저장 ...
에 넣으면 되는거죠?
데이터 자체가 출력이 안되는거 보니 뭔가 제가 잘못하고 있나 봅니다.
네.
function getMyDataFromAPI(변수 공유가 필요하면 여기서 전달)
{
... 어쩌고 ...
return $data;
}
이렇게 함수를 선언해 놓고
템플릿에서는
{@ $data = getMyDataFromAPI(변수 공유가 필요하면 여기서 전달)}
이렇게 쓰시는 것이 좋습니다.
이제 캐시운영이 가능해졌네요.
<?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이 출력되는데 캐시가 안되는거지요???
오늘도 많이 배웠습니다!!!!
웹지기 님과 기진곰님 댓글을 종합해 봤는데
<?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;
}
}
?>
로 이해한게 맞을까요?
<?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;
}
?>
가 맞을 것같습니다.
이 data를 여러개 만들어서 캐시키에 담아야할것 같기도하구요.
제 머릿속에서 정의가 제대로 되지 않네요