Tôi đang tìm kiếm bộ nhớ cache/hashtable trong bộ nhớ nhanh nhất có sẵn cho PHP.
Tôi sẽ lưu trữ một số giá trị cấu hình hệ thống trong đó và tôi đang cố gắng có được chi phí thấp nhất có thể.
Dữ liệu sẽ nhỏ và hạt.
Bạn muốn giới thiệu gì và tại sao?
hỏi ngày 5 tháng 9 năm 2011 lúc 14:19Sep 5, 2011 at 14:19
5
Nếu bạn chưa cài đặt APC hoặc Memcached [hoặc không muốn sử dụng chúng cho việc này], bạn cũng có thể tạo đĩa RAM. Sau đó, sử dụng
# Windows
extension=php_apcu.dll
extension=php_apcu_bc.dll
apc.enabled=1
apc.enable_cli=1
#Linux / MacOS
extension="apcu.so"
extension="apc.so"
apc.enabled=1
apc.enable_cli=1
0 và # Windows
extension=php_apcu.dll
extension=php_apcu_bc.dll
apc.enabled=1
apc.enable_cli=1
#Linux / MacOS
extension="apcu.so"
extension="apc.so"
apc.enabled=1
apc.enable_cli=1
1 trong đó tên tệp là khóa của bạn và nội dung tệp là giá trị của bạn. Tôi không có số cho điều đó, nhưng nó sẽ nhanh.
Đã trả lời ngày 5 tháng 9 năm 2011 lúc 14:31Sep 5, 2011 at 14:31
GordongordonGordon
308K72 Huy hiệu vàng527 Huy hiệu bạc553 Huy hiệu Đồng72 gold badges527 silver badges553 bronze badges
2
CHDB là một hashtable chỉ đọc được chia sẻ trên các quy trình PHP: có lẽ là một quá trình Angry nhanh nhất và ít hơn.
HIDEF cho phép xác định các hằng số bằng tệp .ini. Các hằng số được xác định một lần, khi mô -đun PHP được bắt đầu.
APC có thể lưu trữ các biến trong bộ nhớ chia sẻ, để chúng có sẵn cho các quy trình PHP khác. Nó có chi phí tuần tự hóa và khử serial hóa mỗi khi bạn lưu trữ và lấy chúng.
Xem những người khác: //pecl.php.net/packages.php?catpid=3&catname=caching
Nikic
99,7K36 Huy hiệu vàng188 Huy hiệu bạc224 Huy hiệu đồng36 gold badges188 silver badges224 bronze badges
Đã trả lời ngày 5 tháng 9 năm 2011 lúc 14:27Sep 5, 2011 at 14:27
Arnaud le blancarnaud le blancArnaud Le Blanc
96.5K22 Huy hiệu vàng203 Huy hiệu bạc193 Huy hiệu Đồng22 gold badges203 silver badges193 bronze badges
3
Đã trả lời ngày 5 tháng 9 năm 2011 lúc 14:24Sep 5, 2011 at 14:24
Đã trả lời ngày 5 tháng 9 năm 2011 lúc 14:22Sep 5, 2011 at 14:22
Sanmaisanmaisanmai
Phim thương hiệu vàng 27.5K1212 gold badges61 silver badges74 bronze badges
Nếu bạn không có ý định sửa đổi dữ liệu [có thể đúng với các tệp cấu hình của bạn] thì hãy sử dụng CHDB.
Đã trả lời ngày 5 tháng 9 năm 2011 lúc 14:33Sep 5, 2011 at 14:33
Karoly Horvathkaroly HorvathKaroly Horvath
92.9k11 Huy hiệu vàng113 Huy hiệu bạc173 Huy hiệu đồng11 gold badges113 silver badges173 bronze badges
1
Sự tăng trưởng của dự án và tải trọng của nó có thể là một thách thức thực sự cho nhà phát triển. Trang web bắt đầu trả lời với sự chậm trễ và câu hỏi về việc mở rộng đang được đặt ra thường xuyên hơn. Có nhiều giải pháp hiệu quả để tăng tính ổn định của dự án và khả năng tải, và một trong những giải pháp cơ bản nhất là bộ nhớ đệm.
Bộ nhớ đệm là việc lưu dữ liệu ở những nơi có thể truy cập cao tạm thời để truy xuất của chúng được thực hiện nhanh hơn so với nguồn. Ví dụ phổ biến nhất về việc sử dụng bộ đệm là nhận dữ liệu từ cơ sở dữ liệu. Ví dụ, khi một sản phẩm được nhận từ cơ sở dữ liệu, nó được lưu trữ trong bộ đệm trong một thời gian nhất định, do đó, mỗi yêu cầu tiếp theo cho sản phẩm này sẽ không làm phiền cơ sở dữ liệu, vì dữ liệu sẽ được nhận từ một bộ lưu trữ khác.
Các cách tiếp cận là gì?
Có nhiều cách tiếp cận để lưu trữ. Bạn có thể kiểm tra danh sách các công cụ tương thích PHP trên trang PHP-CACHE. Tuy nhiên, những cái phổ biến nhất là:
- Apcu
- Mảng
- Memcached
- Redis
Hãy xem xét sự khác biệt và tính năng của họ.
Apcu
Một trong những công cụ bộ nhớ đệm phổ biến và dễ kết hợp nhất. Lưu dữ liệu vào RAM [và cũng biết cách lưu trữ mã trung gian, nhưng đó là một câu chuyện hoàn toàn khác ...]. Để bắt đầu với APCU, bạn cần chắc chắn rằng nó được cài đặt. Để làm điều đó, hãy chạy lệnh sau trên dòng lệnh:
php -i | grep 'apc.enabled'
# We're expecting to see:
# apc.enabled => On => On
Nhập chế độ FullScreenen EXIT Mode FullScreen
Một cách khác để kiểm tra nó: Tạo một tệp index.php và đặt cuộc gọi chức năng
# Windows
extension=php_apcu.dll
extension=php_apcu_bc.dll
apc.enabled=1
apc.enable_cli=1
#Linux / MacOS
extension="apcu.so"
extension="apc.so"
apc.enabled=1
apc.enable_cli=1
2 trong đó. Đảm bảo rằng bạn có một máy chủ web được cấu hình cho thư mục bạn đang sử dụng và mở tập lệnh trong trình duyệt thông qua địa chỉ máy chủ. Chúng tôi quan tâm đến phần APCU, nếu có hỗ trợ APCU: mục được bật bên trong nó, thì mọi thứ đều ổn, chúng tôi có thể tiếp tục.index.php and put the # Windows
extension=php_apcu.dll
extension=php_apcu_bc.dll
apc.enabled=1
apc.enable_cli=1
#Linux / MacOS
extension="apcu.so"
extension="apc.so"
apc.enabled=1
apc.enable_cli=1
2 function call in it. Make sure that you have a web server configured for the directory you are using and open the script in the browser via the server address. We are interested in the APCu section, if there is an APCu Support: Enabled item inside
it, then everything is fine, we can move on.Nếu bạn chưa cài đặt APCU, bạn có thể thực hiện theo cách sau:
- Khởi chạy một cửa sổ đầu cuối [Linux/macOS] hoặc dấu nhắc lệnh [Windows. Nhập "CMD" trong tìm kiếm]
- Chạy lệnh:
3# Windows extension=php_apcu.dll extension=php_apcu_bc.dll apc.enabled=1 apc.enable_cli=1 #Linux / MacOS extension="apcu.so" extension="apc.so" apc.enabled=1 apc.enable_cli=1
Mở tệp cấu hình php.ini thông qua bất kỳ trình soạn thảo văn bản nào và đảm bảo rằng các dòng sau có mặt:php.ini configuration file via any text editor and make sure that the following lines are present:
# Windows extension=php_apcu.dll extension=php_apcu_bc.dll apc.enabled=1 apc.enable_cli=1 #Linux / MacOS extension="apcu.so" extension="apc.so" apc.enabled=1 apc.enable_cli=1
Nếu không có dòng được chỉ định, hãy thêm chúng và lưu tệp cấu hình
Lặp lại séc cho APCU đã cài đặt
Để sử dụng phương pháp lưu trữ này, chúng tôi sẽ cần các chức năng cơ bản. Dưới đây là một ví dụ về ứng dụng của họ.
$cacheKey = 'product_1';
$ttl = 600; // 10 minutes.
// Checking APCu availability
$isEnabled = apcu_enabled[];
// Checks if there is data in the cache by key
$isExisted = apcu_exists[$cacheKey];
// Saves data to the cache. Returns true if successful
// The $ttl argument determines how long the cache will be stored [seconds]
$isStored = apcu_store[$cacheKey, ['name' => 'Demo product'], $ttl];
// Retrieves data from the cache by key. If not, returns false
$data = apcu_fetch[$cacheKey];
// Deletes data from the cache by key
$isDeleted = apcu_delete[$cacheKey];
var_dump[[
'is_enabled' => $isEnabled,
'is_existed' => $isExisted,
'is_stored' => $isStored,
'is_deleted' => $isDeleted,
'fetched_data' => $data,
]];
Nhập chế độ FullScreenen EXIT Mode FullScreen
Một cách khác để kiểm tra nó: Tạo một tệp index.php và đặt cuộc gọi chức năng
# Windows
extension=php_apcu.dll
extension=php_apcu_bc.dll
apc.enabled=1
apc.enable_cli=1
#Linux / MacOS
extension="apcu.so"
extension="apc.so"
apc.enabled=1
apc.enable_cli=1
2 trong đó. Đảm bảo rằng bạn có một máy chủ web được cấu hình cho thư mục bạn đang sử dụng và mở tập lệnh trong trình duyệt thông qua địa chỉ máy chủ. Chúng tôi quan tâm đến phần APCU, nếu có hỗ trợ APCU: mục được bật bên trong nó, thì mọi thứ đều ổn, chúng tôi có thể tiếp tục.key-value storage, which means that the stored data is stored with a special key, which is accessed. In this case, the key is stored in the # Windows
extension=php_apcu.dll
extension=php_apcu_bc.dll
apc.enabled=1
apc.enable_cli=1
#Linux / MacOS
extension="apcu.so"
extension="apc.so"
apc.enabled=1
apc.enable_cli=1
4 variable.Nếu bạn chưa cài đặt APCU, bạn có thể thực hiện theo cách sau: This approach only works in the website mode, i.e. when running from the command line, you will not receive data from the cache, and everything that you have saved to it will be cleared when the script completes. However, this will not cause any errors.
Khởi chạy một cửa sổ đầu cuối [Linux/macOS] hoặc dấu nhắc lệnh [Windows. Nhập "CMD" trong tìm kiếm]
Chạy lệnh:
# Windows
extension=php_apcu.dll
extension=php_apcu_bc.dll
apc.enabled=1
apc.enable_cli=1
#Linux / MacOS
extension="apcu.so"
extension="apc.so"
apc.enabled=1
apc.enable_cli=1
3Mở tệp cấu hình php.ini thông qua bất kỳ trình soạn thảo văn bản nào và đảm bảo rằng các dòng sau có mặt:
Nếu không có dòng được chỉ định, hãy thêm chúng và lưu tệp cấu hình
Nhập chế độ FullScreenen EXIT Mode FullScreen
Một cách khác để kiểm tra nó: Tạo một tệp index.php và đặt cuộc gọi chức năng
# Windows
extension=php_apcu.dll
extension=php_apcu_bc.dll
apc.enabled=1
apc.enable_cli=1
#Linux / MacOS
extension="apcu.so"
extension="apc.so"
apc.enabled=1
apc.enable_cli=1
2 trong đó. Đảm bảo rằng bạn có một máy chủ web được cấu hình cho thư mục bạn đang sử dụng và mở tập lệnh trong trình duyệt thông qua địa chỉ máy chủ. Chúng tôi quan tâm đến phần APCU, nếu có hỗ trợ APCU: mục được bật bên trong nó, thì mọi thứ đều ổn, chúng tôi có thể tiếp tục.Nếu bạn chưa cài đặt APCU, bạn có thể thực hiện theo cách sau:
Khởi chạy một cửa sổ đầu cuối [Linux/macOS] hoặc dấu nhắc lệnh [Windows. Nhập "CMD" trong tìm kiếm]
- Chạy lệnh:
3# Windows extension=php_apcu.dll extension=php_apcu_bc.dll apc.enabled=1 apc.enable_cli=1 #Linux / MacOS extension="apcu.so" extension="apc.so" apc.enabled=1 apc.enable_cli=1
- Mở tệp cấu hình php.ini thông qua bất kỳ trình soạn thảo văn bản nào và đảm bảo rằng các dòng sau có mặt:
Nếu không có dòng được chỉ định, hãy thêm chúng và lưu tệp cấu hình
Lặp lại séc cho APCU đã cài đặt
Để sử dụng phương pháp lưu trữ này, chúng tôi sẽ cần các chức năng cơ bản. Dưới đây là một ví dụ về ứng dụng của họ.
Bất kỳ bộ đệm nào cũng hoạt động theo nguyên tắc lưu trữ giá trị khóa, có nghĩa là dữ liệu được lưu trữ được lưu trữ với một khóa đặc biệt, được truy cập. Trong trường hợp này, khóa được lưu trữ trong biến
# Windows
extension=php_apcu.dll
extension=php_apcu_bc.dll
apc.enabled=1
apc.enable_cli=1
#Linux / MacOS
extension="apcu.so"
extension="apc.so"
apc.enabled=1
apc.enable_cli=1
4.- Quan trọng! Cách tiếp cận này chỉ hoạt động trong chế độ trang web, tức là khi chạy từ dòng lệnh, bạn sẽ không nhận được dữ liệu từ bộ đệm và mọi thứ bạn đã lưu vào nó sẽ được xóa khi tập lệnh hoàn thành. Tuy nhiên, điều này sẽ không gây ra bất kỳ lỗi nào.
- Mảng-cache
- Một phương pháp đơn giản hơn, nhưng không phải lúc nào cũng có thể áp dụng. Nếu APCU lưu dữ liệu và cung cấp nó để thực hiện tiếp theo bởi tất cả các quy trình, thì bộ đệm mảng chỉ lưu trữ nó cho yêu cầu được xử lý.
- Nó có nghĩa là gì? Hãy tưởng tượng rằng bạn có một trang với nhận xét của người dùng. Một người dùng có thể để lại một số tin nhắn và khi chúng tôi thu thập một mảng dữ liệu này, chúng tôi không muốn tìm nạp cùng một người dùng từ cơ sở dữ liệu nhiều lần. Những gì chúng tôi có thể làm là đặt dữ liệu nhận được thành một mảng để nếu có, chúng tôi không đưa ra yêu cầu nữa. Nguyên tắc này rất đơn giản và dễ thực hiện. Chúng ta hãy viết một lớp sẽ thực hiện một pha cứu thua như vậy.
class CustomArrayCache { /** * Array is static and private * – private – so that it can be accessed only from the * methods of the class * – static – so that the property is available in all instances */ private static array $memory = []; // Method for storing data in memory public function store[string $key, $value]: bool { self::$memory[$key] = $value; return true; } // Method for getting data from memory public function fetch[string $key] { return self::$memory[$key] ?? null; } // Method for deleting data from memory public function delete[string $key]: bool { unset[self::$memory[$key]]; return true; } // Method for checking the availability of key data public function exists[string $key]: bool { return array_key_exists[$key, self::$memory]; } }
- Cách tiếp cận này rất đơn giản, nhưng do những hạn chế của nó, nó hiếm khi được sử dụng. Tuy nhiên, nó rất hữu ích khi biết về nó.
4 - Xóa dữ liệu cho nhiều khóa;$cacheKey = 'product_1'; $ttl = 600; // 10 minutes. // Checking APCu availability $isEnabled = apcu_enabled[]; // Checks if there is data in the cache by key $isExisted = apcu_exists[$cacheKey]; // Saves data to the cache. Returns true if successful // The $ttl argument determines how long the cache will be stored [seconds] $isStored = apcu_store[$cacheKey, ['name' => 'Demo product'], $ttl]; // Retrieves data from the cache by key. If not, returns false $data = apcu_fetch[$cacheKey]; // Deletes data from the cache by key $isDeleted = apcu_delete[$cacheKey]; var_dump[[ 'is_enabled' => $isEnabled, 'is_existed' => $isExisted, 'is_stored' => $isStored, 'is_deleted' => $isDeleted, 'fetched_data' => $data, ]];
-
5 - Kiểm tra tính khả dụng của dữ liệu chính.$cacheKey = 'product_1'; $ttl = 600; // 10 minutes. // Checking APCu availability $isEnabled = apcu_enabled[]; // Checks if there is data in the cache by key $isExisted = apcu_exists[$cacheKey]; // Saves data to the cache. Returns true if successful // The $ttl argument determines how long the cache will be stored [seconds] $isStored = apcu_store[$cacheKey, ['name' => 'Demo product'], $ttl]; // Retrieves data from the cache by key. If not, returns false $data = apcu_fetch[$cacheKey]; // Deletes data from the cache by key $isDeleted = apcu_delete[$cacheKey]; var_dump[[ 'is_enabled' => $isEnabled, 'is_existed' => $isExisted, 'is_stored' => $isStored, 'is_deleted' => $isDeleted, 'fetched_data' => $data, ]];
Như bạn có thể thấy, giao diện rất đơn giản và ngay cả các chức năng mà chúng tôi đã xem xét trong ví dụ cho APCU là đủ để viết dịch vụ bộ nhớ cache của bạn theo PSR-16. Nhưng tại sao nó lại cần thiết?
Ưu điểm chính của việc tuân thủ các tiêu chuẩn PSR:
- Chúng được hỗ trợ bởi các thư viện phổ biến nhất;
- Nhiều lập trình viên PHP tuân thủ PSR và sẽ dễ dàng làm quen với mã của bạn;
- Nhờ giao diện, chúng tôi có thể dễ dàng thay đổi dịch vụ được sử dụng cho bất kỳ hỗ trợ PSR-16.
Hãy xem xét kỹ hơn điểm cuối cùng và lợi ích của nó.
Việc sử dụng các thư viện PSR-16
Các thư viện tạo "trình bao bọc" trên các công cụ bộ nhớ đệm hiện có để phù hợp với giao diện được gọi là bộ điều hợp. Ví dụ, hãy xem xét các bộ điều hợp của các phương pháp mà chúng ta đã thảo luận:
- Bộ chuyển đổi APCU
- Bộ điều hợp mảng
- Bộ chuyển đổi Memcached
- Bộ điều hợp Redis
Tất cả đều thỏa mãn PSR-16 và do đó được áp dụng theo cùng một cách, nhưng mỗi người có logic riêng "dưới mui xe".
Để biết ví dụ về việc sử dụng, hãy tải APCU và bộ điều hợp mảng sử dụng trình soạn thảo vào dự án của chúng tôi.APCu and array adapters using composer into our project.
composer require cache/array-adapter
composer require cache/apcu-adapter
# Or
composer req cache/apcu-adapter cache/array-adapter
Nhập chế độ FullScreenen EXIT Mode FullScreen
Hãy tưởng tượng rằng chúng ta có một lớp đặc biệt để nhận sản phẩm từ cơ sở dữ liệu. Chúng ta hãy gọi nó là ProductStrepository, nó có một phương thức
$cacheKey = 'product_1';
$ttl = 600; // 10 minutes.
// Checking APCu availability
$isEnabled = apcu_enabled[];
// Checks if there is data in the cache by key
$isExisted = apcu_exists[$cacheKey];
// Saves data to the cache. Returns true if successful
// The $ttl argument determines how long the cache will be stored [seconds]
$isStored = apcu_store[$cacheKey, ['name' => 'Demo product'], $ttl];
// Retrieves data from the cache by key. If not, returns false
$data = apcu_fetch[$cacheKey];
// Deletes data from the cache by key
$isDeleted = apcu_delete[$cacheKey];
var_dump[[
'is_enabled' => $isEnabled,
'is_existed' => $isExisted,
'is_stored' => $isStored,
'is_deleted' => $isDeleted,
'fetched_data' => $data,
]];
6 trả về một sản phẩm bằng ID của nó và nếu không có sản phẩm như vậy, NULL.class ProductRepository
{
/**
* In order not to complicate the example, we will stipulate that
* an array is returned as a product, and if it is not, null
*/
public function find[int $id]: ?array
{
// ...
// Getting data from the database
return $someProduct;
}
}
Nhập chế độ FullScreenen EXIT Mode FullScreen
Hãy tưởng tượng rằng chúng ta có một lớp đặc biệt để nhận sản phẩm từ cơ sở dữ liệu. Chúng ta hãy gọi nó là ProductStrepository, nó có một phương thức
$cacheKey = 'product_1';
$ttl = 600; // 10 minutes.
// Checking APCu availability
$isEnabled = apcu_enabled[];
// Checks if there is data in the cache by key
$isExisted = apcu_exists[$cacheKey];
// Saves data to the cache. Returns true if successful
// The $ttl argument determines how long the cache will be stored [seconds]
$isStored = apcu_store[$cacheKey, ['name' => 'Demo product'], $ttl];
// Retrieves data from the cache by key. If not, returns false
$data = apcu_fetch[$cacheKey];
// Deletes data from the cache by key
$isDeleted = apcu_delete[$cacheKey];
var_dump[[
'is_enabled' => $isEnabled,
'is_existed' => $isExisted,
'is_stored' => $isStored,
'is_deleted' => $isDeleted,
'fetched_data' => $data,
]];
6 trả về một sản phẩm bằng ID của nó và nếu không có sản phẩm như vậy, NULL.use Psr\SimpleCache\CacheInterface;
class ProductDataProvider
{
private ProductRepository $productRepository;
private CacheInterface $cache;
public function __construct[ProductRepository $productRepository, CacheInterface $cache]
{
$this->productRepository = $productRepository;
$this->cache = $cache;
}
public function get[int $productId]: ?array
{
$cacheKey = sprintf['product_%d', $productId];
// Trying to get the product from the cache
$product = $this->cache->get[$cacheKey];
if [$product !== null] {
// If there is a product, we return it
// Temporarily output echo to understand that the data is from the cache
echo 'Data from cache' . PHP_EOL; // PHP_EOL is a line break
return $product;
}
// If there is no product, we get it from the repository
$product = $this->productRepository->find[$productId];
if [$product !== null] {
// Now we will save the received product to the cache for future requests
// Also temporarily output echo
echo 'Data from DB' . PHP_EOL;
$this->cache->set[$cacheKey, $product];
}
return $product;
}
}
Nhập chế độ FullScreenen EXIT Mode FullScreen
Hãy tưởng tượng rằng chúng ta có một lớp đặc biệt để nhận sản phẩm từ cơ sở dữ liệu. Chúng ta hãy gọi nó là ProductStrepository, nó có một phương thức
$cacheKey = 'product_1';
$ttl = 600; // 10 minutes.
// Checking APCu availability
$isEnabled = apcu_enabled[];
// Checks if there is data in the cache by key
$isExisted = apcu_exists[$cacheKey];
// Saves data to the cache. Returns true if successful
// The $ttl argument determines how long the cache will be stored [seconds]
$isStored = apcu_store[$cacheKey, ['name' => 'Demo product'], $ttl];
// Retrieves data from the cache by key. If not, returns false
$data = apcu_fetch[$cacheKey];
// Deletes data from the cache by key
$isDeleted = apcu_delete[$cacheKey];
var_dump[[
'is_enabled' => $isEnabled,
'is_existed' => $isExisted,
'is_stored' => $isStored,
'is_deleted' => $isDeleted,
'fetched_data' => $data,
]];
6 trả về một sản phẩm bằng ID của nó và nếu không có sản phẩm như vậy, NULL.use Cache\Adapter\Apcu\ApcuCachePool;
// Connect the Composer autoloader
require_once 'vendor/autoload.php';
// Our repository
$productRepository = new ProductRepository[];
// APCu-cache adapter. Does not require any additional settings
$cache = new ApcuCachePool[];
// Creating a provider, passing dependencies
$productDataProvider = new ProductDataProvider[
$productRepository,
$cache
];
// If there is such a product in the database, it will come back to us
$product = $productDataProvider->get[1];
var_dump[$product];
Nhập chế độ FullScreenen EXIT Mode FullScreen
Hãy tưởng tượng rằng chúng ta có một lớp đặc biệt để nhận sản phẩm từ cơ sở dữ liệu. Chúng ta hãy gọi nó là ProductStrepository, nó có một phương thức
$cacheKey = 'product_1';
$ttl = 600; // 10 minutes.
// Checking APCu availability
$isEnabled = apcu_enabled[];
// Checks if there is data in the cache by key
$isExisted = apcu_exists[$cacheKey];
// Saves data to the cache. Returns true if successful
// The $ttl argument determines how long the cache will be stored [seconds]
$isStored = apcu_store[$cacheKey, ['name' => 'Demo product'], $ttl];
// Retrieves data from the cache by key. If not, returns false
$data = apcu_fetch[$cacheKey];
// Deletes data from the cache by key
$isDeleted = apcu_delete[$cacheKey];
var_dump[[
'is_enabled' => $isEnabled,
'is_existed' => $isExisted,
'is_stored' => $isStored,
'is_deleted' => $isDeleted,
'fetched_data' => $data,
]];
6 trả về một sản phẩm bằng ID của nó và nếu không có sản phẩm như vậy, NULL.use Cache\Adapter\PHPArray\ArrayCachePool;
// ...
$productRepository = new ProductRepository[];
//$cache = new ApcuCachePool[];
$cache = new ArrayCachePool[];
$productDataProvider = new ProductDataProvider[
$productRepository,
$cache
];
// ...
Nhập chế độ FullScreenen EXIT Mode FullScreen
Hãy tưởng tượng rằng chúng ta có một lớp đặc biệt để nhận sản phẩm từ cơ sở dữ liệu. Chúng ta hãy gọi nó là ProductStrepository, nó có một phương thức $cacheKey = 'product_1';
$ttl = 600; // 10 minutes.
// Checking APCu availability
$isEnabled = apcu_enabled[];
// Checks if there is data in the cache by key
$isExisted = apcu_exists[$cacheKey];
// Saves data to the cache. Returns true if successful
// The $ttl argument determines how long the cache will be stored [seconds]
$isStored = apcu_store[$cacheKey, ['name' => 'Demo product'], $ttl];
// Retrieves data from the cache by key. If not, returns false
$data = apcu_fetch[$cacheKey];
// Deletes data from the cache by key
$isDeleted = apcu_delete[$cacheKey];
var_dump[[
'is_enabled' => $isEnabled,
'is_existed' => $isExisted,
'is_stored' => $isStored,
'is_deleted' => $isDeleted,
'fetched_data' => $data,
]];
6 trả về một sản phẩm bằng ID của nó và nếu không có sản phẩm như vậy, NULL.
$cacheKey = 'product_1';
$ttl = 600; // 10 minutes.
// Checking APCu availability
$isEnabled = apcu_enabled[];
// Checks if there is data in the cache by key
$isExisted = apcu_exists[$cacheKey];
// Saves data to the cache. Returns true if successful
// The $ttl argument determines how long the cache will be stored [seconds]
$isStored = apcu_store[$cacheKey, ['name' => 'Demo product'], $ttl];
// Retrieves data from the cache by key. If not, returns false
$data = apcu_fetch[$cacheKey];
// Deletes data from the cache by key
$isDeleted = apcu_delete[$cacheKey];
var_dump[[
'is_enabled' => $isEnabled,
'is_existed' => $isExisted,
'is_stored' => $isStored,
'is_deleted' => $isDeleted,
'fetched_data' => $data,
]];
Nếu chúng tôi muốn bật bộ đệm, chúng tôi không nên thực hiện nó bên trong kho lưu trữ, vì trách nhiệm của nó là trả lại dữ liệu từ cơ sở dữ liệu. Chúng ta sẽ thêm bộ đệm ở đâu? Có một số giải pháp phổ biến, đơn giản nhất là một lớp nhà cung cấp bổ sung. Tất cả những gì anh ta sẽ làm là cố gắng lấy dữ liệu từ bộ đệm và nếu nó không thành công, anh ta sẽ liên hệ với kho lưu trữ. Để làm điều này, chúng tôi sẽ xác định hai phụ thuộc vào hàm tạo của một lớp đó - kho lưu trữ của chúng tôi và
# Windows
extension=php_apcu.dll
extension=php_apcu_bc.dll
apc.enabled=1
apc.enable_cli=1
#Linux / MacOS
extension="apcu.so"
extension="apc.so"
apc.enabled=1
apc.enable_cli=1
5. Tại sao giao diện? Bởi vì chúng tôi sẽ có thể sử dụng hoàn toàn bất kỳ bộ điều hợp nào được đề cập hoặc các lớp khác đáp ứng PSR-16.Lớp học của chúng tôi đã sẵn sàng. Bây giờ chúng ta hãy xem ứng dụng của nó kết hợp với bộ chuyển đổi APCU.
- Nếu chúng tôi muốn thay thế bộ đệm APCU bằng bộ điều hợp mảng hoặc bất kỳ cách tiếp cận nào khác, thay vào đó chúng tôi sẽ chuyển nó cho nhà cung cấp, vì tất cả đều thực hiện
5.# Windows extension=php_apcu.dll extension=php_apcu_bc.dll apc.enabled=1 apc.enable_cli=1 #Linux / MacOS extension="apcu.so" extension="apc.so" apc.enabled=1 apc.enable_cli=1
- Điều kiện cuộc đua và cập nhật dữ liệu
- Bộ nhớ cache hoạt động miễn là chúng tôi cập nhật nó. Điều này có nghĩa là nếu người dùng muốn cập nhật sản phẩm, nó phải được cập nhật cả trong cơ sở dữ liệu và trong bộ đệm của chúng tôi. Tuy nhiên, có một sắc thái quan trọng ở đây.
- Hãy tưởng tượng rằng dự án của chúng tôi được sử dụng bởi một số lượng rất lớn người dùng. Và hai trong số họ cập nhật cùng một thực thể cùng một lúc. Trong trường hợp này, tình huống sau đây có thể xảy ra:
- Người dùng 1 đã nhận được một thực thể từ bộ đệm
- Người dùng 1 đã cập nhật thực thể trong DB
Người dùng 2 có thực thể từ bộ đệm
Người dùng 1 đã cập nhật dữ liệu trong bộ đệm
Người dùng 2 đã cập nhật thực thể trong cơ sở dữ liệu nhưng ghi đè lên dữ liệu cũ vì thực thể không liên quan tại thời điểm nhận
và như thế...
class ProductDataProvider
{
// ...
public function get[int $productId, bool $fromCache = true]: ?array
{
$cacheKey = sprintf['product_%d', $productId];
$product = $fromCache
? $this->cache->get[$cacheKey]
: null;
if [$product !== null] {
return $product;
}
$product = $this->productRepository->find[$productId];
if [$product !== null] {
$this->cache->set[$cacheKey, $product];
}
return $product;
}
}
Nhập chế độ FullScreenen EXIT Mode FullScreen
Hãy tưởng tượng rằng chúng ta có một lớp đặc biệt để nhận sản phẩm từ cơ sở dữ liệu. Chúng ta hãy gọi nó là ProductStrepository, nó có một phương thức $cacheKey = 'product_1';
$ttl = 600; // 10 minutes.
// Checking APCu availability
$isEnabled = apcu_enabled[];
// Checks if there is data in the cache by key
$isExisted = apcu_exists[$cacheKey];
// Saves data to the cache. Returns true if successful
// The $ttl argument determines how long the cache will be stored [seconds]
$isStored = apcu_store[$cacheKey, ['name' => 'Demo product'], $ttl];
// Retrieves data from the cache by key. If not, returns false
$data = apcu_fetch[$cacheKey];
// Deletes data from the cache by key
$isDeleted = apcu_delete[$cacheKey];
var_dump[[
'is_enabled' => $isEnabled,
'is_existed' => $isExisted,
'is_stored' => $isStored,
'is_deleted' => $isDeleted,
'fetched_data' => $data,
]];
6 trả về một sản phẩm bằng ID của nó và nếu không có sản phẩm như vậy, NULL.
$cacheKey = 'product_1';
$ttl = 600; // 10 minutes.
// Checking APCu availability
$isEnabled = apcu_enabled[];
// Checks if there is data in the cache by key
$isExisted = apcu_exists[$cacheKey];
// Saves data to the cache. Returns true if successful
// The $ttl argument determines how long the cache will be stored [seconds]
$isStored = apcu_store[$cacheKey, ['name' => 'Demo product'], $ttl];
// Retrieves data from the cache by key. If not, returns false
$data = apcu_fetch[$cacheKey];
// Deletes data from the cache by key
$isDeleted = apcu_delete[$cacheKey];
var_dump[[
'is_enabled' => $isEnabled,
'is_existed' => $isExisted,
'is_stored' => $isStored,
'is_deleted' => $isDeleted,
'fetched_data' => $data,
]];
Nếu chúng tôi muốn bật bộ đệm, chúng tôi không nên thực hiện nó bên trong kho lưu trữ, vì trách nhiệm của nó là trả lại dữ liệu từ cơ sở dữ liệu. Chúng ta sẽ thêm bộ đệm ở đâu? Có một số giải pháp phổ biến, đơn giản nhất là một lớp nhà cung cấp bổ sung. Tất cả những gì anh ta sẽ làm là cố gắng lấy dữ liệu từ bộ đệm và nếu nó không thành công, anh ta sẽ liên hệ với kho lưu trữ. Để làm điều này, chúng tôi sẽ xác định hai phụ thuộc vào hàm tạo của một lớp đó - kho lưu trữ của chúng tôi và
# Windows
extension=php_apcu.dll
extension=php_apcu_bc.dll
apc.enabled=1
apc.enable_cli=1
#Linux / MacOS
extension="apcu.so"
extension="apc.so"
apc.enabled=1
apc.enable_cli=1
5. Tại sao giao diện? Bởi vì chúng tôi sẽ có thể sử dụng hoàn toàn bất kỳ bộ điều hợp nào được đề cập hoặc các lớp khác đáp ứng PSR-16.Lớp học của chúng tôi đã sẵn sàng. Bây giờ chúng ta hãy xem ứng dụng của nó kết hợp với bộ chuyển đổi APCU.
Nếu chúng tôi muốn thay thế bộ đệm APCU bằng bộ điều hợp mảng hoặc bất kỳ cách tiếp cận nào khác, thay vào đó chúng tôi sẽ chuyển nó cho nhà cung cấp, vì tất cả đều thực hiện
# Windows
extension=php_apcu.dll
extension=php_apcu_bc.dll
apc.enabled=1
apc.enable_cli=1
#Linux / MacOS
extension="apcu.so"
extension="apc.so"
apc.enabled=1
apc.enable_cli=1
5.- Điều kiện cuộc đua và cập nhật dữ liệu
- Bộ nhớ cache hoạt động miễn là chúng tôi cập nhật nó. Điều này có nghĩa là nếu người dùng muốn cập nhật sản phẩm, nó phải được cập nhật cả trong cơ sở dữ liệu và trong bộ đệm của chúng tôi. Tuy nhiên, có một sắc thái quan trọng ở đây.
- Đối với tất cả các công cụ bộ nhớ đệm tương thích PHP, một số bộ điều hợp có thể được xem trên trang web php-cache.com;
- Bộ nhớ đệm là một trách nhiệm riêng biệt. Cố gắng thực hiện làm việc với bộ đệm trong các lớp riêng biệt;
- Nếu chúng ta sẽ cập nhật một thực thể, nó nên được lấy từ cơ sở dữ liệu. Nếu chúng ta chỉ cần một thực thể để xem, chúng ta có thể yêu cầu nó từ bộ đệm;
- Trong các dự án lớn, memcached hoặc redis được sử dụng để có khả năng mở rộng quy mô.