15
15
use Symfony \Component \Cache \CacheItem ;
16
16
use Symfony \Component \Cache \Exception \InvalidArgumentException ;
17
17
use Symfony \Component \Cache \LockRegistry ;
18
+ use Symfony \Contracts \Cache \CacheContractsTrait ;
18
19
use Symfony \Contracts \Cache \CacheInterface ;
19
20
use Symfony \Contracts \Cache \ItemInterface ;
20
21
25
26
*/
26
27
trait GetTrait
27
28
{
29
+ use CacheContractsTrait {
30
+ doGet as private contractsGet;
31
+ }
32
+
28
33
private $ callbackWrapper = array (LockRegistry::class, 'compute ' );
29
34
30
35
/**
@@ -42,47 +47,12 @@ public function setCallbackWrapper(callable $callbackWrapper): callable
42
47
return $ previousWrapper ;
43
48
}
44
49
45
- /**
46
- * {@inheritdoc}
47
- */
48
- public function get (string $ key , callable $ callback , float $ beta = null )
49
- {
50
- return $ this ->doGet ($ this , $ key , $ callback , $ beta );
51
- }
52
-
53
50
private function doGet (AdapterInterface $ pool , string $ key , callable $ callback , ?float $ beta )
54
51
{
55
52
if (0 > $ beta = $ beta ?? 1.0 ) {
56
53
throw new InvalidArgumentException (sprintf ('Argument "$beta" provided to "%s::get()" must be a positive number, %f given. ' , \get_class ($ this ), $ beta ));
57
54
}
58
55
59
- $ t = 0 ;
60
- $ item = $ pool ->getItem ($ key );
61
- $ recompute = !$ item ->isHit () || INF === $ beta ;
62
-
63
- if (0 < $ beta ) {
64
- if ($ recompute ) {
65
- $ t = microtime (true );
66
- } else {
67
- $ metadata = $ item ->getMetadata ();
68
- $ expiry = $ metadata [ItemInterface::METADATA_EXPIRY ] ?? false ;
69
- $ ctime = $ metadata [ItemInterface::METADATA_CTIME ] ?? false ;
70
-
71
- if ($ ctime && $ expiry ) {
72
- $ t = microtime (true );
73
- $ recompute = $ expiry <= $ t - $ ctime / 1000 * $ beta * log (random_int (1 , PHP_INT_MAX ) / PHP_INT_MAX );
74
- }
75
- }
76
- if ($ recompute ) {
77
- // force applying defaultLifetime to expiry
78
- $ item ->expiresAt (null );
79
- }
80
- }
81
-
82
- if (!$ recompute ) {
83
- return $ item ->get ();
84
- }
85
-
86
56
static $ save ;
87
57
88
58
$ save = $ save ?? \Closure::bind (
@@ -99,16 +69,19 @@ function (AdapterInterface $pool, ItemInterface $item, $value, float $startTime)
99
69
CacheItem::class
100
70
);
101
71
102
- // don't wrap nor save recursive calls
103
- if (null === $ callbackWrapper = $ this ->callbackWrapper ) {
104
- return $ callback ($ item );
105
- }
106
- $ this ->callbackWrapper = null ;
72
+ return $ this ->contractsGet ($ pool , $ key , function (CacheItem $ item ) use ($ pool , $ callback , $ save ) {
73
+ // don't wrap nor save recursive calls
74
+ if (null === $ callbackWrapper = $ this ->callbackWrapper ) {
75
+ return $ callback ($ item );
76
+ }
77
+ $ this ->callbackWrapper = null ;
78
+ $ t = microtime (true );
107
79
108
- try {
109
- return $ save ($ pool , $ item , $ callbackWrapper ($ item , $ callback , $ pool ), $ t );
110
- } finally {
111
- $ this ->callbackWrapper = $ callbackWrapper ;
112
- }
80
+ try {
81
+ return $ save ($ pool , $ item , $ callbackWrapper ($ item , $ callback , $ pool ), $ t );
82
+ } finally {
83
+ $ this ->callbackWrapper = $ callbackWrapper ;
84
+ }
85
+ }, $ beta );
113
86
}
114
87
}
0 commit comments