11<?php namespace App \Http \Middleware ;
22
3+ use App \Utils \Cache \APC ;
34use Closure ;
45use Illuminate \Http \JsonResponse ;
56use Illuminate \Support \Facades \Cache ;
@@ -87,49 +88,78 @@ public function handle($request, Closure $next, $cache_lifetime, $cache_region =
8788 }
8889 }
8990 $ status = 200 ;
91+ $ wasAPCHit = 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 = APC ::get ($ key );
99+ $ wasAPCHit = $ encoded !== null ;
100+
101+ if (!$ wasAPCHit ) {
102+ // then L2 Redis
103+ $ wasHit = Cache::tags ($ regionTag )->has ($ key );
104+ Log::debug ($ wasHit ? "CacheMiddleware: cache HIT Redis (tagged) " : "CacheMiddleware: cache MISS (tagged) " , [
105+ 'tag ' => $ regionTag ,
106+ 'ip ' => $ ip ,
107+ 'agent ' => $ agent ,
108+ 'key ' => $ key ,
109+ ]);
110+
111+ $ encoded = Cache::tags ($ regionTag )
112+ ->remember ($ key , $ cache_lifetime , function () use ($ next , $ request , $ regionTag , $ key , $ cache_lifetime , &$ status , $ ip , $ agent ) {
113+ $ resp = $ next ($ request );
114+ if ($ resp instanceof JsonResponse) {
115+ $ status = $ resp ->getStatusCode ();
116+ if ($ status === 200 ) {
117+ return $ this ->encode ($ resp ->getData (true ));
118+ }
119+ }
120+ // don’t cache non-200 or non-JSON
121+ return Cache::get ($ key );
122+ });
123+
124+
125+ // backfill APC only if we actually have a value
126+ if ($ encoded !== null ) { // avoid null writes
127+ APC ::put ($ key , $ encoded , $ cache_lifetime , $ regionTag );
128+ }
129+ }
130+ $ data = $ this ->decode ($ encoded );
131+ } else {
132+ // try L1 APC
133+ $ encoded = APC ::get ($ key );
134+ $ wasAPCHit = !is_null ($ encoded );
135+
136+ if (!$ wasAPCHit ) {
137+ // then L2 Redis
138+
139+ $ wasHit = Cache::has ($ key );
140+
141+ Log::debug ($ wasHit ? "CacheMiddleware: cache HIT " : "CacheMiddleware: cache MISS " , [
142+ 'ip ' => $ ip ,
143+ 'agent ' => $ agent ,
144+ 'key ' => $ key ,
145+ ]);
146+
147+ $ encoded = Cache::remember ($ key , $ cache_lifetime , function () use ($ next , $ request , $ key , &$ status , $ ip , $ agent ) {
103148 $ resp = $ next ($ request );
104149 if ($ resp instanceof JsonResponse) {
105150 $ status = $ resp ->getStatusCode ();
106- if ($ status === 200 ) {
151+ if ($ status === 200 )
107152 return $ this ->encode ($ resp ->getData (true ));
108- }
109153 }
110- // don’t cache non-200 or non-JSON
111154 return Cache::get ($ key );
112155 });
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 ));
156+ // store at APC
157+ if ($ encoded !== null ) { // avoid null writes
158+ APC ::put ($ key , $ encoded , $ cache_lifetime );
129159 }
130- return Cache:: get ( $ key );
131- } );
132- $ data = $ this -> decode ( $ encoded );
160+
161+ $ data = $ this -> decode ( $ encoded );
162+ }
133163 }
134164 // safe guard
135165 if ($ data === null ) $ data = is_array ($ encoded ) ? $ encoded : [];
@@ -143,7 +173,7 @@ public function handle($request, Closure $next, $cache_lifetime, $cache_region =
143173 $ response ->headers ->addCacheControlDirective ('must-revalidate ' , true );
144174 $ response ->headers ->addCacheControlDirective ('proxy-revalidate ' , true );
145175 $ response ->headers ->add ([
146- 'X-Cache-Result ' => $ wasHit ? 'HIT ' : 'MISS ' ,
176+ 'X-Cache-Result ' => $ wasAPCHit ? ' HIT APC ' : ( $ wasHit ? 'HIT REDIS ' : 'MISS ' ) ,
147177 ]);
148178 Log::debug ( "CacheMiddleware: returning response " , [
149179 'ip ' => $ ip ,
0 commit comments