2012-08-06 2 views
1

ExpressionEngine 2.x에 대한 추가 기능을 만들고 있는데 서버의 일부 데이터를 캐시하고 싶습니다. 특히, 나는 동일한 요청에 대해 다시 구문 분석 할 필요가 없도록 템플릿 구문 분석의 결과를 캐시하고 싶습니다.Expression engine addon에서 캐싱

현재 나는 $_SESSION을 사용하고 있지만 해당 사용자에 대해서만 캐시합니다. 이상적으로, 모든 사람을위한 캐시를 메모리 나 디스크에 저장하고 싶습니다. 나는 또한 $this->EE->session->cache을 시도했지만 현재 요청에 대해서만 캐시합니다. CodeIgniter의 캐싱 드라이버를 살펴 봤지만 ExpressionEngine의 추가 기능에서 어떻게 작동하는지 알 수는 없습니다. http://codeigniter.com/user_guide/libraries/caching.html

Memcache을 사용하거나 파일을 만들지 만 여러 설정에서 작동해야하기 때문에 Memcache가 설치되거나 쓰기 가능한 폴더가 있다는 보장은 없습니다.

아이디어가 있으십니까?

+1

CE 캐시 (http://www.causingeffect.com/software/expressionengine/ce-cache)는 개발자가 서버에 설치되어있는 것에 의존하여 사용하는 캐싱 설정을 선택할 수 있도록 구성 설정을 사용합니다. 접근 방식의 종류 ...? 그래서 Memcache 용으로 빌드하고, 탐지되거나 선택되지 않은 경우 파일이나 데이터베이스 또는 캐싱하지 않습니다. –

답변

2

한 번 CI- 캐싱 메커니즘의 일부를 다시 작성했습니다. 아마도 이것은 당신에게 도움이 될 수 있습니다. 그것은 '캐시'모든 기능입니다. 시스템 파일에 대한 덮어 쓰기로 작성했습니다.

사용 예가 나와 있습니다. 그것은 아주 간단해야합니다. 이 코드를 사용하여 모든 함수 결과를 캐시 할 수 있으며 세션/요청간에 공유 할 수도 있습니다.

http://codeigniter.com/forums/viewthread/221313/

또는이 하나 :이 새로운 기능이 필요하지 않은 경우

https://github.com/EllisLab/CodeIgniter/issues/1646

, 표준 CI 캐싱 메커니즘을 사용하는 방법에 대한 예제로 사용할 수 있습니다. 이처럼

:

class your_class extends CI_Model 
{ 
    // ------------------------------------------------------------------------ 

    function __construct() 
    { 
     $cache_adapter = 'apc'; 
     $this->load->driver('cache', array('adapter' => $cache_adapter, 'backup' => 'dummy')); 
     $this->cache->{$cache_adapter}->is_supported(); 
    } 

    // ------------------------------------------------------------------------ 

    public function your_function($arg) 
    { 
     $result = $this->cache->get(__CLASS__ . __METHOD__ . serialize($arg)); 

     if (empty($result)) 
     { 
      $result = ... /* your calculation here */ 

      $this->cache->save(__CLASS__ . __METHOD__ . serialize($arg)); 
     } 
     return $result; 
    } 
} 

내가 캐시에 사용하는 키는 소위 망가 함수 이름입니다. 함수의 결과가 argumens에만 의존하면 (필요에 따라) 그대로 사용할 수 있습니다. 키의 소형화를 위해 해시 할 수 있습니다.

public function your_function($arg) 
    { 
     $result = $this->cache->get(md5(__CLASS__ . __METHOD__ . serialize($arg))); 

     if (empty($result)) 
     { 
      $result = ... /* your calculation here */ 

      $this->cache->save(md5(__CLASS__ . __METHOD__ . serialize($arg))); 
     } 
     return $result; 
    } 
+0

감사합니다. 유용한 코드입니다. 그러나 addon으로 배포하려는 경우 third_party 폴더 외부에서 수정할 수 없습니다. – Patrick64

+0

동의. 표준 EE 캐싱 만 사용하면됩니다. 사용법에 대한 예제는 내 코드를 참조하십시오. –

+0

건배. 이제는 PHP의 apc 캐싱을 사용하여 일반적으로 활성화 된 것으로 보입니다. 불행히도 CodeIgnitor의 $ this-> load-> driver 함수를 EE에서 호출하는 방법을 찾을 수는 없지만 코드가 올바른 방향으로 나를 가리키고 있습니다. – Patrick64

1

간단한 방법 :이처럼 성능을 향상시키기 위해 EE의 기본 태그 캐싱을 사용하도록 추가 기능의 사용자를 지시합니다. 태그 캐싱은 사용자와 상관없이 EE 태그별로 작동합니다.

또는 캐싱 된 데이터를 저장하기 위해 설치시 데이터베이스 테이블을 만들 수 있습니다. 얼마나 많은 데이터와 어떤 종류의 데이터를 캐싱 하느냐에 따라 성능이 향상 될 수도 있고 그렇지 않을 수도 있습니다.

+0

네이티브 태그 캐싱은 좋은 솔루션이지만 필드 또는 확장이 아닌 모듈이나 플러그인 인 경우에만 가능합니다. –

+0

그것은 좋겠지 만 콘텐츠를 URL을 기반으로 변경됩니다 캐시를 ​​사용할 때 선택하고 싶습니다 및 캐시를 사용하는 경우에도 몇 가지 할 싶습니다. 데이터베이스 캐싱은 좋은 생각이지만, 나는 그것에 대해 살펴볼 것입니다. – Patrick64

관련 문제