Điểm:0

Chia sẻ các thao tác nặng giữa nhiều phần tử trang

lá cờ cn

Tôi có một trang có hai thành phần trang riêng biệt. Một là biểu mẫu chọn bảng hiển thị danh sách dữ liệu nội dung mở rộng. Phần tử trang khác là một khối hiển thị tóm tắt về cùng nội dung đó.

Cả hai yếu tố thực sự sử dụng cùng một dữ liệu, khối tóm tắt chỉ cần biên dịch dữ liệu bảng thành tổng quan. Sử dụng lại dữ liệu là rất quan trọng vì các truy vấn cơ sở dữ liệu khá tốn kém.

Có cách nào để xây dựng trang để các khối có thể chia sẻ thông tin không? Ngay bây giờ cả hai phần tử trang đang chạy cùng một cuộc gọi cơ sở dữ liệu gây ra các truy vấn trùng lặp và tăng thời gian tải trang?

lá cờ cn
Một cách tiếp cận phổ biến là xác định một dịch vụ truy vấn dữ liệu và lưu trữ tĩnh các kết quả. Sau đó, cả hai khối đều sử dụng phương thức có liên quan từ dịch vụ đó, nhưng chỉ lần sử dụng đầu tiên mới phát sinh (các) lần truy cập DB. [`drupal_static`](https://api.drupal.org/api/drupal/core%21includes%21bootstrap.inc/function/drupal_static/9.2.x) rất hữu ích cho việc này
4uk4 avatar
lá cờ cn
Ngoài ra, thông thường những thứ bạn truy vấn trong cơ sở dữ liệu có thể được lưu trong bộ đệm giữa các yêu cầu. Bạn có thể đặt kết quả truy vấn vào ngăn bộ đệm, ví dụ `cache_default`, và gắn thẻ cho nó để nó bị vô hiệu hóa khi dữ liệu thay đổi trong cơ sở dữ liệu.
Rubix05 avatar
lá cờ cn
Ồ, tôi thậm chí còn không biết rằng drupal_static là một thứ. Tôi đã có sẵn các chức năng với một dịch vụ nên tôi có thể đưa drupal_static vào thực sự nhanh chóng.Tôi vẫn cần thực hiện thêm một số thử nghiệm, nhưng cho đến nay, đó dường như là chính xác những gì tôi cần. Cảm ơn!
4uk4 avatar
lá cờ cn
Nếu bạn đã có dịch vụ, bạn không cần drupal_static vì thuộc tính lớp của dịch vụ vẫn tồn tại trong toàn bộ yêu cầu.
Rainer Feike avatar
lá cờ in
Bên cạnh việc giải quyết vấn đề về hiệu suất đó bằng drupal hoặc php (giả sử về phía máy khách) - bạn sẽ có thể giải quyết vấn đề đó trong Phần phụ trợ DB của mình. Đối với các DB hiện đại chạy cùng một truy vấn nhiều lần, chỉ nên mở rộng lần đầu tiên. Thay vào đó, bạn nên tập trung vào client-side-cache như đã nêu trong Drupal Cache API https://www.drupal.org/docs/8/api/cache-api/cache-api. Và - theo mặc định - bộ đệm của Drupal cũng được lưu trữ trong DB - vì vậy bạn chỉ có thể tiết kiệm thời gian tính toán truy vấn chứ không tiết kiệm được băng thông.... Bộ nhớ đệm chưa bao giờ là dễ dàng.
Rainer Feike avatar
lá cờ in
Nhưng tôi đồng ý với 4k4 et.all. Nếu đó là tất cả trong cùng một yêu cầu, chỉ cần sử dụng một biến trong phạm vi yêu cầu (nhưng không phải nếu khối của bạn có ngữ cảnh khác thì trang của bạn).

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.