Sau khi chỉ giải quyết này bản thân mình thời gian gần đây (12 ngôn ngữ và đếm) trên một hệ thống sản xuất và đã gặp phải một số vấn đề hiệu suất lớn dọc theo con đường tôi sẽ đề nghị một hệ thống hybrid.
1) Lưu trữ chuỗi ngôn ngữ và bản dịch trong cơ sở dữ liệu - điều này sẽ giúp bạn dễ dàng tương tác với/cập nhật/xóa các mục cộng với sẽ là một phần trong các thói quen sao lưu bình thường của bạn.
2) Cache các ngôn ngữ thành các tệp phẳng trên máy chủ và vẽ các ngôn ngữ đó ra khi cần thiết để hiển thị trên trang.
Lợi ích ở đây rất nhiều - chủ yếu là nhanh! Tôi không phải đối phó với chi phí kết nối cho MySQL hoặc bất kỳ sự chậm trễ giao thông nào trong quá trình chuyển. (đặc biệt quan trọng nếu máy chủ DB của bạn không phải là localhost).
Điều này cũng sẽ làm cho nó rất dễ sử dụng.Lưu trữ dữ liệu từ cơ sở dữ liệu của bạn trong các tập tin như là một mảng serialized php và GZIP nội dung của tập tin để thu hẹp chi phí lưu trữ (điều này cũng làm cho nó nhanh hơn trong điểm chuẩn của tôi).
Ví dụ:
$lang = array(
'hello' => 'Hallo',
'good_morning' => 'Guten Tag',
'logout_message' = > 'We are sorry to see you go, come again!'
);
$storage_lang = gzcompress(serialize($lang));
// WRITE THIS INTO A FILE SUCH AS 'my_page.de'
Khi người dùng tải hệ thống của bạn cho lần đầu tiên làm một file_exists('/files/languages/my_page.de')
. Nếu tập tin tồn tại thì tải nội dung, un-gzip, và un-serialize và nó đã sẵn sàng để đi.
Ví dụ
$file_contents = get_contents('my_page.de');
$lang = unserialize(gzuncompress($file_contents));
Như bạn thấy bạn có thể làm cho bộ nhớ đệm cụ thể cho từng trang trong hệ thống giữ cho chi phí thậm chí còn nhỏ hơn và sử dụng phần mở rộng tập tin để biểu thị ngôn ngữ ... (my_page.en , my_page.de, my_page.fr)
Nếu tệp KHÔNG tồn tại thì truy vấn DB, tạo mảng của bạn, tuần tự hóa, gzip và ghi tệp bị thiếu - cùng lúc bạn vừa tạo xong mảng mà trang cần để tiếp tục hiển thị trang và mọi người đều hạnh phúc. Cuối cùng, điều này cho phép bạn xây dựng trong các trang cập nhật có thể truy cập được đối với người không lập trình nhưng bạn cũng kiểm soát thời điểm thay đổi xuất hiện bằng cách quyết định thời điểm xóa tệp bộ nhớ cache để hệ thống có thể xây dựng lại.
Cảnh báo và những cạm bẫy
Khi tôi giữ mọi thứ trong cơ sở dữ liệu trực tiếp, chúng tôi nhấn một số chậm YẾU khi giao thông của chúng tôi tăng vọt.
Cố gắng giữ chúng trong các mảng tệp phẳng chỉ gây ra nhiều rắc rối vì các bản cập nhật gây đau đớn và dễ bị lỗi.
Không GZIP nén nội dung của tệp bộ nhớ cache khiến hệ thống ngôn ngữ chậm hơn 20% trong điểm chuẩn của tôi.
Đảm bảo tất cả các trường cơ sở dữ liệu của bạn có chứa ngôn ngữ được đặt thành UTF8-general-ci (hoặc ít nhất một trong các tùy chọn UTF8, tôi thấy tốt nhất cho việc sử dụng của tôi). Nếu bạn không bạn sẽ không thể để lưu trữ các bộ ký tự phi unicode trong cơ sở dữ liệu của bạn (như Trung Quốc, Nhật Bản, vv)
Extension: Để đáp lại bình luận dưới đây, hãy chắc chắn để thiết lập cơ sở dữ liệu của bạn lập bảng với các chuỗi ngôn ngữ cấp trang.
id string page global
1 hello NULL 1
2 good_morning my_page.php 0
Bất cứ thứ gì xuất hiện trong đầu hoặc cuối trang có thể có một lá cờ toàn cầu mà sẽ được truy vấn trong mỗi tập tin bộ nhớ cache được tạo ra, nếu không truy vấn họ bằng cách trang để giữ cho hệ thống của bạn đáp ứng.
Trùng lặp. Xem http://stackoverflow.com/questions/2275270/whats-the-simplest-php-alternative-to-the-php-gettext-extension-which-can-be-sup http://stackoverflow.com/questions/2149116/php-localization-question –