2009-07-11 44 views
19

Tôi đã sử dụng hệ thống CodeIgniter trong một thời gian - nhưng it hasshort comings. Tôi biết ơn vì những gì nó dạy tôi, nhưng bây giờ tôi cần một thư viện cho một dự án phi mã hóa mới và vì vậy tôi đang tìm kiếm các ý tưởng về thư viện nào có điều đúng và không. Tôi có lẽ sẽ phải lấy các mảnh từ một số thư viện để có được mọi thứ tôi cần.Thư viện tốt nhất cho phiên PHP

Tôi vừa xem thư viện Kohana PHP session và tôi thích cách nó trả về cách PHP nguyên gốc khi sử dụng siêu $ _SESSION thay vì buộc thay đổi thành $ this-> phiên này để truy cập dữ liệu.

Ở mức độ nào, tôi muốn biết liệu có các thư viện phiên tốt khác không, tôi có thể đang rối tung. Có rất nhiều thứ phải được xử lý trong một phiên bên cạnh chức năng CRUD.

  • Hỗ trợ cho phiên dựa NON-cookie đi (ví dụ: Facebook hoặc uploaders Flash)
  • "Flash dữ liệu" mà chỉ kéo dài tải trang tiếp theo và sau đó là tính năng tự động loại bỏ.
  • Làm việc với $ _SESSION hoặc $ this-> session để các lập trình viên không phải thay đổi mã hiện có.
  • Hỗ trợ đặt id phiên mới (tức là session_id ('id mới')) trong trường hợp bạn muốn thay đổi id giữa chừng trên trang.
  • Lưu tất cả dữ liệu ở cuối yêu cầu trang thay vì thêm hoặc xóa dữ liệu mỗi lần (lưu các truy vấn DB bổ sung).
  • Hỗ trợ sử dụng tệp, cookie hoặc Cơ sở dữ liệu để lưu trữ. (hoặc memcached sẽ được tốt đẹp)
  • Cố gắng từ chối truy cập trong trường hợp có một phiên không tặc. (IP, useragent hoặc fingerprint)

Tôi đã dành một chút thời gian để thực hiện logic cho các thư viện phiên CodeIgniter và Kohana và tôi đã đưa ra những điều sau đây về cách bắt đầu và kết thúc phiên cho trang.

/************** 
** Kohana Sessions 
**************/ 
If not native file storage { 
    session_set_save_handler to the storage type (DB, cache, cookie...) 
} 

set the session_name() so php knows what cookie value to check 

start session 

/****** Saving ******/ 

session_write_close() which calls the given handler 


/************** 
** CI Sessions 
**************/ 

Try to read_session() -> { 
    session = Get cookie (if using cookies will also contain data) 

    if(database) { 
     session .= pull data from database 
    } 

    checks if valid... 

    $this->userdata = session data 

} else { 
    create a new one 
} 

/****** Saving ******/ 

session data is serialized either way 

if(cookie) { 
    save cookie with serialized data and params like "last_activity" 
} 
if(database) { 
    save serialized data in db and session in cookie 
} 
+0

+1. Điều này đã được trong tâm trí của tôi cho đôi khi bây giờ. Cảm ơn bạn đã trình bày chi tiết – andyk

Trả lời

5

Bạn đã xem Zend_Session chưa?

  • bạn có thể vượt qua các định danh phiên qua URL sử dụng cài đặt PHP
  • bạn có thể hết hạn biến phiên nhất định theo thời gian hoặc bằng bước nhảy (yêu cầu)
  • di cư vào các ứng dụng khác sẽ không được dễ dàng và tôi nghĩ nó không phải là rất tốt khi bạn mess với $_SESSION khi bạn sử dụng Zend_Session
  • Zend_Session có một phương pháp tiếp cận dựa trên adpater để lưu dữ liệu phiên. A save-handler cho DBs được bao gồm, nhưng kiến ​​trúc của nó cho phép xử lý tùy chỉnh được thông qua.
  • Zend_Session hỗ trợ trình xác nhận để kiểm tra tính hợp lệ của phiên. Ở đây chúng ta cũng có một kiến ​​trúc mở cho phép bạn truyền vào các đối tượng tùy chỉnh để xác thực.
  • bạn có thể khóa một phiên, aka làm cho nó read-only
  • bạn có thể ngăn chặn sự instantiation của nhiều trường hợp của không gian tên tương tự phiên
  • cộng với có nhiều điều để khám phá với Zend_Session như tái tạo id phiên, vấn đề nhớ-me-cookies, thu hồi nhớ-me-cookies và vv.
+0

Cảm ơn lời nhắc. Zend thường bao gồm tất cả các căn cứ của họ vì vậy nó là mã tuyệt vời để kiểm tra. Tuy nhiên, tại 10 tập tin chỉ dành cho một người xử lý phiên - tôi nghĩ rằng tôi sẽ kéo một số phần tốt hơn vì vậy tôi không mess bất cứ điều gì bằng văn bản của riêng tôi. Lớp phiên Zend dường như theo sát hơn với lớp Kohana bằng cách dựa vào trình xử lý phiên superglobal và thiết lập phiên làm việc $ - mà chắc chắn có vẻ giống như đúng cách để đi. – Xeoncross

3

Bạn có thể sử dụng điều này trong CI: EchoSession.

+0

Cảm ơn, nhưng như tôi đã nói điều này sẽ không được cho một dự án codeigniter. Trên thực tế, tôi đã tải xuống thư viện đó trong khi xem Zend_Session và nhiều thư viện phiên khác. Bằng cách xem xét mã từ mỗi mẫu, một mẫu sẽ bắt đầu nổi lên như những gì "thực hành tốt nhất" để xử lý phiên. – Xeoncross

3

Ok, Sau khi tìm kiếm thông qua lib tùy chỉnh, không phải $ _ SESSION dựa trên codeigniter, hai Kohana và Zend libs (sử dụng $ _SESSION), và một số thư viện phiên khác từ các dự án khác tôi tin rằng tôi xây dựng câu trả lời vấn đề của tôi. Một cái gì đó đáp ứng tất cả những điều tôi liệt kê ở trên (ngoại trừ dữ liệu flash).

Here is the code nếu có ai muốn sử dụng hoặc đọc trong khi xây dựng thư viện của riêng họ. Tôi để lại rất nhiều ý kiến ​​giải thích kỹ lưỡng toàn bộ điều và rất thích có một số phản hồi về nó. Nó hỗ trợ thẻ, trình tải lên dựa trên flash, cookie, khôi phục phiên mỗi 5 phút (hoặc bất kỳ thứ gì bạn đặt) bằng cách xóa phiên cũ và hỗ trợ lưu trữ phiên trong bất kỳ cơ sở dữ liệu nào, hệ thống tệp, memchache hoặc bất kỳ biểu mẫu nào khác mà bạn muốn bộ.

2

Có một cái nhìn Zebra_Session, a wrapper for PHP’s default session handling functions, using MySQL for storage

  • hoạt động như một wrapper cho các chức năng xử lý session mặc định của PHP, nhưng thay vì lưu trữ dữ liệu phiên trong các tập tin phẳng nó sẽ lưu chúng trong một cơ sở dữ liệu MySQL, cung cấp bảo mật tốt hơn và hiệu suất tốt hơn

  • nó là trình đơn thả xuống và dường như không thay thế cho trình xử lý phiên mặc định của PHP: các phiên PHP sẽ được sử dụng giống như trước khi sử dụng thư viện; bạn không cần thay đổi bất kỳ mã hiện có nào!

  • thực hiện khóa liên tiếp, đảm bảo dữ liệu được xử lý một cách chính xác trong các tình huống với nhiều đồng thời AJAX yêu cầu

  • một tập tin duy nhất

  • trưởng thành, tối ưu hóa cao và không ngừng phát triển

  • very good documentation