예제 #1
0
 /**
  * Parse Dispatcher params to array
  * @param DispatcherInterface $dispatcher
  * @return array
  */
 public function getInterceptorParams(DispatcherInterface $dispatcher)
 {
     $interceptorConfig = strtolower($dispatcher->getParam(self::INTERCEPTOR_KEY));
     if (!$interceptorConfig) {
         return array();
     }
     parse_str($interceptorConfig, $interceptorParams);
     //Make default
     $interceptorParams = array_merge(array('lifetime' => 0, 'methods' => 'get', 'ignore_query_keys' => '_', 'jsonp_callback_key' => 'callback', 'format' => 'text'), $interceptorParams);
     $lifetime = $interceptorParams['lifetime'] = (int) $interceptorParams['lifetime'];
     if ($lifetime <= 0) {
         return array();
     }
     $methodsAllow = $interceptorParams['methods'] ? explode('|', $interceptorParams['methods']) : array('get');
     $interceptorParams['methods'] = $methodsAllow;
     $ignoreQueryKeys = $interceptorParams['ignore_query_keys'] ? explode('|', $interceptorParams['ignore_query_keys']) : array();
     $interceptorParams['ignore_query_keys'] = $ignoreQueryKeys;
     return $interceptorParams;
 }
예제 #2
0
 /**
  *
  *
  * @param $event
  * @param DispatcherInterface $dispatcher
  */
 public function beforeExecuteRoute(Event $event, DispatcherInterface $dispatcher)
 {
     /** @var \Phalcon\DI $di */
     $di = $dispatcher->getDI();
     $config = $di->getConfig();
     // cache is disable
     if (!$config->cache->enable) {
         return;
     }
     $dispatch_cache_config = $dispatcher->getParam('_dispatch_cache');
     if (!$dispatch_cache_config) {
         return;
     }
     /** @var \Phalcon\Http\Request $request */
     $request = $di->getRequest();
     $params = $this->parseParams($dispatch_cache_config);
     $lifetime = intval($params['lifetime']);
     $methodsAllow = $params['methods'];
     if ($lifetime <= 0) {
         return;
     }
     if (!$methodsAllow) {
         $methodsAllow = 'get';
     }
     $methodsAllow = explode('|', strtolower($methodsAllow));
     $requestMethod = strtolower($request->getMethod());
     if (!in_array($requestMethod, $methodsAllow)) {
         return;
     }
     $cache_key_prefix = $_SERVER['HTTP_HOST'] . preg_replace('/[&?]_eva_refresh_dispatch_cache\\=1/i', '', $_SERVER['REQUEST_URI']) . file_get_contents('php://input');
     $cache_key_prefix = md5($cache_key_prefix);
     /** @var \Phalcon\Cache\Backend\Memcache $cache */
     $cache = $di->getViewCache();
     $bodyKey = $cache_key_prefix . '_b';
     $headersKey = $cache_key_prefix . '_h';
     $bodyCached = $cache->get($bodyKey);
     $headersCached = $cache->get($headersKey);
     $hasCached = $headersCached && $bodyCached;
     // cache missing
     if ($di->getRequest()->getQuery('_eva_refresh_dispatch_cache') || !$hasCached) {
         /** @var \Phalcon\Events\Manager $eventsManager */
         $eventsManager = $di->get('eventsManager');
         $eventsManager->attach('application:beforeSendResponse', function ($event, $application) use($di, $headersKey, $bodyKey, $lifetime, $cache) {
             /** @var \Phalcon\Http\ResponseInterface $response */
             $response = $di->getResponse();
             $body = $response->getContent();
             $headers = $response->getHeaders()->toArray();
             !$headers && ($headers = array());
             $headersByHeaderFunc = headers_list();
             if ($headersByHeaderFunc) {
                 $headers = array_merge($headers, $headersByHeaderFunc);
             }
             $headers['Eva-Dsp-Cache'] = time();
             $cache->save($bodyKey, $body, $lifetime);
             $cache->save($headersKey, serialize($headers), $lifetime);
         });
         return;
     }
     /** @var \Phalcon\Http\ResponseInterface $response */
     $response = $di->getResponse();
     if ($hasCached) {
         if ($headersCached) {
             $headersCached = unserialize($headersCached);
             isset($headersCached['Eva-Dsp-Cache']) && ($headersCached['Eva-Dsp-Cache'] = date('Y-m-d H:i:s', $headersCached['Eva-Dsp-Cache']));
             foreach ($headersCached as $_k => $_herder) {
                 if (is_int($_k)) {
                     $response->setRawHeader($_herder);
                 } else {
                     $response->setHeader($_k, $_herder);
                 }
             }
         }
         $response->setContent($bodyCached);
         $response->send();
         exit;
     }
 }