EasyCache یک کتابخانه cache حرفهای و کامل است که استاندارد PSR-16 را پیادهسازی میکند و قابلیتهای پیشرفته زیر را دارد:
- 🚀 ذخیرهسازی چند لایه: APCu، Redis، File و PDO (MySQL/PostgreSQL/SQLite)
- 🔒 نوشتن اتمی و قفل خواندن برای file storage
- ⚡ SWR کامل (stale-while-revalidate + stale-if-error) با قفلهای غیربلاکه
- 🔧 Serializer و Compressor قابل تعویض (PHP/JSON + هیچ/Gzip/Zstd)
- 🔄 Backfill خودکار بین لایهها
- 🎯 یکپارچهسازی کامل با Laravel
- ✅ پوشش تست جامع با PHPUnit
- 🛡️ مدیریت خطای بهبود یافته با پشتیبانی logging
نسخه: v3.0.1 — نیازمند PHP 8.1+ و
psr/simple-cache:^3
composer require iprodev/php-easycacheext-apcuبرای لایه APCuext-redisیاpredis/predis:^2.0برای لایه Redisext-zlibبرای فشردهسازی Gzipext-zstdبرای فشردهسازی Zstd
use Iprodev\EasyCache\Cache\MultiTierCache;
use Iprodev\EasyCache\Storage\ApcuStorage;
use Iprodev\EasyCache\Storage\RedisStorage;
use Iprodev\EasyCache\Storage\FileStorage;
use Iprodev\EasyCache\Serialization\NativeSerializer;
use Iprodev\EasyCache\Compression\GzipCompressor;
// لایهها: APCu -> Redis -> File
$apcu = new ApcuStorage('ec:');
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redisStore = new RedisStorage($redis, 'ec:');
$file = new FileStorage(__DIR__.'/cache');
$cache = new MultiTierCache(
[$apcu, $redisStore, $file],
new NativeSerializer(),
new GzipCompressor(3),
defaultTtl: 600
);
// API استاندارد PSR-16
$cache->set('user_42', ['id'=>42, 'name'=>'علی'], 300);
$data = $cache->get('user_42');سازماندهی cache در لایههای مختلف از سریعترین به کندترین:
$cache = new MultiTierCache(
[
new ApcuStorage('app:'), // سریع: در حافظه
new RedisStorage($redis), // متوسط: شبکه
new FileStorage('/cache') // کند: دیسک
],
new NativeSerializer(),
new NullCompressor(),
3600
);وقتی داده منقضی میشود، داده قدیمی فوراً برگردانده و بهروزرسانی در پسزمینه انجام میشود:
$result = $cache->getOrSetSWR(
key: 'posts_homepage',
producer: function () {
return fetchPostsFromDatabase();
},
ttl: 300, // 5 دقیقه تازه
swrSeconds: 120, // 2 دقیقه قدیمی
staleIfErrorSeconds: 600, // 10 دقیقه اگر خطا رخ داد
options: ['mode' => 'defer']
);// Serializer نیتیو PHP (پشتیبانی از objects)
$cache = new MultiTierCache(
[$storage],
new NativeSerializer(),
new GzipCompressor(5)
);
// Serializer JSON (سریعتر برای دادههای ساده)
$cache = new MultiTierCache(
[$storage],
new JsonSerializer(),
new ZstdCompressor(3)
);Cache حافظهای فوقسریع
$storage = new ApcuStorage('myapp:');Cache شبکهای با قابلیت اشتراکگذاری
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$storage = new RedisStorage($redis, 'myapp:');Cache دیسکی با sharding
$storage = new FileStorage(
path: '/var/cache/myapp',
ext: '.cache',
shards: 2
);Cache پایگاه داده (MySQL/PostgreSQL/SQLite)
$pdo = new PDO('mysql:host=localhost;dbname=cache', 'user', 'pass');
$storage = new PdoStorage($pdo, 'easycache');
$storage->ensureTable();$cache = new MultiTierCache([new FileStorage('/cache')]);
// ذخیره برای 1 ساعت
$cache->set('user_profile', [
'id' => 123,
'name' => 'علی احمدی',
'email' => 'ali@example.com'
], 3600);
// بازیابی
$profile = $cache->get('user_profile');$posts = $cache->getOrSetSWR(
key: 'api_posts',
producer: function() use ($apiClient) {
return $apiClient->fetchPosts();
},
ttl: 300, // 5 دقیقه تازه
swrSeconds: 60, // 1 دقیقه قدیمی
staleIfErrorSeconds: 300,
options: ['mode' => 'defer']
);// ذخیره چندتایی
$cache->setMultiple([
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3',
], 3600);
// بازیابی چندتایی
$results = $cache->getMultiple(['key1', 'key2', 'missing'], 'default');composer require iprodev/php-easycache
php artisan vendor:publish --tag=easycache-configuse EasyCache;
// عملیات ساده
EasyCache::set('user_settings', $settings, 3600);
$settings = EasyCache::get('user_settings');
// الگوی SWR
$data = EasyCache::getOrSetSWR(
'dashboard_stats',
fn() => $this->computeStats(),
300, 60, 300
);# اجرای همه تستها
composer test
# با coverage
composer test:coverage
# بررسی استاندارد کد
composer cs
# تحلیل استاتیک
composer stan
# اجرای همه چکها
composer qaکتابخانه شامل تستهای جامع برای:
- ✅ همه backend های storage
- ✅ Multi-tier caching با backfill
- ✅ قابلیت SWR
- ✅ Serializer ها و Compressor ها
- ✅ اعتبارسنجی کلید
- ✅ مکانیزم قفل
- ✅ حالتهای خطا و edge case ها
- گزارش بهبودها - خلاصه کامل تغییرات
- README.md - راهنمای اصلی
- EXAMPLES.md - مثالهای کاربردی
- API.md - مرجع کامل API
- PERFORMANCE.md - راهنمای بهینهسازی
- TROUBLESHOOTING.md - حل مشکلات
- CONTRIBUTING.md - راهنمای مشارکت
- کاراکترهای مجاز:
[A-Za-z0-9_.] - حداکثر طول: 64 کاراکتر
- کاراکترهای ممنوع:
{ } ( ) / \ @ :
// کلیدهای معتبر
$cache->set('user_123', $data);
$cache->set('posts.latest', $data);
// کلیدهای نامعتبر
$cache->set('user:123', $data); // خطا: دارای :
$cache->set('user/123', $data); // خطا: دارای /$cache = new MultiTierCache([
new ApcuStorage(), // سریعترین
new RedisStorage($redis),
new FileStorage('/cache')
]);$cache = new MultiTierCache(
[$storage],
new JsonSerializer(),
new GzipCompressor(3) // فشردهسازی
);// داده پرتکرار
$cache->set('hot_data', $data, 60); // 1 دقیقه
// داده کمتغییر
$cache->set('config', $data, 3600); // 1 ساعت
// داده ثابت
$cache->set('countries', $data, 86400); // 1 روز$data = $cache->getOrSetSWR(
'expensive_query',
fn() => expensiveOperation(),
300, 60, 600,
['mode' => 'defer'] // پاسخ سریعتر
);sudo apt-get install php-apcu
sudo systemctl restart php8.1-fpmsudo systemctl start redis
redis-cli ping # باید PONG برگرداندsudo mkdir -p /var/cache/app
sudo chown www-data:www-data /var/cache/app
sudo chmod 770 /var/cache/appبرای اطلاعات بیشتر: TROUBLESHOOTING.md
مشارکت شما استقبال میشود! لطفاً CONTRIBUTING.md را بخوانید.
git clone https://github.com/iprodev/php-easycache.git
cd php-easycache
composer install
composer testMIT © iprodev
- مرجع API - English
- مرجع API - فارسی
- مرجع API - کوردی
- مثالها - English
- مثالها - فارسی
- مثالها - کوردی
- راهنمای بهینهسازی
- حل مشکلات
- گزارش بهبودها
- GitHub Issues
- 📧 ایمیل: dev@iprodev.com
- 🐛 گزارش باگ: GitHub Issues
- 💡 بحث و گفتگو: GitHub Discussions
ساخته شده با ❤️ برای جامعه PHP