2008-11-01 30 views
9

Tại nơi làm việc chúng tôi làm hầu hết mọi thứ trong Java và perl, nhưng tôi muốn xây dựng một tính năng bằng cách sử dụng PHP và các phiên. Một số peeps nghĩ rằng đó là một ý tưởng tồi để cố gắng làm các phiên PHP trên hệ thống của chúng tôi, vì nó được phân phối cho nhiều máy chủ. Vấn đề cụ thể sẽ là gì?Các phiên PHP có khó mở rộng trên một hệ thống phân tán không?

Trả lời

4

Câu trả lời cho câu hỏi cụ thể của bạn, vấn đề là gì, nằm trong thực tế là theo mặc định, PHP lưu các phiên của nó trong các tệp trên hệ thống tệp. Đối với một yêu cầu phân phát máy chủ web, đây không phải là vấn đề vì dữ liệu phiên của bạn sẽ luôn có sẵn. Nhưng nếu bạn có hai máy chủ web cân bằng tải phục vụ yêu cầu thì sao?

Hãy tưởng tượng nhấn máy chủ web đầu tiên với yêu cầu, tạo tệp phiên của bạn trên hệ thống tệp của nó. Sau đó, yêu cầu tiếp theo của bạn sẽ truy cập vào máy chủ web thứ hai. Dĩ nhiên, máy chủ web thứ hai sẽ không thấy tệp phiên. Đối với người dùng, bạn có thể đăng nhập vào một trang web, và sau đó đột nhiên bị đăng xuất.

Đây không phải là vấn đề cụ thể đối với PHP và rất phổ biến. Giải pháp là lưu trữ dữ liệu phiên trong một số khu vực chung. Phương pháp phổ biến nhất cho việc này là lưu dữ liệu phiên trong cơ sở dữ liệu có thể truy cập được vào tất cả các máy chủ web hoặc một số máy chủ bộ nhớ cache được chia sẻ như memcached.

+0

Như @azkotoki đề cập bên dưới, một phân vùng được chia sẻ giống như một NFS gắn kết NAS cũng hoạt động tốt. Điều tốt đẹp về điều này là nó không liên quan đến thay đổi mã. Chỉ cần symlink thư mục session cục bộ vào NFS. – gerard

+0

nhưng nếu miền nằm trong các trung tâm dữ liệu riêng biệt thì sao? – Dannyboy

4

Các phiên liên tục trên một số máy chủ (còn được gọi là phân cụm phiên) là một vấn đề phổ biến cho việc mở rộng các ứng dụng web và không dành riêng cho PHP. PHP cung cấp một số giải pháp để xử lý nó, chẳng hạn như Zend Platform (máy chủ ứng dụng thương mại) và Msession (tiện ích mở rộng).

10

Bạn cũng có thể sử dụng một phiên tùy chỉnh tiết kiệm handler:

http://www.php.net/manual/en/function.session-set-save-handler.php

Tôi chưa bao giờ thử nó, nhưng với nó, bạn định nghĩa của riêng bạn lưu/đọc chức năng, do đó bạn có thể thực hiện một cơ sở dữ liệu hoặc một phụ trợ nfs được chia sẻ mà không cần cài đặt bất kỳ tiện ích mở rộng nào.

Ngoài ra Msession, được đề xuất bởi @Eran Galperin, trông rất thú vị như là một thay thế cho cái tôi đã đề cập trước đây.

+0

Đây là một câu trả lời tuyệt vời, và tôi sẽ sử dụng phương pháp này. Cảm ơn! – woody121

0

Khá một câu hỏi mơ hồ, nhưng tôi sẽ nói rằng vấn đề lớn hơn đề cập trong các câu trả lời. Chắc chắn bạn có thể ghi đè lên cách tải và lưu cookie, nhưng cũng có chi phí. Ví dụ: bạn sẽ phải xem xét các trường hợp/câu hỏi sau:

  • Nếu bạn đang đặt cookie trên máy chủ khác, điều này ảnh hưởng đến tốc độ cookie của bạn như thế nào? Điều đó rõ ràng phụ thuộc vào số lượng ghi/lần đọc bạn thực hiện.
  • Bạn đang thực hiện việc này để tăng tốc độ hay có chuyển đổi dự phòng? Câu trả lời chắc chắn sẽ dẫn đến các giải pháp khác nhau:
    • Trong trường hợp bạn làm điều này để chuyển đổi dự phòng, bạn sẽ xử lý như thế nào nếu (các) máy chủ web của bạn không thể truy cập vào lưu trữ phiên vì liên kết mạng bị hỏng? Điều gì xảy ra nếu cửa hàng phiên của bạn bị hỏng? Bạn sẽ phải giải quyết điều này bằng cách sử dụng một số loại bản sao chủ chính, có thể chạy phân phối phiên lưu trữ trên cùng một máy như máy chủ web cho tính sẵn sàng cao thêm (nếu tất cả các phiên có thể phù hợp trong bộ nhớ). Có một cái nhìn tại Riak hoặc tương tự cho nhân rộng master-master.
    • Trong trường hợp bạn chỉ đơn giản là làm điều này cho tốc độ, tôi sẽ sử dụng apache, nginx hoặc (nhanh nhất) haproxy chỉ đơn giản là làm cân bằng tải dựa trên địa chỉ IP của khách hàng. Bằng cách đó bạn không phải bận tâm với việc thiết lập một cửa hàng phiên phân phối. Chắc chắn, nếu một trong các trường hợp PHP của bạn bị gỡ xuống, người dùng của bạn sẽ mất cookie của họ, nhưng có thể đó không phải là vấn đề. Tuỳ bạn.
Các vấn đề liên quan