แคช
webman/cache เป็นคอมโพเนนต์แคชที่พัฒนาบนฐาน symfony/cache รองรับทั้งสภาพแวดล้อม coroutine และ non-coroutine และรองรับ connection pool
การติดตั้ง
composer require -W webman/cache
ตัวอย่าง
<?php
namespace app\controller;
use support\Request;
use support\Cache;
class UserController
{
public function db(Request $request)
{
$key = 'test_key';
Cache::set($key, rand());
return response(Cache::get($key));
}
}
ตำแหน่งไฟล์กำหนดค่า
ไฟล์กำหนดค่าอยู่ที่ config/cache.php หากไม่มีให้สร้างด้วยตนเอง
เนื้อหาไฟล์กำหนดค่า
<?php
return [
'default' => 'file',
'stores' => [
'file' => [
'driver' => 'file',
'path' => runtime_path('cache')
],
'redis' => [
'driver' => 'redis',
'connection' => 'default'
],
'array' => [
'driver' => 'array'
],
'apcu' => [
'driver' => 'apcu'
]
]
];
stores.driver รองรับ 4 ไดรเวอร์: file, redis, array และ apcu
ไดรเวอร์ file
เป็นไดรเวอร์เริ่มต้น ไม่พึ่งพาคอมโพเนนต์ภายนอก รองรับการแชร์แคชระหว่างกระบวนการ ไม่รองรับการแชร์ระหว่างหลายเซิร์ฟเวอร์
ไดรเวอร์ array
จัดเก็บในหน่วยความจำ ประสิทธิภาพดีที่สุด แต่ใช้หน่วยความจำ ไม่รองรับการแชร์ระหว่างกระบวนการหรือเซิร์ฟเวอร์ ข้อมูลหายเมื่อกระบวนการรีสตาร์ท มักใช้กับโครงการที่ข้อมูลแคชไม่มาก
ไดรเวอร์ apcu
จัดเก็บในหน่วยความจำ ประสิทธิภาพรองจาก array รองรับการแชร์แคชระหว่างกระบวนการ ไม่รองรับการแชร์ระหว่างหลายเซิร์ฟเวอร์ ข้อมูลหายเมื่อกระบวนการรีสตาร์ท มักใช้กับโครงการที่ข้อมูลแคชไม่มาก
ต้องติดตั้งและเปิดใช้งาน ส่วนขยาย APCu ไม่แนะนำสำหรับสถานการณ์ที่เขียน/ลบแคชบ่อย จะทำให้ประสิทธิภาพลดลงอย่างเห็นได้ชัด
ไดรเวอร์ redis
พึ่งพาคอมโพเนนต์ webman/redis รองรับการแชร์แคชระหว่างกระบวนการและเซิร์ฟเวอร์
stores.redis.connection
stores.redis.connection ตรงกับ key ที่กำหนดใน config/redis.php เมื่อใช้ Redis จะนำการกำหนดค่าของ webman/redis มาใช้รวมถึงการกำหนดค่า connection pool
แนะนำให้เพิ่มการกำหนดค่า Redis แยกสำหรับแคชใน config/redis.php เช่น
<?php
return [
'default' => [
'password' => 'abc123',
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
],
'cache' => [ // <==== เพิ่มใหม่
'password' => 'abc123',
'host' => '127.0.0.1',
'port' => 6379,
'database' => 1,
'prefix' => 'webman_cache-',
]
];
จากนั้นตั้ง stores.redis.connection เป็น cache ไฟล์ config/cache.php สุดท้ายจะคล้ายดังนี้:
<?php
return [
'default' => 'redis', // <====
'stores' => [
'file' => [
'driver' => 'file',
'path' => runtime_path('cache')
],
'redis' => [
'driver' => 'redis',
'connection' => 'cache' // <====
],
'array' => [
'driver' => 'array'
]
]
];
การเปลี่ยนที่เก็บ
สามารถเปลี่ยนที่เก็บด้วยตนเองเพื่อใช้ไดรเวอร์ที่แตกต่างกัน เช่น:
Cache::store('redis')->set('key', 'value');
Cache::store('array')->set('key', 'value');
เคล็ดลับ
ชื่อ key แคชถูกจำกัดตาม PSR-6 ห้ามมีอักขระใดๆ ใน{}()/\@:การตรวจสอบนี้ตั้งแต่symfony/cache7.2.4 สามารถข้ามชั่วคราวได้ด้วยการกำหนดค่า PHP inizend.assertions=-1
การใช้คอมโพเนนต์แคชอื่น
ดู ฐานข้อมูลอื่น ๆ สำหรับคอมโพเนนต์ ThinkCache