Browse Source

Work around doctrine cache behavior and cache things myself

Jordi Boggiano 8 years ago
parent
commit
29017b6d04

+ 7 - 1
app/config/config.yml

@@ -59,8 +59,14 @@ snc_redis:
             dsn: %redis_dsn%
             options:
                 profile: 2.8
+        session:
+            type: predis
+            alias: cache
+            dsn: %redis_dsn%
+            options:
+                profile: 2.8
     session:
-        client: default
+        client: cache
         prefix: 'sess:'
         ttl: 3600
 

+ 7 - 5
app/config/config_prod.yml

@@ -14,7 +14,7 @@ doctrine_cache:
         predis:
             type: predis
             predis:
-                client_id: snc_redis.session.client
+                client_id: snc_redis.cache.client
 
 monolog:
     handlers:
@@ -40,15 +40,17 @@ snc_redis:
                 profile: 2.8
         session:
             type: predis
-            alias: session
+            alias: cache
             dsn: %redis_session_dsn%
+            options:
+                profile: 2.8
     session:
-        client: session
+        client: cache
+        ttl: 3600
 
 framework:
     session:
-    session:
-        handler_id: snc_redis.session.handler
+        handler_id: snc_redis.cache.handler
         cookie_secure: %force_ssl%
     validation:
         cache: %validation_cache_backend%

+ 1 - 1
src/Packagist/WebBundle/Controller/ExploreController.php

@@ -39,7 +39,7 @@ class ExploreController extends Controller
         /** @var PackageRepository $pkgRepo */
         $pkgRepo = $this->getDoctrine()->getRepository('PackagistWebBundle:Package');
         /** @var VersionRepository $verRepo */
-        $verRepo = $this->getDoctrine()->getRepository('PackagistWebBundle:Version');
+        $verRepo = $this->get('packagist.version_repository');
         $newSubmitted = $pkgRepo->getQueryBuilderForNewestPackages()->setMaxResults(10)
             ->getQuery()->useResultCache(true, 900, 'new_submitted_packages')->getResult();
         $newReleases = $verRepo->getLatestReleases(10);

+ 17 - 2
src/Packagist/WebBundle/Entity/VersionRepository.php

@@ -13,12 +13,15 @@
 namespace Packagist\WebBundle\Entity;
 
 use Doctrine\ORM\EntityRepository;
+use Predis\Client;
 
 /**
  * @author Jordi Boggiano <j.boggiano@seld.be>
  */
 class VersionRepository extends EntityRepository
 {
+    private $redis;
+
     protected $supportedLinkTypes = array(
         'require',
         'conflict',
@@ -28,6 +31,11 @@ class VersionRepository extends EntityRepository
         'suggest',
     );
 
+    public function setRedis(Client $client)
+    {
+        $this->redis = $client;
+    }
+
     public function remove(Version $version)
     {
         $em = $this->getEntityManager();
@@ -93,8 +101,12 @@ class VersionRepository extends EntityRepository
 
     public function getLatestReleases($count = 10)
     {
+        if ($cached = $this->redis->get('new_releases')) {
+            return json_decode($cached, true);
+        }
+
         $qb = $this->getEntityManager()->createQueryBuilder();
-        $qb->select('v')
+        $qb->select('v.name, v.version, v.description')
             ->from('Packagist\WebBundle\Entity\Version', 'v')
             ->where('v.development = false')
             ->andWhere('v.releasedAt < :now')
@@ -102,6 +114,9 @@ class VersionRepository extends EntityRepository
             ->setMaxResults($count)
             ->setParameter('now', date('Y-m-d H:i:s'));
 
-        return $qb->getQuery()->useResultCache(true, 900, 'new_releases')->getResult();
+        $res = $qb->getQuery()->getResult();
+        $this->redis->setex('new_releases', 600, json_encode($res));
+
+        return $res;
     }
 }

+ 7 - 0
src/Packagist/WebBundle/Resources/config/services.yml

@@ -40,6 +40,13 @@ services:
         factory: ['@doctrine', getRepository]
         arguments: ['PackagistWebBundle:Package']
 
+    packagist.version_repository:
+        class: Packagist\WebBundle\Entity\VersionRepository
+        factory: ['@doctrine', getRepository]
+        arguments: ['PackagistWebBundle:Version']
+        calls:
+            - [ setRedis, [ '@snc_redis.cache_client' ]]
+
     packagist.package_updater:
         class: Packagist\WebBundle\Package\Updater
         arguments: ['@doctrine']