2012-05-29 28 views
9

Giả sử tôi có một thực thể được gọi là Product và thực thể này được tải mỗi khi người dùng truy cập trang thông tin sản phẩm. Thông thường tôi sẽ lưu đối tượng trong Zend_Cache (memcache) trong một giờ để tránh nhấn db cho mỗi yêu cầu nhưng theo như tôi hiểu thì không thể thực hiện được với các thực thể Doctrine2 vì các đối tượng Proxy.Lưu một thực thể doctrine2 vào bộ nhớ cache để tăng tốc độ tải trang

Vì vậy, câu hỏi của tôi là, làm cách nào để tránh tải cùng một thực thể khỏi cơ sở dữ liệu cho từng yêu cầu?

[EDIT]

tôi đã cố gắng sử dụng Doctrine, bộ nhớ cache như thế này

$categoryService = App_Service_Container::getService('\App\Service\Category'); 
    $cache = $categoryService->getEm()->getConfiguration()->getResultCacheImpl(); 
    $apple = $cache->fetch('apple'); 

Nhưng tôi nhận được lỗi sau

Cảnh báo: yêu cầu (App/Entity/Proxy/_ CG _ /App/Entity/Category.php) [function.require]: không mở được luồng: Không có tệp hoặc thư mục như vậy trong /opt/vhosts/app/price/library/Doctrine/Common/ClassLoader.php trên dòng 163

này là giống nhau cho Zend cache cũng như bạn không thể sắp đặt từng thực thể vì lớp Proxy

Trả lời

3

bạn đã có một vài lựa chọn:

  1. Sử dụng Học thuyết của built-in result caching
  2. Hãy thử chỉ thực thể gắn bó trong memcache thông qua Zend_Cache. Khi bạn kéo nó ra, bạn có thể cần phải hợp nhất() Sản phẩm trở lại EM để proxy có thể bị hủy bỏ. Nếu bạn nạp-tham gia bất kỳ hiệp hội bạn cần để hiển thị thông tin sản phẩm, và bạn chỉ làm đọc, shoudl này hoạt động tốt.
  3. Không cache thực thể nào cả. Bộ nhớ cache bất kỳ đầu ra bạn tạo ra để thay thế.

EDIT: Nếu bạn không quan tâm đến chi phí hydrat hóa, bạn đang sử dụng mysql, và các sản phẩm của bạn và các bảng có liên quan không thay đổi rất thường xuyên, bạn có thể muốn chỉ dựa trên truy vấn mySQL bộ nhớ cache. Đó là một đối tượng khá cùn, nhưng đủ hữu ích để đề cập đến.

+0

1. Để làm việc này, tôi cần ghi đè lên các phương thức lưu trữ như 'find',' findBy * ', phải không? 2. Vui lòng xem chỉnh sửa của tôi. – Optimus

0

Tôi thấy điều này cực kỳ lạ vì tôi chỉ rối tung xung quanh với bản thân mình và không có bất kỳ vấn đề nào với đối tượng proxy được lưu trữ trong cơ sở dữ liệu. Vì vậy, im đoán cấu hình của bạn không được thiết lập 100%?

Nếu bạn tìm thấy vấn đề với cấu hình của mình, hãy lưu ý những gì timdev đã nói bạn PHẢI hợp nhất đối tượng trở lại EntityManager nếu không bạn sẽ gặp lỗi lạ.

Giải pháp thứ tư có sẵn cho bạn cũng là truy xuất dữ liệu dưới dạng mảng thay vì đối tượng, nhưng tất nhiên bạn sẽ mất tất cả chức năng được kết nối với mô-đun của bạn.

0

Dường như với tôi giống lỗi cấu hình hơn.Hoặc Proxy chưa được tạo hoặc có điều gì đó sai với thư mục proxy và không gian tên.

Tùy thuộc vào cấu hình của bạn, proxy có thể được tạo tự động hoặc thủ công. Các proxy của bạn có thực sự được tạo dưới App/Entity/Proxy không? Đây có thực sự là thư mục phù hợp không?

FYI proxy có thể được tự tạo ra bằng cách thực hiện doctrine orm:generate-proxies <dest-dir>

1

Bạn có thể muốn thử thực hiện __sleep hoặc __wakeup phương thức của lớp thực thể của bạn, như Học thuyết 2 có yêu cầu đặc biệt và những hạn chế liên quan đến serialization/deserialization của đơn vị (đó là những gì xảy ra khi lưu trữ chúng trong Zend_Cache).

0

Thứ hai những gì timdev nói: Doctrine đã tích hợp bộ nhớ đệm, bạn muốn sử dụng nó.

Tôi cũng tự hỏi câu hỏi của bạn nếu bạn gặp phải bất kỳ vấn đề về hiệu suất nào hoặc nếu bạn là nạn nhân của việc tối ưu hóa quá háo hức.

Các vấn đề liên quan