11<?php namespace App \Http \Middleware ;
22
3+ use App \Utils \Cache \MemCache ;
34use Closure ;
45use Illuminate \Http \JsonResponse ;
56use Illuminate \Support \Facades \Cache ;
@@ -87,49 +88,82 @@ public function handle($request, Closure $next, $cache_lifetime, $cache_region =
8788 }
8889 }
8990 $ status = 200 ;
91+ $ wasMemCacheHit = false ;
9092 $ wasHit = false ;
93+ $ data = null ;
94+
9195 if ($ regionTag ) {
9296 Log::debug ("CacheMiddleware: using region tag {$ regionTag } ip {$ ip } agent {$ agent }" );
93- $ wasHit = Cache::tags ($ regionTag )->has ($ key );
94- Log::debug ($ wasHit ? "CacheMiddleware: cache HIT (tagged) " : "CacheMiddleware: cache MISS (tagged) " , [
95- 'tag ' => $ regionTag ,
96- 'ip ' => $ ip ,
97- 'agent ' => $ agent ,
98- 'key ' => $ key ,
99- ]);
100-
101- $ encoded = Cache::tags ($ regionTag )
102- ->remember ($ key , $ cache_lifetime , function () use ($ next , $ request , $ regionTag , $ key , $ cache_lifetime , &$ status ,$ ip , $ agent ) {
97+ // try L1 APC
98+ $ encoded = MemCache::get ($ key );
99+ $ wasMemCacheHit = $ encoded !== null ;
100+ if ($ wasMemCacheHit ){
101+ Log::debug ("CacheMiddleware:: MemcCache Hit " );
102+ }
103+ if (!$ wasMemCacheHit ) {
104+ // then L2 Redis
105+ $ wasHit = Cache::tags ($ regionTag )->has ($ key );
106+ Log::debug ($ wasHit ? "CacheMiddleware: cache HIT Redis (tagged) " : "CacheMiddleware: cache MISS (tagged) " , [
107+ 'tag ' => $ regionTag ,
108+ 'ip ' => $ ip ,
109+ 'agent ' => $ agent ,
110+ 'key ' => $ key ,
111+ ]);
112+
113+ $ encoded = Cache::tags ($ regionTag )
114+ ->remember ($ key , $ cache_lifetime , function () use ($ next , $ request , $ regionTag , $ key , $ cache_lifetime , &$ status , $ ip , $ agent ) {
115+ $ resp = $ next ($ request );
116+ if ($ resp instanceof JsonResponse) {
117+ $ status = $ resp ->getStatusCode ();
118+ if ($ status === 200 ) {
119+ return $ this ->encode ($ resp ->getData (true ));
120+ }
121+ }
122+ // don’t cache non-200 or non-JSON
123+ return Cache::get ($ key );
124+ });
125+
126+
127+ // backfill APC only if we actually have a value
128+ if ($ encoded !== null ) { // avoid null writes
129+ MemCache::put ($ key , $ encoded , $ cache_lifetime , $ regionTag );
130+ }
131+ }
132+ $ data = $ this ->decode ($ encoded );
133+ } else {
134+ // try L1 APC
135+ $ encoded = MemCache::get ($ key );
136+ $ wasMemCacheHit = !is_null ($ encoded );
137+ if ($ wasMemCacheHit ){
138+ Log::debug ("CacheMiddleware:: MemcCache Hit " );
139+ }
140+ if (!$ wasMemCacheHit ) {
141+ // then L2 Redis
142+
143+ $ wasHit = Cache::has ($ key );
144+
145+ Log::debug ($ wasHit ? "CacheMiddleware: cache HIT " : "CacheMiddleware: cache MISS " , [
146+ 'ip ' => $ ip ,
147+ 'agent ' => $ agent ,
148+ 'key ' => $ key ,
149+ ]);
150+
151+ $ encoded = Cache::remember ($ key , $ cache_lifetime , function () use ($ next , $ request , $ key , &$ status , $ ip , $ agent ) {
103152 $ resp = $ next ($ request );
104153 if ($ resp instanceof JsonResponse) {
105154 $ status = $ resp ->getStatusCode ();
106- if ($ status === 200 ) {
155+ if ($ status === 200 )
107156 return $ this ->encode ($ resp ->getData (true ));
108- }
109157 }
110- // don’t cache non-200 or non-JSON
111158 return Cache::get ($ key );
112159 });
113- $ data = $ this ->decode ($ encoded );
114- } else {
115- $ wasHit = Cache::has ($ key );
116-
117- Log::debug ($ wasHit ? "CacheMiddleware: cache HIT " : "CacheMiddleware: cache MISS " , [
118- 'ip ' => $ ip ,
119- 'agent ' => $ agent ,
120- 'key ' => $ key ,
121- ]);
122-
123- $ encoded = Cache::remember ($ key , $ cache_lifetime , function () use ($ next , $ request , $ key , &$ status , $ ip , $ agent ) {
124- $ resp = $ next ($ request );
125- if ($ resp instanceof JsonResponse) {
126- $ status = $ resp ->getStatusCode ();
127- if ($ status === 200 )
128- return $ this ->encode ($ resp ->getData (true ));
160+ // store at APC
161+ if ($ encoded !== null ) { // avoid null writes
162+ MemCache::put ($ key , $ encoded , $ cache_lifetime );
129163 }
130- return Cache:: get ( $ key );
131- } );
132- $ data = $ this -> decode ( $ encoded );
164+
165+ $ data = $ this -> decode ( $ encoded );
166+ }
133167 }
134168 // safe guard
135169 if ($ data === null ) $ data = is_array ($ encoded ) ? $ encoded : [];
@@ -143,7 +177,7 @@ public function handle($request, Closure $next, $cache_lifetime, $cache_region =
143177 $ response ->headers ->addCacheControlDirective ('must-revalidate ' , true );
144178 $ response ->headers ->addCacheControlDirective ('proxy-revalidate ' , true );
145179 $ response ->headers ->add ([
146- 'X-Cache-Result ' => $ wasHit ? 'HIT ' : 'MISS ' ,
180+ 'X-Cache-Result ' => $ wasMemCacheHit ? ' HIT MemcCache ' : ( $ wasHit ? 'HIT REDIS ' : 'MISS ' ) ,
147181 ]);
148182 Log::debug ( "CacheMiddleware: returning response " , [
149183 'ip ' => $ ip ,
0 commit comments