Hướng dẫn php cache data in memory - dữ liệu bộ nhớ đệm php trong bộ nhớ

Tôi đang tìm kiếm bộ nhớ cache/hashtable trong bộ nhớ nhanh nhất có sẵn cho PHP.

Show

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

Hướng dẫn php cache data in memory - dữ liệu bộ nhớ đệm php trong bộ nhớ

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.

Hướng dẫn php cache data in memory - dữ liệu bộ nhớ đệm php trong bộ nhớ

Đã trả lời ngày 5 tháng 9 năm 2011 lúc 14:31Sep 5, 2011 at 14:31

Hướng dẫn php cache data in memory - dữ liệu bộ nhớ đệm php trong bộ nhớ

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: http://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

Hướng dẫn php cache data in memory - dữ liệu bộ nhớ đệm php trong bộ nhớ

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.

Hướng dẫn php cache data in memory - dữ liệu bộ nhớ đệm php trong bộ nhớ

Nếu bạn chưa cài đặt APCU, bạn có thể thực hiện theo cách sau:

  1. 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)
  2. 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
    
    3
  3. 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
    
  4. 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

  5. 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
3

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

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:
    # 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
    
    3
  • 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ó.
  • $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,
    ]);
    
    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.

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.

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.
  • 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.

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ô.

Làm thế nào để php lưu trữ dữ liệu trong bộ đệm?

so với chúng tôi khai báo một biến của $ cache_file và kiểm tra xem tệp có tồn tại hay không. Vì vậy, ngay lần đầu tiên, điều này không tồn tại, vì vậy chúng tôi tìm nạp tất cả các bản ghi từ cơ sở dữ liệu và lưu trữ trong $ cache_file của chúng tôi bằng cách sử dụng các chức năng tệp được xác định trước.fetch all records from database and store in our $cache_file by using predefined file functions.

Bộ nhớ bộ nhớ cache trong PHP là gì?

Bộ đệm là một tập hợp các dữ liệu trùng lặp, trong đó dữ liệu gốc đắt tiền để tìm nạp hoặc tính toán (thường là theo thời gian truy cập) so với bộ đệm.Trong PHP, bộ nhớ đệm được sử dụng để giảm thiểu thời gian tạo trang.a collection of duplicate data, where the original data is expensive to fetch or compute (usually in terms of access time) relative to the cache. In PHP, caching is used to minimize page generation time.

PHP có được bộ nhớ cache không?

PHP tự nó không làm bộ nhớ đệm.Nhưng có các khung OpenSource để cho phép lập trình thiết kế mã của họ hoạt động theo cách này.Nói cách khác, nó cho phép kiểm tra mã nếu dữ liệu đã được truy xuất trước khi nó đi và tìm nạp lại, đây là một quá trình tương đối chậm vì nó phải truy vấn cơ sở dữ liệu.. But there are opensource frameworks to let the programmer design their code to work this way. In other words, it lets the code check if the data has already been retrieved before it goes and fetches it again, which is a relatively slow process since it has to query the database.

Redis có nhanh hơn bộ đệm tệp không?

Các lần đọc tệp được lưu trữ bởi hệ điều hành hệ điều hành, vì vậy chúng là các hoạt động truyền bộ nhớ nhanh giữa kernel và Python.Không có đĩa I/O liên quan ở đây.Với Redis, bạn phải trả chi phí cho các vòng tròn, vì vậy nó chậm hơn nhiều.it is much slower.