You are viewing [info]le0_pard's journal

le0_pard
symfony 404 cache error in production 
6th-Mar-2010 11:53 pm
leopard

Да-да-да! На столько непонятный заголовок. Все очень просто. Есть такой популярный PHP фреймворк – Symfony. Все в нем хорошо, вот только недавно обнаружилась одна плохая бага: при включенном кешировании (а именно использовании contextual параметра в кеше) на продакшене при попытке вызова 404 сайт просто вываливается с ошибкой, примерно с такой:

  1. PHP Fatal error: Uncaught exception ’sfException’ with message ‘A cache key must contain both a module and an action parameter’ in /var/www/clients/client2/web6/lib/vendor/symfony/lib/view/sfViewCacheManager.class.php:246#012Stack trace:#012#0 /var/www/clients/client2/web6/lib/vendor/symfony/lib/view/sfViewCacheManager.class.php(145): sfViewCacheManager->convertParametersToKey(Array)#012#1 /var/www/clients/client2/web6/lib/vendor/symfony/lib/view/sfViewCacheManager.class.php(478)

Проблема решается просто. При создании ключа для contextual кеша используется модель и экшен текущей страницы. А на при попытке вызова несуществующей страницы требуется указать, что модель и экшен брать для 404 страницы. А вот и сам фикс:

  1. Index: lib/view/sfViewCacheManager.class.php
  2. ===================================================================
  3. lib/view/sfViewCacheManager.class.php       (revision 28275)
  4. +++ lib/view/sfViewCacheManager.class.php       (working copy)
  5. @@ -142,6 +142,10 @@
  6.        if (!$contextualPrefix)
  7.        {
  8.          list($route_name, $params) = $this->controller->convertUrlStringToParameters($this->routing->getCurrentInternalUri());
  9. +       if(!isset($params[‘module’]) || !isset($params[‘action’])){
  10. +               $params[‘module’] = sfConfig::get(’sf_error_404_module’);
  11. +               $params[‘action’] = sfConfig::get(’sf_error_404_action’);
  12. +       }
  13.          $cacheKey = $this->convertParametersToKey($params);
  14.        }
  15.        else
  16.  

Вот и все. Теперь 404 будет работать и на продакшене. Тикет на symfony trac.

Mirrored from Блог Леопарда.

This page was loaded May 26th 2012, 7:47 pm GMT.