2011-11-15 35 views
5

Tôi đang sử dụng cakephp để chạy một ứng dụng nhiều người thuê. Chỉ có 1 ví dụ của ứng dụng, sự khác biệt duy nhất là cơ sở dữ liệu mà mỗi ứng dụng kết nối. Ngoài ra, ứng dụng là giống hệt nhau.Cách ly bộ nhớ cache APC trong một thiết lập nhiều kích thước (cakephp)

thiết lập của tôi:

  1. Apache 2.2
  2. Php 5.3
  3. bánh 1.3.10
  4. máy chủ 2K3 Win

    Tôi có ứng dụng được triển khai dưới docroot apache (chỉ 1 phiên bản của ứng dụng đang chạy). Gần đây tôi đã chuyển từ Tệp thành bộ nhớ cache APC. Các tiền tố tệp để lưu vào bộ nhớ cache giống nhau cho cả hai ứng dụng. Sử dụng Apache Máy chủ ảo để quyết định ứng dụng nào sẽ đến. Tôi nhớ đệm tĩnh html/js/css/gif nhưng không php (thông qua mod_expires apache)

Vấn đề:

tôi nhận thấy rằng một số giá trị cache được nghĩa vụ phải được cung cấp cho APP 1 đã được hiển thị trong trình đơn thả xuống cho Ứng dụng 2.Tôi đã bị sốc khi thấy điều này xảy ra.

Tôi làm cách nào để thêm cách ly trong lớp bộ nhớ cache APC giữa các ứng dụng?

UPDATE: Vấn đề xảy ra ngay cả khi tôi tạo một bản sao mới của ứng dụng và đặt nó trong docroot riêng của mình !!!

UPDATE2

Kịch bản 1) 1 ví dụ mà có tất cả perm/comb

Nếu tôi có mã php như

if(client=="client1") { 
$options = array(opt1,opt2); 
}else if(client=="client2") { 
$options = array(opt3,opt4); 
} 

và mã này được chia sẻ bởi cả khách hàng 1 và khách hàng 2, bộ nhớ đệm APC sẽ ảnh hưởng như thế nào đến điều này?

Kịch bản 2) 2 Ví dụ mỗi tùy chỉnh cho mỗi khách hàng

client1.php 
$options = array(opt1,opt2); 

client2.php 
$options = array(opt3,opt4); 

cách thực hiện điều này ảnh hưởng đến APC bộ nhớ cache? Nếu tôi hiểu đúng, đối với Kịch bản 1, có thể kết hợp dữ liệu client1 với khách hàng 2 (rất xấu) Đối với kịch bản 2, miễn là tôi sử dụng các khóa bộ nhớ cache khác nhau, tôi có chắc chắn không bao giờ có một bản mix không?

Trả lời

1

Một cách có thể là:

  • sử dụng memcached thay vì APC cho người dùng của bạn
  • bind vhosts của bạn/lĩnh vực sở hữu IP
  • bắt đầu trường hợp memcache cho vhost của bạn (ví dụ:vhost1 = cổng 12345, vhost2 = cổng 12.346, ...)
  • thêm các quy tắc iptable rằng thả mỗi gói trên cổng memcache cụ thể mà không phù hợp với ip vhost của bạn cho cổng)

Vấn đề của bạn có vẻ là, php đó chạy như fastcgi, vì vậy mọi vhost sẽ nhận được cùng một quá trình php để chia sẻ bộ nhớ cache của họ. Bạn cần phải thiết lập php để chạy chỉ cho mỗi vhost (không biết cho những gì bạn phải tìm).

tôi sẽ thích phương pháp memcache vì:

  • memcache cho phép bạn tạo ra một cụm memcache
  • nó dễ dàng để tách máy chủ ứng dụng của bạn từ các máy chủ bộ nhớ đệm (ví rộng thats một cộng lớn)
  • bạn tách riêng bytecache khỏi bộ nhớ cache của người dùng
  • đúng cấu hình rất an toàn (vì iptables của nó rất đáng tin cậy
+0

Cảm ơn memcache cho mỗi IP: ý tưởng cổng, tuy nhiên bộ nhớ cache opcode thì sao? – aks

2

do tại sao:

  1. APC không biết gì về vhosts, ứng dụng hay khác "apache" mọi thứ.
  2. Điều này có nghĩa là mọi khóa bộ nhớ cache được chia sẻ giữa tất cả các vhost nếu apc được chia sẻ. (Mà bạn thường muốn).
  3. APC không có lớp cách ly riêng.

Cách giải quyết:

  1. cho mỗi ứng dụng mà họ sở hữu tiền tố cho các phím bộ nhớ cache. Điều này cho phép họ truy cập vào các khóa của từng khóa bộ nhớ cache của người dùng. (Dễ nhất)
  2. Làm theo quy trình làm việc của breiti với memcached nếu bạn cần sự cô lập thực sự. (Có lẽ là giải pháp tốt nhất)
  3. Bạn có thể xem xét chạy cho mỗi máy chủ ảo riêng lẻ một tệp PHP.ini duy nhất và một fcgiwrapper duy nhất (xem: http://chrisgilligan.com/wordpress/apc-cache-considerations-for-virtual-hosting-environments/). Tuy nhiên điều này có nghĩa là sự gia tăng sử dụng bộ nhớ. (Nếu bạn thực sự muốn giải pháp đó)
+0

Bạn có thể bình luận về update2 được không? – aks

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