مستندات کامل API برای PHP EasyCache v3.
کلاس اصلی cache که رابط PSR-16 CacheInterface را پیادهسازی میکند.
public function __construct(
array $tiers,
?SerializerInterface $serializer = null,
?CompressorInterface $compressor = null,
int $defaultTtl = 3600,
?LoggerInterface $logger = null,
?string $lockPath = null
)پارامترها:
$tiers(array): آرایهای از نمونههای StorageInterface، مرتب شده از سریعترین به کندترین$serializer(SerializerInterface|null): نمونه Serializer (پیشفرض: NativeSerializer)$compressor(CompressorInterface|null): نمونه Compressor (پیشفرض: NullCompressor)$defaultTtl(int): TTL پیشفرض به ثانیه (پیشفرض: 3600)$logger(LoggerInterface|null): نمونه logger سازگار با PSR-3$lockPath(string|null): مسیر دایرکتوری برای فایلهای قفل (پیشفرض: sys_get_temp_dir()/ec-locks)
استثنا:
\InvalidArgumentExceptionاگر$tiersخالی باشد
مثال:
$cache = new MultiTierCache(
[new ApcuStorage(), new FileStorage('/cache')],
new NativeSerializer(),
new GzipCompressor(5),
3600,
$logger,
'/var/lock/cache'
);بازیابی یک آیتم از cache.
public function get(string $key, mixed $default = null): mixedپارامترها:
$key(string): کلید cache (حداکثر 64 کاراکتر، فقط حروف و اعداد +_.)$default(mixed): مقدار پیشفرض اگر کلید وجود نداشته باشد
برمیگرداند: مقدار cache شده یا $default
استثنا:
InvalidArgumentاگر کلید نامعتبر باشد
مثال:
$value = $cache->get('user_123', ['name' => 'ناشناس']);ذخیره یک آیتم در cache.
public function set(string $key, mixed $value, null|int|DateInterval $ttl = null): boolپارامترها:
$key(string): کلید cache$value(mixed): مقدار برای cache کردن (هر نوع قابل serialize)$ttl(int|DateInterval|null): مدت زمان زنده ماندن. null = استفاده از پیشفرض، 0 = برای همیشه
برمیگرداند: true در صورت موفقیت، false در صورت شکست
استثنا:
InvalidArgumentاگر کلید نامعتبر باشد
مثال:
$cache->set('user_123', $user, 3600);
$cache->set('config', $config, new DateInterval('P1D'));
$cache->set('permanent', $data, 0);حذف یک آیتم از cache.
public function delete(string $key): boolپارامترها:
$key(string): کلید cache
برمیگرداند: true در صورت موفقیت
استثنا:
InvalidArgumentاگر کلید نامعتبر باشد
مثال:
$cache->delete('user_123');پاک کردن تمام آیتمها از cache.
public function clear(): boolبرمیگرداند: true در صورت موفقیت
مثال:
$cache->clear();بررسی وجود یک آیتم در cache.
public function has(string $key): boolپارامترها:
$key(string): کلید cache
برمیگرداند: true اگر وجود داشته باشد و منقضی نشده باشد
استثنا:
InvalidArgumentاگر کلید نامعتبر باشد
مثال:
if ($cache->has('user_123')) {
echo "کاربر cache شده است";
}بازیابی چندین آیتم از cache.
public function getMultiple(iterable $keys, mixed $default = null): iterableپارامترها:
$keys(iterable): لیست کلیدهای cache$default(mixed): مقدار پیشفرض برای کلیدهای موجود نیست
برمیگرداند: آرایه associative از key => value
استثنا:
InvalidArgumentاگر keys قابل تکرار نباشد
مثال:
$results = $cache->getMultiple(['key1', 'key2', 'key3'], null);
// ['key1' => 'value1', 'key2' => 'value2', 'key3' => null]ذخیره چندین آیتم در cache.
public function setMultiple(iterable $values, null|int|DateInterval $ttl = null): boolپارامترها:
$values(iterable): آرایه associative از key => value$ttl(int|DateInterval|null): مدت زمان زنده ماندن
برمیگرداند: true اگر همه موفق شوند
استثنا:
InvalidArgumentاگر values قابل تکرار نباشد
مثال:
$cache->setMultiple([
'key1' => 'value1',
'key2' => 'value2',
], 3600);حذف چندین آیتم از cache.
public function deleteMultiple(iterable $keys): boolپارامترها:
$keys(iterable): لیست کلیدهای cache
برمیگرداند: true اگر همه موفق شوند
استثنا:
InvalidArgumentاگر keys قابل تکرار نباشد
مثال:
$cache->deleteMultiple(['key1', 'key2', 'key3']);دریافت یا تنظیم با پشتیبانی Stale-While-Revalidate.
public function getOrSetSWR(
string $key,
callable $producer,
null|int|DateInterval $ttl = null,
int $swrSeconds = 0,
int $staleIfErrorSeconds = 0,
array $options = []
): mixedپارامترها:
$key(string): کلید cache$producer(callable): تابع برای تولید مقدار تازه:function(): mixed$ttl(int|DateInterval|null): TTL داده تازه$swrSeconds(int): پنجره stale-while-revalidate به ثانیه$staleIfErrorSeconds(int): پنجره stale-if-error به ثانیه$options(array): آرایه گزینههاmode(string): 'sync' یا 'defer' (پیشفرض: 'sync')
برمیگرداند: مقدار cache شده یا تازه
استثنا:
InvalidArgumentاگر کلید نامعتبر باشد- استثناهای
$producerرا مجدداً پرتاب میکند در صورت cache miss
مثال:
$data = $cache->getOrSetSWR(
'expensive_data',
fn() => computeExpensiveData(),
300, // تازه برای 5 دقیقه
60, // کهنه برای 1 دقیقه
600, // کهنه برای 10 دقیقه در صورت خطا
['mode' => 'defer']
);رفتار:
- Cache hit (تازه): مقدار cache شده را فوراً برمیگرداند
- Cache hit (کهنه، در SWR): مقدار کهنه را برمیگرداند، refresh پسزمینه را فعال میکند
- Cache miss: قفل را به دست میآورد، producer را فراخوانی میکند، نتیجه را cache میکند
- خطای Producer با داده کهنه: کهنه را برمیگرداند اگر در پنجره staleIfError باشد
حذف آیتمهای منقضی شده از storage backends.
public function prune(): intبرمیگرداند: تعداد آیتمهای حذف شده
توجه: فقط با backend هایی که از pruning پشتیبانی میکنند کار میکند (PdoStorage). File/APCu/Redis انقضا را به صورت خودکار مدیریت میکنند.
مثال:
$pruned = $cache->prune();
echo "تعداد {$pruned} آیتم منقضی شده حذف شد";تمام storage backend ها باید این interface را پیادهسازی کنند.
interface StorageInterface
{
public function get(string $key): ?string;
public function set(string $key, string $payload, int $ttl): bool;
public function delete(string $key): bool;
public function has(string $key): bool;
public function clear(): bool;
public function prune(): int;
}ذخیرهسازی cache مبتنی بر فایل با directory sharding.
public function __construct(
string $path,
string $ext = '.cache',
int $shards = 2
)پارامترها:
$path(string): مسیر دایرکتوری cache$ext(string): پسوند فایل (پیشفرض: '.cache')$shards(int): سطح sharding از 0 تا 3 (پیشفرض: 2)
استثنا:
\RuntimeExceptionاگر دایرکتوری ایجاد نشود یا قابل نوشتن نباشد
مثال:
$storage = new FileStorage('/var/cache/app', '.cache', 2);تمام متدهای StorageInterface.
یادداشتها:
- از نوشتن اتمی استفاده میکند (فایل موقت + rename)
- از flock() برای قفل خواندن استفاده میکند
- از 0 تا 3 سطح directory sharding پشتیبانی میکند
prune()عدد 0 برمیگرداند (انقضا توسط MultiTierCache مدیریت میشود)
ذخیرهسازی cache حافظه APCu.
public function __construct(string $prefix = 'ec:')پارامترها:
$prefix(string): پیشوند کلید برای namespace کردن (پیشفرض: 'ec:')
استثنا:
\RuntimeExceptionاگر افزونه APCu در دسترس نباشد یا فعال نباشد
مثال:
$storage = new ApcuStorage('myapp:');تمام متدهای StorageInterface.
یادداشتها:
clear()فقط کلیدهای با prefix پیکربندی شده را حذف میکند- بسیار سریع (در حافظه)
- بین worker های PHP-FPM مشترک است
prune()عدد 0 برمیگرداند (APCu انقضا را مدیریت میکند)
ذخیرهسازی cache Redis با پشتیبانی از phpredis و predis.
public function __construct($redisClient, string $prefix = 'ec:')پارامترها:
$redisClient(Redis|Predis\ClientInterface): نمونه client Redis$prefix(string): پیشوند کلید (پیشفرض: 'ec:')
استثنا:
\InvalidArgumentExceptionاگر client نوع نامعتبری داشته باشد
مثال:
// phpredis
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$storage = new RedisStorage($redis, 'app:');
// predis
$redis = new Predis\Client('tcp://127.0.0.1:6379');
$storage = new RedisStorage($redis, 'app:');تمام متدهای StorageInterface.
یادداشتها:
- از SETEX برای پشتیبانی TTL استفاده میکند
clear()از SCAN برای حذف فقط کلیدهای با prefix استفاده میکندprune()عدد 0 برمیگرداند (Redis انقضا را مدیریت میکند)
ذخیرهسازی cache بانک اطلاعاتی PDO.
public function __construct(PDO $pdo, string $table = 'easycache')پارامترها:
$pdo(PDO): نمونه PDO$table(string): نام جدول (پیشفرض: 'easycache')
مثال:
$pdo = new PDO('mysql:host=localhost;dbname=cache', 'user', 'pass');
$storage = new PdoStorage($pdo, 'cache_items');ایجاد جدول cache اگر وجود نداشته باشد.
public function ensureTable(): voidاستثنا:
\RuntimeExceptionاگر ایجاد جدول شکست بخورد
مثال:
$storage->ensureTable();طرح جدول:
k(VARCHAR(64) PRIMARY KEY): کلید cachepayload(BLOB): داده serialize و فشرده شدهexpires_at(BIGINT): timestamp انقضا
تمام متدهای StorageInterface.
یادداشتها:
prune()سطرهای منقضی شده را حذف میکند و تعداد را برمیگرداند- از MySQL، PostgreSQL، SQLite پشتیبانی میکند
- از UPSERT برای عملیات set اتمی استفاده میکند
interface SerializerInterface
{
public function serialize(mixed $value): string;
public function deserialize(string $payload): mixed;
public function name(): string;
}سریالسازی بومی PHP.
$serializer = new NativeSerializer();ویژگیها:
- از اشیاء و انواع پیچیده پشتیبانی میکند
- نام: 'php'
- از
serialize()وunserialize()استفاده میکند
سریالسازی JSON.
$serializer = new JsonSerializer();ویژگیها:
- قابل حمل بین زبانها
- نام: 'json'
- از flag
JSON_THROW_ON_ERRORاستفاده میکند - کاراکترهای Unicode را حفظ میکند
استثنا:
\JsonExceptionدر صورت داده نامعتبر
interface CompressorInterface
{
public function compress(string $data): string;
public function decompress(string $data): string;
public function name(): string;
}بدون فشردهسازی.
$compressor = new NullCompressor();ویژگیها:
- عبوری (بدون فشردهسازی)
- نام: 'none'
فشردهسازی Gzip.
public function __construct(int $level = 3)پارامترها:
$level(int): سطح فشردهسازی 0-9 (پیشفرض: 3)
مثال:
$compressor = new GzipCompressor(5);ویژگیها:
- نام: 'gzip'
- نیاز به ext-zlib دارد
- سطح 0 = بدون فشردهسازی، 9 = حداکثر
استثنا:
\RuntimeExceptionاگر zlib در دسترس نباشد یا فشردهسازی شکست بخورد
فشردهسازی Zstandard.
public function __construct(int $level = 3)پارامترها:
$level(int): سطح فشردهسازی (پیشفرض: 3)
مثال:
$compressor = new ZstdCompressor(3);ویژگیها:
- نام: 'zstd'
- نیاز به ext-zstd دارد
- سریعتر از Gzip
استثنا:
\RuntimeExceptionاگر zstd در دسترس نباشد یا فشردهسازی شکست بخورد
اعتبارسنجی کلیدهای cache طبق PSR-16.
public static function assert(string $key): voidپارامترها:
$key(string): کلید برای اعتبارسنجی
استثنا:
InvalidArgumentاگر کلید نامعتبر باشد
قوانین:
- حداکثر 64 کاراکتر
- فقط:
A-Za-z0-9_. - ممنوع:
{}()/\@:
مثال:
KeyValidator::assert('user_123'); // موفق
KeyValidator::assert('user:123'); // استثنا
KeyValidator::assert('user/profile'); // استثنامکانیزم قفل مبتنی بر فایل.
public function __construct(string $path)پارامترها:
$path(string): مسیر فایل قفل
public function acquire(bool $blocking = true): boolپارامترها:
$blocking(bool): منتظر قفل بماند (true) یا فوراً شکست بخورد (false)
برمیگرداند: true اگر قفل به دست آمد
مثال:
$lock = new Lock('/tmp/my.lock');
// حالت مسدود کننده
if ($lock->acquire(true)) {
// کار را انجام دهید
$lock->release();
}
// حالت غیر مسدود کننده
if ($lock->acquire(false)) {
// کار را انجام دهید
} else {
echo "نتوانست قفل را به دست آورد";
}public function release(): voidتوجه: به صورت خودکار در destructor فراخوانی میشود.
برای کلیدهای cache یا آرگومانهای نامعتبر پرتاب میشود.
class InvalidArgument extends \InvalidArgumentException
implements Psr\SimpleCache\InvalidArgumentExceptionمثال:
try {
$cache->set('invalid:key', 'value');
} catch (InvalidArgument $e) {
echo "کلید نامعتبر: " . $e->getMessage();
}use EasyCache;
EasyCache::set('key', 'value', 3600);
$value = EasyCache::get('key');تمام متدهای MultiTierCache در دسترس هستند.
منتشر شده در config/easycache.php:
return [
'drivers' => ['apcu', 'redis', 'file'],
'default_ttl' => 600,
'lock_path' => storage_path('framework/cache/easycache-locks'),
'serializer' => [
'driver' => 'php', // php|json
],
'compressor' => [
'driver' => 'gzip', // none|gzip|zstd
'level' => 3,
],
// گزینههای خاص backend
];به صورت خودکار کشف میشود. ثبت میکند:
- Facade
EasyCache - Singleton
easycacheدر container
// انواع TTL
int // ثانیه
DateInterval // مثلاً new DateInterval('PT1H')
null // استفاده از TTL پیشفرض
// انواع مقدار پشتیبانی شده
string
int
float
bool
null
array
object (با NativeSerializer)تمام عملیات به صورت داخلی در try-catch قرار دارند. شکستها اگر logger فراهم شده باشد ثبت میشوند و به جای پرتاب کردن false/null برمیگردانند.
استثناهایی که پرتاب میشوند:
InvalidArgument: کلیدها یا پارامترهای نامعتبر\RuntimeException: خطاهای ساخت (افزونههای گمشده، مسیرهای نامعتبر)\JsonException: خطاهای سریالسازی JSON (JsonSerializer)
استثناهایی که پرتاب نمیشوند (به جای آن ثبت میشوند):
- شکستهای storage (خطاهای خواندن/نوشتن)
- خطاهای فشردهسازی/رفع فشردهسازی
- شکستهای به دست آوردن قفل
برای مثالهای بیشتر، EXAMPLES.md را ببینید.