Skip to content

Commit bde85ec

Browse files
committed
Added yii\caching\CallbackDependency to allow using a callback to determine if a cache dependency is still valid
1 parent 28cbf6c commit bde85ec

File tree

12 files changed

+94
-6
lines changed

12 files changed

+94
-6
lines changed

docs/guide-es/caching-data.md

+1
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ Aquí abajo se muestra un sumario de las dependencias disponibles:
191191
- [[yii\caching\ChainedDependency]]: la dependencia cambia si cualquiera de las dependencias en la cadena cambia.
192192
- [[yii\caching\DbDependency]]: la dependencia cambia si el resultado de la consulta de la sentencia SQL especificada cambia.
193193
- [[yii\caching\ExpressionDependency]]: la dependencia cambia si el resultado de la expresión de PHP especificada cambia.
194+
- [[yii\caching\CallbackDependency]]: la dipendenza viene modificata se il risultato della callback PHP specificata cambia.
194195
- [[yii\caching\FileDependency]]: la dependencia cambia si se modifica la última fecha de modificación del archivo.
195196
- [[yii\caching\TagDependency]]: marca un elemento de datos en caché con un nombre de grupo. Puedes invalidar los elementos de datos almacenados en caché
196197
con el mismo nombre del grupo a la vez llamando a [[yii\caching\TagDependency::invalidate()]].

docs/guide-fr/caching-data.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ Ci-dessous nous présentons un résumé des dépendances de mise en cache dispon
217217
- [[yii\caching\ChainedDependency]]: la dépendance est modifiée si l'une des dépendances de la chaîne est modifiée.
218218
- [[yii\caching\DbDependency]]: la dépendance est modifiée si le résultat de le requête de l'instruction SQL spécifiée est modifié.
219219
- [[yii\caching\ExpressionDependency]]: la dépendance est modifiée si le résultat de l'expression PHP spécifiée est modifié.
220+
- [[yii\caching\CallbackDependency]]: la dépendance est modifiée si le résultat du rappel PHP spécifié est modifié.
220221
- [[yii\caching\FileDependency]]: la dépendance est modifiée si la date de dernière modification du fichier est modifiée.
221222
- [[yii\caching\TagDependency]]: associe une donnée mise en cache à une ou plusieurs balises. Vous pouvez invalider la donnée mise en cache associée à la balise spécifiée en appelant [[yii\caching\TagDependency::invalidate()]].
222223

@@ -342,4 +343,3 @@ $result = $db->cache(function ($db) {
342343
La mise en cache de requêtes ne fonctionne pas avec des résultats de requêtes qui contiennent des gestionnaires de ressources. Par exemple, lorsque vous utilisez de type de colonne `BLOB` dans certains systèmes de gestion de bases de données (DBMS), la requête retourne un gestionnaire de ressources pour la donnée de la colonne.
343344

344345
Quelques supports de stockage pour cache sont limités en taille. Par exemple, avec memcache, chaque entrée est limitée en taille à 1 MO. En conséquence, si le résultat d'une requête dépasse cette taille, la mise en cache échoue.
345-

docs/guide-ja/caching-data.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ $data = $cache->get($key);
275275
- [[yii\caching\ChainedDependency]]: チェーン上のいずれかの依存が変更された場合に、依存が変更されます。
276276
- [[yii\caching\DbDependency]]: 指定された SQL 文のクエリ結果が変更された場合、依存が変更されます。
277277
- [[yii\caching\ExpressionDependency]]: 指定された PHP の式の結果が変更された場合、依存が変更されます。
278+
- [[yii\caching\CallbackDependency]]: 指定されたPHPコールバックの結果が変更された場合、依存関係は変更されます。
278279
- [[yii\caching\FileDependency]]: ファイルの最終更新日時が変更された場合、依存が変更されます。
279280
- [[yii\caching\TagDependency]]: キャッシュされるデータ・アイテムに一つまたは複数のタグを関連付けます。
280281
[[yii\caching\TagDependency::invalidate()]] を呼び出すことによって、指定されたタグ (複数可) を持つキャッシュされたデータ・アイテムを無効にすることができます。
@@ -431,4 +432,3 @@ $result = $db->cache(function ($db) {
431432

432433
> Info: デフォルトでは、コンソール・アプリケーションは独立した構成情報ファイルを使用します。
433434
正しい結果を得るためには、ウェブとコンソールのアプリケーション構成で同じキャッシュ・コンポーネントを使用していることを確認してください。
434-

docs/guide-pt-BR/caching-data.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ Abaixo um sumário das dependências de cache disponíveis:
229229
- [[yii\caching\DbDependency]]: a dependência muda caso o resultado da consulta especificada pela instrução SQL seja
230230
alterado.
231231
- [[yii\caching\ExpressionDependency]]: a dependência muda se o resultado da expressão PHP especificada for alterado.
232+
- [[yii\caching\CallbackDependency]]: a dependência é alterada se o resultado do callback PHP especificado for alterado..
232233
- [[yii\caching\FileDependency]]: A dependência muda se a data da última alteração do arquivo for alterada.
233234
- [[yii\caching\TagDependency]]: associa um registro em cache com uma ou múltiplas tags. Você pode invalidar os
234235
registros em cache com a tag especificada ao chamar [[yii\caching\TagDependency::invalidate()]].
@@ -352,4 +353,3 @@ O cache de consulta não funciona com resultados de consulta que contêm <i>mani
352353
Por exemplo, ao usar o tipo de coluna `BLOB` em alguns SGBDs, o resultado da consulta retornará um <i>manipulador de recurso</i> (resource handler) para o registro na coluna.
353354

354355
Alguns armazenamentos em cache têm limitações de tamanho. Por exemplo, memcache limita o uso máximo de espaço de 1MB para cada registro. Então, se o tamanho do resultado de uma consulta exceder este limite, o cache falhará.
355-

docs/guide-ru/caching-data.md

+1
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ $data = $cache->get($key);
221221
- [[yii\caching\ChainedDependency]]: зависимость меняется, если любая зависимость в цепочке изменяется;
222222
- [[yii\caching\DbDependency]]: зависимость меняется, если результат некоторого определенного SQL запроса изменён;
223223
- [[yii\caching\ExpressionDependency]]: зависимость меняется, если результат определенного PHP выражения изменён;
224+
- [[yii\caching\CallbackDependency]]: зависимость меняется, если результат коллбэк функции изменён;
224225
- [[yii\caching\FileDependency]]: зависимость меняется, если изменилось время последней модификации файла;
225226
- [[yii\caching\TagDependency]]: Связывает кэшированные данные элемента с одним или несколькими тегами. Вы можете аннулировать кэширование данных элементов с заданным тегом(тегами) по вызову. [[yii\caching\TagDependency::invalidate()]];
226227

docs/guide-zh-CN/caching-data.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ $data = $cache->get($key);
275275
- [[yii\caching\ChainedDependency]]:如果依赖链上任何一个依赖产生变化,则依赖改变。
276276
- [[yii\caching\DbDependency]]:如果指定 SQL 语句的查询结果发生了变化,则依赖改变。
277277
- [[yii\caching\ExpressionDependency]]:如果指定的 PHP 表达式执行结果发生变化,则依赖改变。
278+
- [[yii\caching\CallbackDependency]]:如果指定的PHP回调结果发生变化,依赖性将改变。
278279
- [[yii\caching\FileDependency]]:如果文件的最后修改时间发生变化,则依赖改变。
279280
- [[yii\caching\TagDependency]]:将缓存的数据项与一个或多个标签相关联。 您可以通过调用
280281
 [[yii\caching\TagDependency::invalidate()]] 来检查指定标签的缓存数据项是否有效。
@@ -431,4 +432,3 @@ $result = $db->cache(function ($db) {
431432

432433
> Info: 默认情况下,控制台应用使用独立的配置文件。
433434
所以,为了上述命令发挥作用,请确保 Web 应用和控制台应用配置相同的缓存组件。
434-

docs/guide/caching-data.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,7 @@ Below is a summary of the available cache dependencies:
277277
- [[yii\caching\ChainedDependency]]: the dependency is changed if any of the dependencies on the chain is changed.
278278
- [[yii\caching\DbDependency]]: the dependency is changed if the query result of the specified SQL statement is changed.
279279
- [[yii\caching\ExpressionDependency]]: the dependency is changed if the result of the specified PHP expression is changed.
280+
- [[yii\caching\CallbackDependency]]: the dependency is changed if the result of the specified PHP callback is changed.
280281
- [[yii\caching\FileDependency]]: the dependency is changed if the file's last modification time is changed.
281282
- [[yii\caching\TagDependency]]: associates a cached data item with one or multiple tags. You may invalidate
282283
the cached data items with the specified tag(s) by calling [[yii\caching\TagDependency::invalidate()]].
@@ -433,4 +434,3 @@ You can flush the cache from the console by calling `yii cache/flush` as well.
433434

434435
> Info: Console application uses a separate configuration file by default. Ensure, that you have the same caching
435436
components in your web and console application configs to reach the proper effect.
436-

framework/CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ Yii Framework 2 Change Log
2121
- Enh #20032: Added `yii\helpers\BaseStringHelper::mask()` method for string masking with multibyte support (salehhashemi1992)
2222
- Enh #20034: Added `yii\helpers\BaseStringHelper::findBetween()` to retrieve a substring that lies between two strings (salehhashemi1992)
2323
- Enh #20121: Added `yiisoft/yii2-coding-standards` to composer `require-dev` and lint code to comply with PSR12 (razvanphp)
24+
- Added `yii\caching\CallbackDependency` to allow using a callback to determine if a cache dependency is still valid (laxity7)
2425

2526

2627
2.0.49.2 October 12, 2023
+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
/**
4+
* @link https://www.yiiframework.com/
5+
* @copyright Copyright (c) 2008 Yii Software LLC
6+
* @license https://www.yiiframework.com/license/
7+
*/
8+
9+
namespace yii\caching;
10+
11+
/**
12+
* CallbackDependency represents a dependency based on the result of a callback function.
13+
*
14+
* Callback function should return a value that serves as the dependency data.
15+
*
16+
* For more details and usage information on Cache, see the [guide article on caching](guide:caching-overview).
17+
*
18+
* @author Vlad Varlamov <[email protected]>
19+
* @since 2.0.50
20+
*/
21+
class CallbackDependency extends Dependency
22+
{
23+
/**
24+
* @var callable the PHP callback that will be called to determine if the dependency has been changed.
25+
*/
26+
public $callback;
27+
28+
29+
/**
30+
* Generates the data needed to determine if dependency has been changed.
31+
* This method returns the result of the callback function.
32+
* @param CacheInterface $cache the cache component that is currently evaluating this dependency
33+
* @return mixed the data needed to determine if dependency has been changed.
34+
*/
35+
protected function generateDependencyData($cache)
36+
{
37+
return call_user_func($this->callback);
38+
}
39+
}

framework/caching/FileDependency.php

+5-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,11 @@ protected function generateDependencyData($cache)
4545
}
4646

4747
$fileName = Yii::getAlias($this->fileName);
48+
if (!file_exists($fileName)) {
49+
return 0;
50+
}
51+
4852
clearstatcache(false, $fileName);
49-
return @filemtime($fileName);
53+
return filemtime($fileName);
5054
}
5155
}

framework/classes.php

+1
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
'yii\caching\Dependency' => YII2_PATH . '/caching/Dependency.php',
8282
'yii\caching\DummyCache' => YII2_PATH . '/caching/DummyCache.php',
8383
'yii\caching\ExpressionDependency' => YII2_PATH . '/caching/ExpressionDependency.php',
84+
'yii\caching\CallbackDependency' => YII2_PATH . '/caching/CallbackDependency.php',
8485
'yii\caching\FileCache' => YII2_PATH . '/caching/FileCache.php',
8586
'yii\caching\FileDependency' => YII2_PATH . '/caching/FileDependency.php',
8687
'yii\caching\MemCache' => YII2_PATH . '/caching/MemCache.php',
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
3+
namespace yiiunit\framework\caching;
4+
5+
use PHPUnit\Framework\TestCase;
6+
use yii\caching\ArrayCache;
7+
use yii\caching\CallbackDependency;
8+
9+
class CallbackDependencyTest extends TestCase
10+
{
11+
public function testDependencyChange()
12+
{
13+
$cache = new ArrayCache();
14+
$dependencyValue = true;
15+
16+
$dependency = new CallbackDependency();
17+
$dependency->callback = function () use (&$dependencyValue) {
18+
return $dependencyValue === true;
19+
};
20+
21+
$dependency->evaluateDependency($cache);
22+
$this->assertFalse($dependency->isChanged($cache));
23+
24+
$dependencyValue = false;
25+
$this->assertTrue($dependency->isChanged($cache));
26+
}
27+
28+
public function testDependencyNotChanged()
29+
{
30+
$cache = new ArrayCache();
31+
32+
$dependency = new CallbackDependency();
33+
$dependency->callback = function () {
34+
return 2 + 2;
35+
};
36+
37+
$dependency->evaluateDependency($cache);
38+
$this->assertFalse($dependency->isChanged($cache));
39+
$this->assertFalse($dependency->isChanged($cache));
40+
}
41+
}

0 commit comments

Comments
 (0)