@@ -79,8 +79,7 @@ static function (array $items, array $itemTags) {
79
79
);
80
80
self ::$ setTagVersions ??= \Closure::bind (
81
81
static function (array $ items , array $ tagVersions ) {
82
- $ now = null ;
83
- foreach ($ items as $ key => $ item ) {
82
+ foreach ($ items as $ item ) {
84
83
$ item ->newMetadata [CacheItem::METADATA_TAGS ] = array_intersect_key ($ tagVersions , $ item ->newMetadata [CacheItem::METADATA_TAGS ] ?? []);
85
84
}
86
85
},
@@ -347,10 +346,9 @@ private function getTagVersions(array $tagsByKey, bool $persistTags): array
347
346
348
347
foreach ($ tagsByKey as $ tags ) {
349
348
$ tagVersions += $ tags ;
350
-
351
349
foreach ($ tags as $ tag => $ version ) {
352
350
if ($ tagVersions [$ tag ] !== $ version ) {
353
- unset( $ this -> knownTagVersions [ $ tag ]) ;
351
+ $ fetchTagVersions = true ;
354
352
}
355
353
}
356
354
}
@@ -360,42 +358,67 @@ private function getTagVersions(array $tagsByKey, bool $persistTags): array
360
358
}
361
359
362
360
$ now = microtime (true );
363
- $ tags = [];
361
+ $ tags = $ newTags = [];
364
362
foreach ($ tagVersions as $ tag => $ version ) {
365
- $ tags [$ tag. static ::TAGS_PREFIX ] = $ tag ;
366
- $ knownTagVersion = $ this ->knownTagVersions [$ tag ] ?? [0 , null ];
367
- if ($ fetchTagVersions || $ knownTagVersion [ 1 ] !== $ version || $ now - $ knownTagVersion [0 ] >= $ this ->knownTagVersionsTtl ) {
363
+ $ tags [$ tag . static ::TAGS_PREFIX ] = $ tag ;
364
+ $ knownTagVersion = $ this ->knownTagVersions [$ tag ] ?? [0 ];
365
+ if ($ fetchTagVersions || $ now - $ knownTagVersion [0 ] >= $ this ->knownTagVersionsTtl ) {
368
366
// reuse previously fetched tag versions up to the ttl
369
367
$ fetchTagVersions = true ;
368
+ continue ;
370
369
}
371
- unset($ this ->knownTagVersions [$ tag ]); // For LRU tracking
372
- if ([0 , null ] !== $ knownTagVersion ) {
373
- $ this ->knownTagVersions [$ tag ] = $ knownTagVersion ;
370
+ if ($ persistTags ) {
371
+ if (null === $ knownTagVersion [1 ]) {
372
+ $ newTags [$ tag ] = $ knownTagVersion [2 ];
373
+ continue ;
374
+ }
375
+ $ tagVersions [$ tag ] = $ knownTagVersion [1 ];
376
+ } elseif ($ knownTagVersion [1 ] !== $ version ) {
377
+ $ fetchTagVersions = true ;
374
378
}
375
379
}
376
380
377
381
if (!$ fetchTagVersions ) {
382
+ if ($ newTags ) {
383
+ foreach ($ newTags as $ tag => $ version ) {
384
+ $ tagVersions [$ tag ] = $ version ->get ();
385
+ $ this ->knownTagVersions [$ tag ] = [$ now , $ tagVersions [$ tag ], null ];
386
+ }
387
+
388
+ (self ::$ saveTags )($ this ->tags , $ newTags );
389
+ }
390
+
378
391
return $ tagVersions ;
379
392
}
380
393
381
- $ newTags = [];
394
+ if (\count ($ this ->knownTagVersions ) > self ::MAX_NUMBER_OF_KNOWN_TAG_VERSIONS ) {
395
+ array_splice ($ this ->knownTagVersions , 0 , \count ($ this ->knownTagVersions ) >> 1 );
396
+ }
397
+
398
+ $ newTags = $ tagVersions = [];
382
399
$ newVersion = null ;
383
400
foreach ($ this ->tags ->getItems (array_keys ($ tags )) as $ tag => $ version ) {
401
+ unset($ this ->knownTagVersions [$ tag = $ tags [$ tag ]]); // For LRU tracking
402
+ $ v = null ;
384
403
if (!$ version ->isHit ()) {
385
- $ newTags [$ tag ] = $ version ->set ($ newVersion ??= random_bytes (6 ));
404
+ $ version ->set ($ newVersion ??= random_bytes (6 ));
405
+ if ($ persistTags ) {
406
+ $ newTags [$ tag ] = $ version ;
407
+ $ tagVersions [$ tag ] = $ newVersion ;
408
+ } else {
409
+ $ v = $ version ; // for future persisting
410
+ $ tagVersions [$ tag ] = null ;
411
+ }
412
+ } else {
413
+ $ tagVersions [$ tag ] = $ version ->get ();
386
414
}
387
- $ tagVersions [$ tag = $ tags [$ tag ]] = $ version ->get ();
388
- $ this ->knownTagVersions [$ tag ] = [$ now , $ tagVersions [$ tag ]];
415
+ $ this ->knownTagVersions [$ tag ] = [$ now , $ tagVersions [$ tag ], $ v ];
389
416
}
390
417
391
- if ($ newTags && $ persistTags ) {
418
+ if ($ newTags ) {
392
419
(self ::$ saveTags )($ this ->tags , $ newTags );
393
420
}
394
421
395
- if (\count ($ this ->knownTagVersions ) > $ maxTags = max (self ::MAX_NUMBER_OF_KNOWN_TAG_VERSIONS , \count ($ newTags ) << 1 )) {
396
- array_splice ($ this ->knownTagVersions , 0 , $ maxTags >> 1 );
397
- }
398
-
399
422
return $ tagVersions ;
400
423
}
401
424
}
0 commit comments