2011-07-01 1 views
7

Tôi đang gặp sự cố trong xử lý phiên trong PHP (phiên bản 5.2.10). Tôi đang sử dụng các chức năng được đề cập dưới đây để đăng nhập, đăng xuất và xác thực phiên.Lỗi khi hủy phiên trong PHP

 
login() 
{ 
    session_set_cookie_params(0); 
    session_start(); 
    session_regenerate_id(true); 
    $_SESSION['user_id'] 
} 

validate_session() 
{ 
    session_set_cookie_params(0); 
    session_start(); 
    if (isset($_SESSION['user_id']) === FALSE) { 
     session_destroy(); 
     logout(); 
     header("Location: login_page"); 
    } 
} 

logout() 
{ 
    session_set_cookie_params(0); 
    session_start(); 
    $_SESSION = array(); 
    setcookie(session_name(), '', time() - 3600, '/'); 
    session_destroy(); 
} 

Mỗi trang đầu tiên thực hiện cuộc gọi đến hàm validate_session(). Nếu phiên không hợp lệ, nó sẽ chuyển hướng đến trang đăng nhập. Hàm login() được sử dụng để tạo phiên cho người dùng. Khi người dùng nhấp vào đăng xuất, chức năng đăng xuất() được gọi để hủy phiên.

Vấn đề là: ngẫu nhiên logout() chức năng ném cảnh báo:
Cảnh báo: session_destroy(): phiên hủy diệt đối tượng thất bại

Tôi nhận được cảnh báo này rất thường xuyên. Giống như trong số 20-30 cuộc gọi đăng xuất, tôi nhận được một lần. Có suy nghĩ gì không?

Tôi đang phát triển trên máy tính Windows XP.

Cập nhật: Các phiên được lưu trữ trong hệ thống tệp.
Đường dẫn: C: \ WINDOWS \ Temp

+1

Có vẻ như nó được một thời gian dài kể từ khi bạn đã chấp nhận bất kỳ câu trả lời trên stackoverflow .. –

+1

Vâng! Tôi đã không được rất tích cực trong stackoverflow. Và trong một số trường hợp tôi chưa có câu trả lời thỏa đáng. – Varun

+0

Hi Varun, Bạn có thể giải thích tại sao bạn sử dụng chuyến đi bằng trong so sánh đó không? Thông thường nếu (! Isset()) sẽ là đủ, tôi biết nó là ironclad hơn nhưng isset() nên chỉ bao giờ trở lại một boolean, Bạn có thực sự cần phải xác nhận loại của nó? Nó có lẽ là không có khả năng, nhưng có lẽ đó là đôi khi trở lại đúng khi nó không nên? – picus

Trả lời

0

Bạn đang lưu trữ phiên của mình bằng cách nào? Nếu nó là tập tin dựa trên nó có thể là một lỗi thời gian chờ hoặc cấp phép?

Ngoài ra, tôi tự hỏi liệu hàm regenerate_id có đang gây ra hàm hủy không để tìm phiên không còn kỹ thuật nữa. Bạn đã thử đặt đối số boolean đó thành false trong hàm tạo lại không?

Chúng tôi gặp sự cố này trên ứng dụng CakePHP, nhưng chúng tôi đã sửa lỗi bằng cách kích hoạt với cài đặt Bánh.

+0

phiên được lưu trữ trong hệ thống tệp. Tôi cũng đã thử những gì bạn đề xuất nhưng vẫn gặp lỗi này một lần. Như tôi đã đề cập, lỗi xảy ra rất thường xuyên (đôi khi một lần trong một ngày), nó rất khó cho tôi để thực hiện một số thay đổi và sau đó xem nếu nó đã cố định vấn đề. – Varun

+0

Một câu hỏi khác, là người dùng thực sự đã đăng xuất khi cảnh báo xuất hiện? Hoặc nhiều hơn vào vấn đề, ngoài cảnh báo, mọi thứ khác có hoạt động không? Nếu vậy, bạn có thể cân nhắc việc ngăn chặn cảnh báo cho đến khi bạn thấy nó - nghĩa là, nếu đây là môi trường sản xuất. – picus

0

Tìm thấy something có thể hữu ích về chủ đề này. Các mối quan tâm cơ bản là:

  1. Cho dù phiên có hợp lệ để bắt đầu - giá trị trả lại từ session_start() không?
  2. Cho dù tệp phiên tồn tại trong PHP.ini session.save_path và có thể bị xóa.

Tôi nghi ngờ trong trường hợp của bạn, đây là trường hợp đầu tiên. Tôi không nhớ nơi nhưng tôi nghĩ rằng tôi đã nhìn thấy trường hợp phiên họp vô hiệu hóa chính nó và sau đó đã cố gắng lặp lại quá trình vì một lý do nào đó.

2

Tính năng đăng xuất() có được gọi ở nơi khác hơn trong validate_session() không? Nếu không, vấn đề có thể là lời kêu gọi session_destroy() trước khi logout()

Bạn có thể thử này:

validate_session() 
{ 
    session_set_cookie_params(0); 
    session_start(); 
    if (!isset($_SESSION['user_id'])) { 
     logout(); 
     header("Location: login_page"); 
    } 
} 

logout() 
{ 
    $_SESSION = array(); 
    setcookie(session_name(), '', time() - 3600, '/'); 
    session_destroy(); 
} 
+0

Đây là giải pháp ưa thích của tôi, thêm session_destroy vào hàm đăng xuất thay vì hàm validate_session() có nghĩa hợp lý. Một trong những ưu điểm mà giải pháp này cung cấp là ngăn chặn một phiên mới được tạo trên trang đăng xuất, điều này sẽ phủ nhận sự cần thiết phải sao chép các hàm session_destroy(). –