2012-01-17 25 views
40

Tôi cần lưu vào bộ nhớ cache một số dữ liệu cụ thể của ứng dụng bằng cách sử dụng hệ thống bộ nhớ đệm của Symfony 2 để tôi có thể chạy cache:clear để xóa nó. Tất cả bộ nhớ cache đều dựa trên app/cache nhưng làm cách nào để tôi thực sự truy cập dữ liệu bộ nhớ đệm?Làm thế nào để cache trong Symfony 2?

http://symfony.com/doc/current/cookbook/index.html

Các chủ đề duy nhất tôi thấy là về HTML bộ nhớ đệm với Varnish.

+0

Symfony2 cũng có thể thực hiện việc lưu bộ nhớ đệm này trong quá trình cài đặt ESI. Nó có thể có vẻ hơi phức tạp lúc đầu, nhưng nó làm cho các bước để mở rộng quy mô với Varnish nhỏ hơn nhiều. –

+0

@ Louis-PhilippeHuberdeau Tôi quan tâm đến việc lưu vào bộ nhớ cache dữ liệu cụ thể của ứng dụng, không phải mẫu/HTML. – Tower

Trả lời

77

Nếu bạn đang sử dụng Doctrine đã chỉ sử dụng các lớp bộ nhớ cache đó.

Thêm một dịch vụ để config.yml:

services: 
    cache: 
     class: Doctrine\Common\Cache\ApcCache 

Và sử dụng nó trong điều khiển của bạn:

if ($fooString = $this->get('cache')->fetch('foo')) { 
    $foo = unserialize($fooString); 
} else { 
    // do the work 
    $this->get('cache')->save('foo', serialize($foo)); 
} 
+20

Nếu tôi không sử dụng Doctrine thì sao? Tại sao phần này của Giáo Lý? – Tower

+2

@Tower Vẫn không có câu trả lời cho điều này? – ChocoDeveloper

+1

@Tower Câu trả lời có vẻ là Doctrine cần thành phần này và tạo ra một thành phần tốt để Symfony2 không tái tạo lại nó, nhưng chúng không tách nó thành một kho lưu trữ khác, vì vậy chúng ta đang ở đây. – ChocoDeveloper

0

Không có bộ nhớ cache một phần trong Symfony2, bộ nhớ đệm tích hợp chỉ có đầy đủ HTTP. Bạn phải sử dụng proxy ngược và nếu bạn chỉ muốn lưu một đoạn mã, bạn phải sử dụng ESI. Nó có thể làm việc nhiều hơn với symfony 1 nhưng những màn trình diễn đáng giá.

Dù sao, không có gì ngăn cản bạn sử dụng một memcached và lưu trữ một số nội dung trong đó, nhìn at this Bundle tức Nếu như tình trạng câu hỏi của bạn nó, bạn chỉ có dữ liệu để lưu trữ, đó là hoàn hảo (và một bộ nhớ cache memcache là nhanh hơn nhiều so với một hệ thống tập tin một).

+3

Tôi quan tâm đến việc lưu vào bộ nhớ cache dữ liệu cụ thể của ứng dụng, như kết quả tính toán đắt tiền, v.v. Tôi đã lưu bộ nhớ đệm trên APC, nhưng điểm của việc có 2 hệ thống bộ nhớ cache khác nhau là gì? Tôi cũng cần phải xóa hai bộ đệm ngay bây giờ, mặc dù tôi đã thực hiện một lệnh của riêng mình mà xóa cả hai, nhưng vẫn còn. – Tower

+0

Người ta nói APC không nên được sử dụng để lưu dữ liệu vào bộ nhớ đệm (như từ DB) khi nó được sử dụng làm bộ nhớ cache opcode, vì nó ảnh hưởng đến hiệu suất của nó. Có một lý do tại sao để sử dụng bộ nhớ cache riêng biệt để lưu trữ dữ liệu tùy chỉnh. – forsberg

32

đơn giản cách sử dụng Học thuyết các nhà cung cấp bộ nhớ cache. Lúc đầu, đăng ký dịch vụ (mẫu trong config.yml):

services: 
    memcached: 
     class: Memcached 
     calls: 
      - [ addServer, ['localhost', 11211] ] 
    memcached_cache: 
     class: Doctrine\Common\Cache\MemcachedCache 
     calls: 
      - [ setMemcached, [@memcached] ] 

Sau đó, để sử dụng được dịch vụ, ví dụ như trong ứng dụng điều khiển:

$cache = $this->get('memcached_cache'); 

gửi trong một sử dụng dịch vụ gọi :

calls: 
    - [ setCacheProvider, [@memcached_cache] ] 

hoặc đối số:

arguments: 
    - @memcached_cache 

Tương tự, bạn có thể sử dụng các giao diện khác của gói Doctrine Cache. thuyết cache cung cấp một giao diện rất đơn giản mà nhiều ra khỏi hiện thực hộp được cung cấp:

  • ApcCache (yêu cầu ext/APC)
  • ArrayCache (trong bộ nhớ, tuổi thọ của các yêu cầu)
  • FilesystemCache (không tối ưu cho đồng thời cao)
  • MemcacheCache (yêu cầu ext/memcache)
  • MemcachedCache (yêu cầu ext/memcached)
  • PhpFileCache (không tối ưu cho concurrenc cao y)
  • RedisCache.php (yêu cầu ext/phpredis)
  • WinCacheCache.php (yêu cầu ext/wincache)
  • XcacheCache.php (yêu cầu ext/xcache)
  • ZendDataCache.php (yêu cầu Zend Server vBulletin)

Nếu bạn chưa sử dụng Doctrine, bạn có thể yêu cầu Thư viện chung cho các dự án học thuyết: php composer.phar require doctrine/common hoặc chỉ yêu cầu Caching thư viện cung cấp một API hướng đối tượng cho nhiều backends bộ nhớ cache: php composer.phar require doctrine/cache

Làm thế nào để sử dụng Doctrine Caching bạn có thể đọc trong Doctrine Common documentation trên Doctrine Project web site

+0

cảm ơn bạn rất nhiều vì câu trả lời này, nó cuối cùng cũng hoạt động, tôi vừa gặp một chút lỗi với YAML , có vẻ như @memcached yêu cầu trích dẫn - [setMemcached, ['@memcached']] (Tôi đang sử dụng symfony 3.0) – ThomasP1988

8

Symfony2 không cung cấp bất kỳ thành phần nào cho bộ nhớ đệm lớp ứng dụng.

Giống như bạn đã được nói, bạn có thể sử dụng bộ nhớ đệm Học thuyết chung thư viện http://docs.doctrine-project.org/projects/doctrine-common/en/latest/reference/caching.html

Nếu bạn muốn một cái gì đó cao cấp hơn, bạn cũng có thể sử dụng một trong các gói bộ nhớ cache được cung cấp bởi cộng đồng. Ví dụ: https://github.com/TheBigBrainsCompany/TbbcCacheBundle#cachebundle cung cấp các công cụ cho chiến lược lưu vào bộ nhớ cache tốt.

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