2011-08-07 3 views
2

Zend_Log (Zend_Log_Writer_Stream) 인스턴스를 Zend_Cache (선호) 또는 Zend_Registry (대체)에 저장하려고하지만 대신 사용자 정의 도우미를 추상화 레이어로 저장하려고합니다. 직접 액세스.사용자 정의 도우미가있는 /없는 Zend_Cache/Zend_Registry에 Zend_Log 인스턴스 저장하기

직접 Zend_Registry를 사용하는 경우를 제외하고 문제

  • , 매번 Zend_Log_Writer_Stream의 _stream 속성이 사라집니다.

아래 코드를 출력과 함께 첨부했습니다.

theselinks 나는 응용 프로그램이 아닌 별도의 데이터베이스에 쓰는 다른 작성자 Zend_Log_Writer_Database를 가지고 있으므로 초기화해야합니다. 지금 나는 그것을 주석 처리했다.

로거 로컬 변수

,536,913,632 -

Bootstrap.php

class Helper_SCacheOrRegistry { 

    private $_source; 
    private static $_instance; 
    private $_functionsArray = array('Cache' => array(
      'get' => '_getFromCache', 
      'set' => '_saveInCache', 
      'del' => '_deleteFromCache', 
      'exists' => '_existsInCache'), 
     'Registry' => array(
      'get' => '_getFromRegistry', 
      'set' => '_saveInRegistry', 
      'del' => '_deleteFromRegistry', 
      'exists' => '_existsInRegistry', 
     ) 
    ); 

    public static function getInstance() { 
     if (!isset(self::$_instance)) { 
      $c = __CLASS__; 
      self::$_instance = new $c(); 
     } 

     return self::$_instance; 
    } 


    private function _getSource($forceRegistry = null) { 
     if(true === $forceRegistry) 
      return Zend_Registry::getInstance(); 

     if (Zend_Registry::getInstance()->offsetExists('apcCache')) 
      return Zend_Registry::get('apcCache'); 
     else 
      return Zend_Registry::getInstance(); 

    } 

    private function _isSourceCache() { 
     return (!$this->_source instanceof Zend_Registry); 
    } 

    public function createCacheId($id) { 
     return md5(',[email protected]!u$#~\|3Pa^e1%oh&s0*<h(7)o-+h/t.' . $id); 
    } 

    public function set($key, $value, $forceRegistry = null) { 
     $this->_fire('set', $this->createCacheId($key), $value, $forceRegistry); 
    } 

    public function get($key, $forceRegistry = null) { 
     return $this->_fire('get', $this->createCacheId($key), null, $forceRegistry); 
    } 

    public function del($key, $forceRegistry = null) { 
     return $this->_fire('del', $this->createCacheId($key), null, $forceRegistry); 
    } 

    public function exists($key, $forceRegistry = null) { 
     return $this->_fire('exists', $this->createCacheId($key), null, $forceRegistry); 
    } 

    private function _fire($method, $key, $value = null, $forceRegistry = null) { 


     $this->_source = $this->_getSource($forceRegistry); 
     $call = ($this->_isSourceCache()) ? 
       $this->_functionsArray['Cache'][$method] : $this->_functionsArray['Registry'][$method]; 

     return (isset($value)) ? $this->$call($key, $value) : $this->$call($key); 
    } 

    private function _getFromCache($key) { 
     return $this->_existsInCache($key); 
    } 

    private function _saveInCache($key, $value) { 
     if ($this->_existsInCache($key)) 
      return false; 

     $this->_source->save($value, $key); 
     return true; 
    } 

    private function _deleteFromCache($key) { 
     if (!$this->_existsInCache($key)) 
      return false; 

     $this->_source->remove($key); 
     return true; 
    } 

    private function _existsInCache($key) { 
     return $this->_source->load($key); 
    } 

    private function _getFromRegistry($key) { 
     if ($this->_existsInRegistry($key)) 
      return unserialize($this->_source->get($key)); 

     return false; 
    } 

    private function _saveInRegistry($key, $value) { 
     if ($this->_existsInRegistry($key)) 
      return false; 

     $this->_source->set($key, serialize($value)); 
     return true; 
    } 

    private function _deleteFromRegistry($key) { 
     if (!$this->_existsInCache($key)) 
      return false; 

     $this->_source->offsetUnset($key); 
     return true; 
    } 

    private function _existsInRegistry($key) { 
     return $this->_source->isRegistered($key); 
    } 

} 

출력 Helper_SCacheOrRegistry.php

protected function _initLog() { 
     // instantiate CacheOrRegistry variable. 
     $this->_cor = Helper_SCacheOrRegistry::getInstance(); 

     // make sure its not already cached and config for this resource exists. 
     if ($this->_cor->exists('logger') || !($config = $this->_config->resources->log)) 
      return; 


     $logger = new Zend_Log(); 
     $config = $config->toArray(); 

     /* 

    if (isset($config['db']) && is_array($config['db'])) { 
     $dbParams = $config['db']; 
     $writerDb = new Zend_Log_Writer_Db(
         $this->_cor->get('logDb'), 
         $dbParams['writerParams']['table'], 
         $dbParams['writerParams']['columnMapping']); 

     if (isset($dbParams['filterName'])) { 

      switch ($dbParams['filterName']) { 
       case 'Priority': 
        $writerDb->addFilter(new Zend_Log_Filter_Priority($dbParams['filterParams']['priority'])); 
        break; 
      } 
     } 

     $logger->addWriter($writerDb); 
    } 
    */ 

     if('development' === APPLICATION_ENV) { 
     $fileParams = $this->_options['resources']['log']['file']; 
     if(!isset($fileParams) || !(is_array($fileParams))) 
      return; 

     $writerFile = new Zend_Log_Writer_Stream($fileParams['writerParams']['path'],$fileParams['writerParams']['mode']); 
     $writerFile->setFormatter(new Zend_Log_Formatter_Simple($fileParams['writerParams']['format'])); 

     if (isset($fileParams['filterName'])) { 
      switch ($fileParams['filterName']) { 
       case 'Priority': 
        $writerFile->addFilter(new Zend_Log_Filter_Priority($fileParams['filterParams']['priority'])); 
        break; 
      } 
     } 

     $logger->addWriter($writerFile); 
     } 



     $logger->setEventItem('user_agent', $_SERVER['HTTP_USER_AGENT']); 
     $logger->setEventItem('get_vars', serialize($_GET)); 
     $logger->setEventItem('post_vars', serialize($_POST)); 
     $logger->setEventItem('ip', $_SERVER['REMOTE_ADDR']); 
     $logger->setEventItem('username', $this->_username); 



     // This has issue of missing _stream, Using Custom Helper with Registry use force. 
     $this->_cor->set('logger', $logger, true); 
     $loggerRC = $this->_cor->get('logger', true); 

     // This also has issue of missing _stream, Using Custom Helper with apc Cache 
     $this->_cor->set('logger', $logger); 
     $loggerCC = $this->_cor->get('logger'); 

     // This works perfectly. 
     Zend_Registry::set($this->_cor->createCacheId('loggerR'), $logger); 
     $loggerZ = Zend_Registry::get($this->_cor->createCacheId('loggerR')); 

     // This also seems to have issue of missing _stream, Using apc Cache directly 
     $cache = Zend_Registry::get('apcCache'); 
     $cache->save($logger, $this->_cor->createCacheId('loggerC')); 
     $loggerC = $cache->load($this->_cor->createCacheId('loggerC')); 


     echo "<h3>Logger, local variable</h3>"; 
     var_dump($logger); 

     echo "<h3>Logger, from Registry using custom helper</h3>"; 
     var_dump($loggerRC); 

     echo "<h3>Logger, from apc cache using custom helper</h3>"; 
     var_dump($loggerCC); 

     echo "<h3>Logger, from Zend_Registry, direct.</h3>"; 
     var_dump($loggerZ); 

     echo "<h3>Logger, from apc Cache, Direct.</h3>"; 
     var_dump($loggerC); 
     exit; 
    } 

잘린 10

object(Zend_Log)[84] protected '_priorities' => array 0 => string 'EMERG' (length=5) 1 => string 'ALERT' (length=5) 2 => string 'CRIT' (length=4) 3 => string 'ERR' (length=3) 4 => string 'WARN' (length=4) 5 => string 'NOTICE' (length=6) 6 => string 'INFO' (length=4) 7 => string 'DEBUG' (length=5) protected '_writers' => array 0 => object(Zend_Log_Writer_Stream)[93] protected '_stream' => resource(77, stream) protected '_filters' => array 0 => object(Zend_Log_Filter_Priority)[94] protected '_priority' => int 7 protected '_operator' => string '<=' (length=2) protected '_formatter' => object(Zend_Log_Formatter_Simple)[95] protected '_format' => string ' [ %ip% ] - [ %timestamp% ] [ %user_agent% ] - [ %username% ] [ %priorityName% : %message% ] [ POST: %post_vars% ] [ GET: %get_vars% ] ' (length=161) protected '_filters' => array empty protected '_extras' => array 'user_agent' => string 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.18 Safari/535.1' (length=99) 'get_vars' => string 'a:0:{}' (length=6) 'post_vars' => string 'a:0:{}' (length=6) 'ip' => string '127.0.0.1' (length=9) 'username' => string 'guest' (length=5) protected '_defaultWriterNamespace' => string 'Zend_Log_Writer' (length=15) protected '_defaultFilterNamespace' => string 'Zend_Log_Filter' (length=15) protected '_defaultFormatterNamespace' => string 'Zend_Log_Formatter' (length=18) protected '_origErrorHandler' => null protected '_registeredErrorHandler' => boolean false protected '_errorHandlerMap' => boolean false protected '_timestampFormat' => string 'c' (length=1) 

로거, 레지스트리에서 직접 Zend_Registry에서, 사용자 정의 도우미에게

object(Zend_Log)[100] 
    protected '_priorities' => 
    array 
     0 => string 'EMERG' (length=5) 
     1 => string 'ALERT' (length=5) 
     2 => string 'CRIT' (length=4) 
     3 => string 'ERR' (length=3) 
     4 => string 'WARN' (length=4) 
     5 => string 'NOTICE' (length=6) 
     6 => string 'INFO' (length=4) 
     7 => string 'DEBUG' (length=5) 
    protected '_writers' => 
    array 
     0 => 
     object(Zend_Log_Writer_Stream)[101] 
      protected '_stream' => int 0 
      protected '_filters' => 
      array 
       0 => 
       object(Zend_Log_Filter_Priority)[102] 
        protected '_priority' => int 7 
        protected '_operator' => string '<=' (length=2) 
      protected '_formatter' => 
      object(Zend_Log_Formatter_Simple)[103] 
       protected '_format' => string ' [ %ip% ] - [ %timestamp% ] [ %user_agent% ] - [ %username% ] 
     [ %priorityName% : %message% ] 
     [ POST: %post_vars% ] 
     [ GET: %get_vars% ] 
' (length=161) 
    protected '_filters' => 
    array 
     empty 
    protected '_extras' => 
    array 
     'user_agent' => string 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.18 Safari/535.1' (length=99) 
     'get_vars' => string 'a:0:{}' (length=6) 
     'post_vars' => string 'a:0:{}' (length=6) 
     'ip' => string '127.0.0.1' (length=9) 
     'username' => string 'guest' (length=5) 
    protected '_defaultWriterNamespace' => string 'Zend_Log_Writer' (length=15) 
    protected '_defaultFilterNamespace' => string 'Zend_Log_Filter' (length=15) 
    protected '_defaultFormatterNamespace' => string 'Zend_Log_Formatter' (length=18) 
    protected '_origErrorHandler' => null 
    protected '_registeredErrorHandler' => boolean false 
    protected '_errorHandlerMap' => boolean false 
    protected '_timestampFormat' => string 'c' (length=1) 

로거를 사용하여 APC 캐시에서 사용자 지정 도우미에게

object(Zend_Log)[96] 
    protected '_priorities' => 
    array 
     0 => string 'EMERG' (length=5) 
     1 => string 'ALERT' (length=5) 
     2 => string 'CRIT' (length=4) 
     3 => string 'ERR' (length=3) 
     4 => string 'WARN' (length=4) 
     5 => string 'NOTICE' (length=6) 
     6 => string 'INFO' (length=4) 
     7 => string 'DEBUG' (length=5) 
    protected '_writers' => 
    array 
     0 => 
     object(Zend_Log_Writer_Stream)[97] 
      protected '_stream' => int 0 
      protected '_filters' => 
      array 
       0 => 
       object(Zend_Log_Filter_Priority)[98] 
        protected '_priority' => int 7 
        protected '_operator' => string '<=' (length=2) 
      protected '_formatter' => 
      object(Zend_Log_Formatter_Simple)[99] 
       protected '_format' => string ' [ %ip% ] - [ %timestamp% ] [ %user_agent% ] - [ %username% ] 
     [ %priorityName% : %message% ] 
     [ POST: %post_vars% ] 
     [ GET: %get_vars% ] 
' (length=161) 
    protected '_filters' => 
    array 
     empty 
    protected '_extras' => 
    array 
     'user_agent' => string 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.18 Safari/535.1' (length=99) 
     'get_vars' => string 'a:0:{}' (length=6) 
     'post_vars' => string 'a:0:{}' (length=6) 
     'ip' => string '127.0.0.1' (length=9) 
     'username' => string 'guest' (length=5) 
    protected '_defaultWriterNamespace' => string 'Zend_Log_Writer' (length=15) 
    protected '_defaultFilterNamespace' => string 'Zend_Log_Filter' (length=15) 
    protected '_defaultFormatterNamespace' => string 'Zend_Log_Formatter' (length=18) 
    protected '_origErrorHandler' => null 
    protected '_registeredErrorHandler' => boolean false 
    protected '_errorHandlerMap' => boolean false 
    protected '_timestampFormat' => string 'c' (length=1) 

로거를 사용하여. APC 캐시, 직접에서

object(Zend_Log)[84] 
    protected '_priorities' => 
    array 
     0 => string 'EMERG' (length=5) 
     1 => string 'ALERT' (length=5) 
     2 => string 'CRIT' (length=4) 
     3 => string 'ERR' (length=3) 
     4 => string 'WARN' (length=4) 
     5 => string 'NOTICE' (length=6) 
     6 => string 'INFO' (length=4) 
     7 => string 'DEBUG' (length=5) 
    protected '_writers' => 
    array 
     0 => 
     object(Zend_Log_Writer_Stream)[93] 
      protected '_stream' => resource(77, stream) 
      protected '_filters' => 
      array 
       0 => 
       object(Zend_Log_Filter_Priority)[94] 
        protected '_priority' => int 7 
        protected '_operator' => string '<=' (length=2) 
      protected '_formatter' => 
      object(Zend_Log_Formatter_Simple)[95] 
       protected '_format' => string ' [ %ip% ] - [ %timestamp% ] [ %user_agent% ] - [ %username% ] 
     [ %priorityName% : %message% ] 
     [ POST: %post_vars% ] 
     [ GET: %get_vars% ] 
' (length=161) 
    protected '_filters' => 
    array 
     empty 
    protected '_extras' => 
    array 
     'user_agent' => string 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.18 Safari/535.1' (length=99) 
     'get_vars' => string 'a:0:{}' (length=6) 
     'post_vars' => string 'a:0:{}' (length=6) 
     'ip' => string '127.0.0.1' (length=9) 
     'username' => string 'guest' (length=5) 
    protected '_defaultWriterNamespace' => string 'Zend_Log_Writer' (length=15) 
    protected '_defaultFilterNamespace' => string 'Zend_Log_Filter' (length=15) 
    protected '_defaultFormatterNamespace' => string 'Zend_Log_Formatter' (length=18) 
    protected '_origErrorHandler' => null 
    protected '_registeredErrorHandler' => boolean false 
    protected '_errorHandlerMap' => boolean false 
    protected '_timestampFormat' => string 'c' (length=1) 

로거. 저장된 경우

object(Zend_Log)[104] 
    protected '_priorities' => 
    array 
     0 => string 'EMERG' (length=5) 
     1 => string 'ALERT' (length=5) 
     2 => string 'CRIT' (length=4) 
     3 => string 'ERR' (length=3) 
     4 => string 'WARN' (length=4) 
     5 => string 'NOTICE' (length=6) 
     6 => string 'INFO' (length=4) 
     7 => string 'DEBUG' (length=5) 
    protected '_writers' => 
    array 
     0 => 
     object(Zend_Log_Writer_Stream)[105] 
      protected '_stream' => int 0 
      protected '_filters' => 
      array 
       0 => 
       object(Zend_Log_Filter_Priority)[106] 
        protected '_priority' => int 7 
        protected '_operator' => string '<=' (length=2) 
      protected '_formatter' => 
      object(Zend_Log_Formatter_Simple)[107] 
       protected '_format' => string ' [ %ip% ] - [ %timestamp% ] [ %user_agent% ] - [ %username% ] 
     [ %priorityName% : %message% ] 
     [ POST: %post_vars% ] 
     [ GET: %get_vars% ] 
' (length=161) 
    protected '_filters' => 
    array 
     empty 
    protected '_extras' => 
    array 
     'user_agent' => string 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.18 Safari/535.1' (length=99) 
     'get_vars' => string 'a:0:{}' (length=6) 
     'post_vars' => string 'a:0:{}' (length=6) 
     'ip' => string '127.0.0.1' (length=9) 
     'username' => string 'guest' (length=5) 
    protected '_defaultWriterNamespace' => string 'Zend_Log_Writer' (length=15) 
    protected '_defaultFilterNamespace' => string 'Zend_Log_Filter' (length=15) 
    protected '_defaultFormatterNamespace' => string 'Zend_Log_Formatter' (length=18) 
    protected '_origErrorHandler' => null 
    protected '_registeredErrorHandler' => boolean false 
    protected '_errorHandlerMap' => boolean false 
    protected '_timestampFormat' => string 'c' (length=1) 

답변

2
  • 는 Zend_Log 직렬화해서는 안된다.
  • Zend_Cache는 문자열 만 저장할 때 객체를 직렬화해야하기 때문에 옵션이 아닙니다.
  • Zend_Registry는 헬퍼 클래스를 통해 작동하지 않았습니다. 코드 때문에 일부 직렬화가 진행 되었기 때문입니다. 이를 제거하면 문제가 해결됩니다.짧은 그래서

: Zend_Registry에 저장할 때 저장소에

  • 사용 Zend_Registry는
  • 직렬화하지 마십시오 객체