Quellcode durchsuchen

Use redis for the result cache so it persists across APC refreshes

Jordi Boggiano vor 8 Jahren
Ursprung
Commit
85e8578f48

+ 1 - 0
app/AppKernel.php

@@ -15,6 +15,7 @@ class AppKernel extends Kernel
             new Symfony\Bundle\MonologBundle\MonologBundle(),
             new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
             new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
+            new Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle(),
             new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
             new FOS\UserBundle\FOSUserBundle(),
             new HWI\Bundle\OAuthBundle\HWIOAuthBundle(),

+ 10 - 1
app/config/config_prod.yml

@@ -4,9 +4,18 @@ imports:
 doctrine:
     orm:
         metadata_cache_driver: %doctrine_cache_backend%
-        result_cache_driver: %doctrine_cache_backend%
+        result_cache_driver:
+            type: predis
+            cache_provider: predis
         query_cache_driver: %doctrine_cache_backend%
 
+doctrine_cache:
+    providers:
+        predis:
+            type: predis
+            predis:
+                client_id: snc_redis.session.client
+
 monolog:
     handlers:
         main:

+ 1 - 0
composer.json

@@ -28,6 +28,7 @@
         "symfony/symfony": "^2.8",
         "doctrine/orm": "^2.4",
         "doctrine/doctrine-bundle": "^1.2",
+        "doctrine/doctrine-cache-bundle": "^1.3",
         "twig/extensions": "^1.0",
         "symfony/swiftmailer-bundle": "^2.3",
         "symfony/monolog-bundle": "^2.4",

+ 2 - 2
composer.lock

@@ -4,8 +4,8 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
         "This file is @generated automatically"
     ],
-    "hash": "8581497d1edd0c07c843e7c5f5c3dca5",
-    "content-hash": "391c40743569e2e8b2c93b92d1a4e218",
+    "hash": "754c9f8d1daa9e19b39e07018e464aef",
+    "content-hash": "23cf95e5c2c0bc833dded981471a86a1",
     "packages": [
         {
             "name": "composer/ca-bundle",

+ 19 - 41
src/Packagist/WebBundle/Entity/PackageRepository.php

@@ -312,28 +312,17 @@ class PackageRepository extends EntityRepository
 
     public function getDependentCount($name)
     {
-        $apc = extension_loaded('apcu');
-
-        if ($apc) {
-            $count = apcu_fetch('packagist_dependentsCount_'.$name);
-        }
-
-        if (!isset($count) || !is_numeric($count)) {
-            $count = $this->getEntityManager()->getConnection()->fetchColumn(
-                "SELECT COUNT(DISTINCT v.package_id)
-                FROM package_version v
-                LEFT JOIN link_require r ON v.id = r.version_id AND r.packageName = :name
-                LEFT JOIN link_require_dev rd ON v.id = rd.version_id AND rd.packageName = :name
-                WHERE v.development AND (r.packageName IS NOT NULL OR rd.packageName IS NOT NULL)",
-                ['name' => $name]
-            );
-
-            if ($apc) {
-                apcu_store('packagist_dependentsCount_'.$name, $count, 7*86400);
-            }
-        }
+        $qb = $this->getEntityManager()->createQueryBuilder();
+        $qb->select('COUNT(DISTINCT v.package)')
+            ->from('Packagist\WebBundle\Entity\Version', 'v')
+            ->leftJoin('v.require', 'r', 'WITH', 'r.packageName = :name')
+            ->leftJoin('v.devRequire', 'rd', 'WITH', 'rd.packageName = :name')
+            ->where('v.development = true AND (r.packageName IS NOT NULL OR rd.packageName IS NOT NULL)')
+            ->setParameter('name', $name);
 
-        return (int) $count;
+        return (int) $qb->getQuery()
+            ->useResultCache(true, 7*86400, 'dependentsCount_'.$name)
+            ->getSingleScalarResult();
     }
 
     public function getDependents($name, $offset = 0, $limit = 15)
@@ -359,27 +348,16 @@ class PackageRepository extends EntityRepository
 
     public function getSuggestCount($name)
     {
-        $apc = extension_loaded('apcu');
-
-        if ($apc) {
-            $count = apcu_fetch('packagist_suggesterCount_'.$name);
-        }
-
-        if (!isset($count) || !is_numeric($count)) {
-            $count = $this->getEntityManager()->getConnection()->fetchColumn(
-                "SELECT COUNT(DISTINCT v.package_id)
-                FROM package_version v
-                LEFT JOIN link_suggest s ON v.id = s.version_id AND s.packageName = :name
-                WHERE v.development AND (s.packageName IS NOT NULL)",
-                ['name' => $name]
-            );
-
-            if ($apc) {
-                apcu_store('packagist_dependentsCount_'.$name, $count, 7*86400);
-            }
-        }
+        $qb = $this->getEntityManager()->createQueryBuilder();
+        $qb->select('COUNT(DISTINCT v.package)')
+            ->from('Packagist\WebBundle\Entity\Version', 'v')
+            ->leftJoin('v.suggest', 's', 'WITH', 's.packageName = :name')
+            ->where('v.development = true AND s.packageName IS NOT NULL')
+            ->setParameter('name', $name);
 
-        return (int) $count;
+        return (int) $qb->getQuery()
+            ->useResultCache(true, 7*86400, 'suggesterCount_'.$name)
+            ->getSingleScalarResult();
     }
 
     public function getSuggests($name, $offset = 0, $limit = 15)