Symfony xóa bộ nhớ cache tất cả các môi trường

Trong nhật ký lỗi PHP của bạn, nằm ở /var/log/php-fpm/centreon-error. log bạn có thể tìm kiếm các loại nhật ký đó

 

[13-Jan-2022 09:19:02 Europe/Paris] CRITICAL: Uncaught Error: Class "Centreon\Domain\Security\AuthenticationService" not found {"exception":"[object] [Error[code: 0]: Class \"Centreon\\Domain\\Security\\AuthenticationService\" not found at /var/cache/centreon/symfony/ContainerKI6RUGx/getAuthenticationControllerService.php:9]"}

[13-Jan-2022 09:19:02 Europe/Paris] CRITICAL: Attempted to load class "AuthenticationService" from namespace "Centreon\Domain\Security". Did you forget a "use" statement for another namespace? {"context":"[object] [Symfony\\Component\\ErrorHandler\\Error\\ClassNotFoundError[code: 0]: Attempted to load class \"AuthenticationService\" from namespace \"Centreon\\Domain\\Security\".\nDid you forget a \"use\" statement for another namespace? at /var/cache/centreon/symfony/ContainerKI6RUGx/getAuthenticationControllerService.php:9]"}

Đầu mối cho chúng tôi biết bộ nhớ đệm có vấn đề là đường dẫn của tệp liên quan, tại đây

/var/cache/centreon/symfony/ContainerKI6RUGx/getAuthenticationControllerService.php

Thông thường, Centreon được cài đặt trong /usr/share/centreon, ở đây, lỗi xuất phát từ

var/cache/centreon/symfony/ContainerKI6RUGx/…

Chúng tôi có bộ đệm, chúng tôi có Symfony và thư mục Container kỳ quặc này. Nếu bạn thấy những loại nhật ký đó, 99% thời gian là bạn có bộ đệm không trống

 

Giải pháp

Sử dụng lệnh sau để xóa bộ đệm Symfony

sudo -u apache php /usr/share/centreon/bin/console cache:clear

Sau đó, bạn sẽ thấy phản hồi sau của lệnh

// Clearing the cache for the prod environment with debug false

 [ok] Cache for the "prod" environment [debug=false] was successfully cleared.

Bây giờ, nếu bạn làm mới Giao diện người dùng Centreon của mình hoặc cố gắng sử dụng API, mọi thứ sẽ trở lại bình thường.  

Chương 12 đã mô tả cách lưu trữ các phần của phản hồi hoặc toàn bộ phản hồi. Bộ đệm phản hồi dẫn đến cải thiện hiệu suất lớn và đây phải là một trong những cân nhắc tối ưu hóa đầu tiên của bạn. Nếu bạn muốn tận dụng tối đa hệ thống bộ đệm, hãy đọc thêm, vì phần này tiết lộ một số thủ thuật mà bạn có thể chưa nghĩ tới

18. 4. 1. Xóa các phần có chọn lọc của bộ đệm

Trong quá trình phát triển ứng dụng, bạn phải xóa bộ nhớ cache trong nhiều tình huống khác nhau

  • Khi bạn tạo một lớp mới. Việc thêm một lớp vào thư mục autoloading [một trong các thư mục
    // Clearing the cache for the prod environment with debug false

     [ok] Cache for the "prod" environment [debug=false] was successfully cleared.
    3 của dự án] là không đủ để symfony tự động tìm thấy nó trong môi trường không phát triển. Bạn phải xóa bộ đệm cấu hình tự động tải để symfony duyệt lại tất cả các thư mục của tệp
    // Clearing the cache for the prod environment with debug false

     [ok] Cache for the "prod" environment [debug=false] was successfully cleared.
    4 và tham chiếu vị trí của các lớp có thể tự động tải — bao gồm cả những lớp mới
  • Khi bạn thay đổi cấu hình trong sản xuất. Cấu hình chỉ được phân tích cú pháp trong yêu cầu đầu tiên trong quá trình sản xuất. Thay vào đó, các yêu cầu khác sử dụng phiên bản đã lưu trong bộ nhớ cache. Vì vậy, thay đổi về cấu hình trong môi trường sản xuất [hoặc bất kỳ môi trường nào tắt tính năng gỡ lỗi] sẽ không có hiệu lực cho đến khi bạn xóa phiên bản đã lưu trong bộ nhớ cache của tệp
  • Khi bạn sửa đổi mẫu trong môi trường đã bật bộ nhớ đệm mẫu. Các mẫu được lưu trong bộ nhớ cache hợp lệ luôn được sử dụng thay vì các mẫu hiện có trong quá trình sản xuất, vì vậy thay đổi mẫu sẽ bị bỏ qua cho đến khi bộ đệm mẫu bị xóa hoặc lỗi thời
  • Khi bạn cập nhật ứng dụng bằng lệnh
    // Clearing the cache for the prod environment with debug false

     [ok] Cache for the "prod" environment [debug=false] was successfully cleared.
    5. Trường hợp này thường bao gồm ba sửa đổi trước đó

Vấn đề với việc xóa toàn bộ bộ đệm là yêu cầu tiếp theo sẽ mất khá nhiều thời gian để xử lý vì bộ đệm cấu hình cần được tạo lại. Ngoài ra, các mẫu không được sửa đổi cũng sẽ bị xóa khỏi bộ đệm, làm mất lợi ích của các yêu cầu trước đó

Điều đó có nghĩa là bạn chỉ nên xóa các tệp bộ đệm thực sự cần được tạo lại. Sử dụng các tùy chọn của tác vụ

// Clearing the cache for the prod environment with debug false

 [ok] Cache for the "prod" environment [debug=false] was successfully cleared.
6 để xác định một tập hợp con các tệp bộ đệm cần xóa, như minh họa trong Liệt kê 18-14

Liệt kê 18-14 - Chỉ xóa các phần chọn lọc của bộ đệm

// Clear only the cache of the frontend application
> php symfony cache:clear frontend

// Clear only the HTML cache of the frontend application
> php symfony cache:clear frontend template

// Clear only the configuration cache of the frontend application
> php symfony cache:clear frontend config

Bạn cũng có thể xóa các tệp bằng tay trong thư mục

// Clearing the cache for the prod environment with debug false

 [ok] Cache for the "prod" environment [debug=false] was successfully cleared.
7 hoặc xóa các tệp bộ đệm mẫu một cách có chọn lọc khỏi hành động bằng phương pháp
require_once[dirname[__FILE__].'/../config/ProjectConfiguration.class.php'];
$configuration = ProjectConfiguration::getApplicationConfiguration['frontend', 'staging', false];
sfContext::createInstance[$configuration];

// Array of URLs to browse
$uris = array[
  '/foo/index',
  '/foo/bar/id/1',
  '/foo/bar/id/2',
  ...
];

$b = new sfBrowser[];
foreach [$uris as $uri]
{
  $b->get[$uri];
}
0, như được mô tả trong Chương 12

Tất cả các kỹ thuật này sẽ giảm thiểu tác động tiêu cực đến hiệu suất của bất kỳ thay đổi nào được liệt kê trước đó

Mẹo Khi bạn nâng cấp symfony, cache sẽ tự động bị xóa mà không cần can thiệp thủ công [nếu bạn đặt tham số

require_once[dirname[__FILE__].'/../config/ProjectConfiguration.class.php'];
$configuration = ProjectConfiguration::getApplicationConfiguration['frontend', 'staging', false];
sfContext::createInstance[$configuration];

// Array of URLs to browse
$uris = array[
  '/foo/index',
  '/foo/bar/id/1',
  '/foo/bar/id/2',
  ...
];

$b = new sfBrowser[];
foreach [$uris as $uri]
{
  $b->get[$uri];
}
1 thành
require_once[dirname[__FILE__].'/../config/ProjectConfiguration.class.php'];
$configuration = ProjectConfiguration::getApplicationConfiguration['frontend', 'staging', false];
sfContext::createInstance[$configuration];

// Array of URLs to browse
$uris = array[
  '/foo/index',
  '/foo/bar/id/1',
  '/foo/bar/id/2',
  ...
];

$b = new sfBrowser[];
foreach [$uris as $uri]
{
  $b->get[$uri];
}
2 trong
require_once[dirname[__FILE__].'/../config/ProjectConfiguration.class.php'];
$configuration = ProjectConfiguration::getApplicationConfiguration['frontend', 'staging', false];
sfContext::createInstance[$configuration];

// Array of URLs to browse
$uris = array[
  '/foo/index',
  '/foo/bar/id/1',
  '/foo/bar/id/2',
  ...
];

$b = new sfBrowser[];
foreach [$uris as $uri]
{
  $b->get[$uri];
}
3]

18. 4. 2. Tạo các trang được lưu trong bộ nhớ cache

Khi bạn triển khai một ứng dụng mới để sản xuất, bộ đệm mẫu trống. Bạn phải đợi người dùng truy cập trang một lần để trang này được đưa vào bộ đệm. Trong các triển khai quan trọng, chi phí xử lý trang không thể chấp nhận được và các lợi ích của bộ nhớ đệm phải có sẵn ngay khi yêu cầu đầu tiên được đưa ra

Giải pháp là tự động duyệt các trang của ứng dụng của bạn trong môi trường dàn dựng [trong đó cấu hình tương tự như cấu hình trong sản xuất] để tạo bộ đệm mẫu, sau đó chuyển ứng dụng có bộ đệm sang sản xuất

Để duyệt các trang một cách tự động, một tùy chọn là tạo tập lệnh trình bao xem qua danh sách các URL bên ngoài bằng trình duyệt [ví dụ như cuộn tròn]. Nhưng có một giải pháp tốt hơn và nhanh hơn. một lô symfony sử dụng đối tượng

require_once[dirname[__FILE__].'/../config/ProjectConfiguration.class.php'];
$configuration = ProjectConfiguration::getApplicationConfiguration['frontend', 'staging', false];
sfContext::createInstance[$configuration];

// Array of URLs to browse
$uris = array[
  '/foo/index',
  '/foo/bar/id/1',
  '/foo/bar/id/2',
  ...
];

$b = new sfBrowser[];
foreach [$uris as $uri]
{
  $b->get[$uri];
}
4, đã được thảo luận trong Chương 15. Đó là một trình duyệt nội bộ được viết bằng PHP [và được
require_once[dirname[__FILE__].'/../config/ProjectConfiguration.class.php'];
$configuration = ProjectConfiguration::getApplicationConfiguration['frontend', 'staging', false];
sfContext::createInstance[$configuration];

// Array of URLs to browse
$uris = array[
  '/foo/index',
  '/foo/bar/id/1',
  '/foo/bar/id/2',
  ...
];

$b = new sfBrowser[];
foreach [$uris as $uri]
{
  $b->get[$uri];
}
5 sử dụng để kiểm tra chức năng]. Nó lấy một URL bên ngoài và trả về một phản hồi, nhưng điều thú vị là nó kích hoạt bộ đệm mẫu giống như một trình duyệt thông thường. Vì nó chỉ khởi tạo symfony một lần và không đi qua lớp vận chuyển HTTP, nên phương thức này nhanh hơn rất nhiều

Liệt kê 18-15 cho thấy một tập lệnh bó ví dụ được sử dụng để tạo các tệp bộ đệm mẫu trong môi trường dàn dựng. Khởi chạy nó bằng cách gọi

require_once[dirname[__FILE__].'/../config/ProjectConfiguration.class.php'];
$configuration = ProjectConfiguration::getApplicationConfiguration['frontend', 'staging', false];
sfContext::createInstance[$configuration];

// Array of URLs to browse
$uris = array[
  '/foo/index',
  '/foo/bar/id/1',
  '/foo/bar/id/2',
  ...
];

$b = new sfBrowser[];
foreach [$uris as $uri]
{
  $b->get[$uri];
}
6

Liệt kê 18-15 - Tạo Bộ đệm Mẫu, trong

require_once[dirname[__FILE__].'/../config/ProjectConfiguration.class.php'];
$configuration = ProjectConfiguration::getApplicationConfiguration['frontend', 'staging', false];
sfContext::createInstance[$configuration];

// Array of URLs to browse
$uris = array[
  '/foo/index',
  '/foo/bar/id/1',
  '/foo/bar/id/2',
  ...
];

$b = new sfBrowser[];
foreach [$uris as $uri]
{
  $b->get[$uri];
}
7

require_once[dirname[__FILE__].'/../config/ProjectConfiguration.class.php'];
$configuration = ProjectConfiguration::getApplicationConfiguration['frontend', 'staging', false];
sfContext::createInstance[$configuration];

// Array of URLs to browse
$uris = array[
  '/foo/index',
  '/foo/bar/id/1',
  '/foo/bar/id/2',
  ...
];

$b = new sfBrowser[];
foreach [$uris as $uri]
{
  $b->get[$uri];
}

18. 4. 3. Sử dụng hệ thống lưu trữ cơ sở dữ liệu cho bộ nhớ đệm

Hệ thống lưu trữ mặc định cho template cache trong symfony là hệ thống tập tin. Các đoạn HTML hoặc các đối tượng phản hồi được tuần tự hóa được lưu trữ trong thư mục

// Clearing the cache for the prod environment with debug false

 [ok] Cache for the "prod" environment [debug=false] was successfully cleared.
7 của một dự án. Symfony đề xuất một cách khác để lưu trữ bộ đệm. một cơ sở dữ liệu SQLite. Cơ sở dữ liệu như vậy là một tệp đơn giản mà PHP vốn biết cách truy vấn rất hiệu quả

Để yêu cầu symfony sử dụng bộ nhớ SQLite thay vì bộ nhớ hệ thống tệp cho bộ đệm mẫu, hãy mở tệp

require_once[dirname[__FILE__].'/../config/ProjectConfiguration.class.php'];
$configuration = ProjectConfiguration::getApplicationConfiguration['frontend', 'staging', false];
sfContext::createInstance[$configuration];

// Array of URLs to browse
$uris = array[
  '/foo/index',
  '/foo/bar/id/1',
  '/foo/bar/id/2',
  ...
];

$b = new sfBrowser[];
foreach [$uris as $uri]
{
  $b->get[$uri];
}
9 và chỉnh sửa mục nhập
/var/cache/centreon/symfony/ContainerKI6RUGx/getAuthenticationControllerService.php
50 như sau

/var/cache/centreon/symfony/ContainerKI6RUGx/getAuthenticationControllerService.php
5

Lợi ích của việc sử dụng bộ lưu trữ SQLite cho bộ đệm mẫu là thao tác đọc và ghi nhanh hơn khi số lượng phần tử bộ đệm là quan trọng. Nếu ứng dụng của bạn sử dụng nhiều bộ nhớ đệm, thì các tệp bộ đệm mẫu sẽ nằm rải rác trong một cấu trúc tệp sâu; . Ngoài ra, việc xóa bộ đệm trên bộ lưu trữ hệ thống tệp có thể yêu cầu xóa nhiều tệp khỏi đĩa; . Với hệ thống lưu trữ SQLite, quá trình xóa bộ đệm dẫn đến một thao tác tệp duy nhất. xóa tệp cơ sở dữ liệu SQLite. Bất kể số lượng phần tử bộ đệm hiện được lưu trữ là bao nhiêu, hoạt động là tức thời

18. 4. 4. Bỏ qua Symfony

Có lẽ cách tốt nhất để tăng tốc symfony là bỏ qua nó hoàn toàn. . . điều này chỉ được nói một phần trong trò đùa. Một số trang không thay đổi và không cần phải được xử lý lại bởi khung theo mỗi yêu cầu. Bộ đệm mẫu đã có ở đây để tăng tốc độ phân phối các trang như vậy, nhưng nó vẫn phụ thuộc vào symfony

Một vài thủ thuật được mô tả trong Chương 12 cho phép bạn bỏ qua symfony hoàn toàn đối với một số trang. Cái đầu tiên liên quan đến việc sử dụng HTTP 1. 1 tiêu đề để yêu cầu proxy và trình duyệt máy khách tự lưu vào bộ nhớ cache của trang để chúng không yêu cầu lại lần sau khi cần trang. Cái thứ hai là bộ đệm siêu nhanh [được tự động hóa bởi trình cắm thêm

/var/cache/centreon/symfony/ContainerKI6RUGx/getAuthenticationControllerService.php
51], bao gồm lưu trữ một bản sao của phản hồi trong thư mục
/var/cache/centreon/symfony/ContainerKI6RUGx/getAuthenticationControllerService.php
52 và sửa đổi các quy tắc viết lại để Apache tìm kiếm phiên bản được lưu trong bộ nhớ đệm trước khi gửi yêu cầu tới

Cả hai phương pháp này đều rất hiệu quả, và ngay cả khi chúng chỉ áp dụng cho các trang tĩnh, chúng sẽ loại bỏ gánh nặng xử lý các trang này khỏi symfony, và sau đó máy chủ sẽ hoàn toàn sẵn sàng để xử lý các yêu cầu phức tạp

18. 4. 5. Lưu vào bộ nhớ đệm kết quả của lệnh gọi hàm

Nếu một hàm không dựa vào các giá trị nhạy cảm với ngữ cảnh cũng như tính ngẫu nhiên, thì việc gọi hàm đó hai lần với cùng các tham số sẽ trả về cùng một kết quả. Điều đó có nghĩa là cuộc gọi thứ hai rất có thể tránh được nếu kết quả đã được lưu trữ lần đầu tiên. Đó chính xác là những gì mà lớp

/var/cache/centreon/symfony/ContainerKI6RUGx/getAuthenticationControllerService.php
53 làm. Lớp này có một phương thức
/var/cache/centreon/symfony/ContainerKI6RUGx/getAuthenticationControllerService.php
54, phương thức này yêu cầu một mảng tham số có thể gọi được và làm đối số của nó. Khi được gọi, phương thức này tạo một hàm băm md5 với tất cả các đối số của nó và tìm trong bộ đệm để tìm khóa được đặt tên bởi hàm băm này. Nếu tìm thấy một khóa như vậy, hàm sẽ trả về kết quả được lưu trong bộ đệm. Nếu không,
/var/cache/centreon/symfony/ContainerKI6RUGx/getAuthenticationControllerService.php
53 thực thi chức năng, lưu kết quả vào bộ đệm và trả về. Vì vậy, lần thực hiện thứ hai của Liệt kê 18-16 sẽ nhanh hơn lần đầu tiên

Liệt kê 18-16 - Lưu vào bộ nhớ đệm kết quả của một hàm

sudo -u apache php /usr/share/centreon/bin/console cache:clear
2

Hàm tạo

/var/cache/centreon/symfony/ContainerKI6RUGx/getAuthenticationControllerService.php
53 mong đợi một đối tượng bộ đệm. Đối số đầu tiên của phương thức
/var/cache/centreon/symfony/ContainerKI6RUGx/getAuthenticationControllerService.php
54 phải là một đối số có thể gọi được, do đó, nó có thể là tên hàm, một mảng tên lớp và tên phương thức tĩnh hoặc một mảng gồm tên đối tượng và tên phương thức công khai. Đối với đối số khác của phương thức
/var/cache/centreon/symfony/ContainerKI6RUGx/getAuthenticationControllerService.php
54, đó là một mảng đối số sẽ được chuyển đến đối tượng có thể gọi được

Thận trọng Nếu bạn sử dụng một đối tượng bộ đệm dựa trên tệp như trong ví dụ, tốt hơn là cung cấp một thư mục bộ đệm trong thư mục

// Clearing the cache for the prod environment with debug false

 [ok] Cache for the "prod" environment [debug=false] was successfully cleared.
7, vì nó sẽ được tác vụ
// Clearing the cache for the prod environment with debug false

 [ok] Cache for the "prod" environment [debug=false] was successfully cleared.
6 tự động dọn sạch. Nếu bạn lưu trữ bộ đệm chức năng ở một nơi khác, nó sẽ không tự động bị xóa khi bạn xóa bộ đệm thông qua dòng lệnh

18. 4. 6. Lưu trữ dữ liệu trong máy chủ

Trình tăng tốc PHP cung cấp các chức năng đặc biệt để lưu trữ dữ liệu trong bộ nhớ để bạn có thể sử dụng lại dữ liệu đó trong các yêu cầu. Vấn đề là tất cả chúng đều có một cú pháp khác nhau và mỗi cách có cách thực hiện nhiệm vụ cụ thể của riêng nó. Các lớp cache của symfony trừu tượng hóa tất cả những khác biệt này và hoạt động với bất kỳ bộ tăng tốc nào bạn đang sử dụng. Xem cú pháp của nó trong Liệt kê 18-17

Liệt kê 18-17 - Sử dụng trình tăng tốc PHP để lưu trữ dữ liệu

sudo -u apache php /usr/share/centreon/bin/console cache:clear
6

Phương thức

sudo -u apache php /usr/share/centreon/bin/console cache:clear
21 trả về
sudo -u apache php /usr/share/centreon/bin/console cache:clear
22 nếu bộ nhớ đệm không hoạt động. Giá trị được lưu trong bộ nhớ cache có thể là bất kỳ thứ gì [một chuỗi, một mảng, một đối tượng]; . Phương thức
sudo -u apache php /usr/share/centreon/bin/console cache:clear
24 trả về
sudo -u apache php /usr/share/centreon/bin/console cache:clear
25 nếu biến được yêu cầu không tồn tại trong bộ đệm

Mẹo Nếu bạn muốn tìm hiểu sâu hơn về bộ nhớ đệm, hãy đảm bảo rằng bạn đã xem qua lớp

sudo -u apache php /usr/share/centreon/bin/console cache:clear
26. Nó cung cấp giao diện giống như các lớp bộ đệm khác và nó có thể giúp giảm tải cơ sở dữ liệu trên các ứng dụng cân bằng tải

Chủ Đề