2012-09-26 39 views
14

Tôi gặp sự cố lạ trong hệ thống quản lý kiểm tra trực tuyến của mình.Làm cách nào để duy trì phiên hoạt động mà không cần tải lại trang?

Một số người dùng trong biểu mẫu thử nghiệm (test.php) cần thời gian dài để trả lời câu hỏi và gửi biểu mẫu.

Sau khi nộp đơn phiên là hết hạn và người dùng phải đăng nhập lại

đây không phải là một vấn đề mã

Tôi đặt giá trị này trong đầu của tất cả các trang

ini_set('session.gc_maxlifetime', 18000); 

Có cách để làm mới phiên evrey 10 phút mà không cần tải lại trang ở dạng thử nghiệm để ngăn chặn phiên hết hạn?

Xin hãy giúp tôi

Cảm ơn

+0

Có thể thực hiện một số cuộc gọi ajax? Bạn có thể mô tả kịch bản của bạn nhiều hơn một chút không? Có thể một số mẫu mã sẽ giúp :) – Gogol

+0

Thú vị. Tôi đang đối phó với một vấn đề tương tự nhưng quan điểm của tôi về vấn đề này là người ta nên tránh tự động đặt lại thời gian chờ của phiên tại một khoảng thời gian như vậy sẽ có hiệu quả tạo ra một phiên vô hạn mà sẽ tồn tại miễn là cửa sổ trình duyệt được mở. Thay vào đó, tôi khuyên bạn nên tăng tuổi thọ tối đa và thời gian chờ có thể được làm mới dựa trên hành động của người dùng. Ngay cả di chuyển chuột cũng có thể thực hiện thủ thuật, bắt đầu hẹn giờ khi di chuột. Trừ khi một số thành phần tương tác người dùng được bao gồm nó tạo ra một lỗ hổng bảo mật lớn. Phiên được thiết kế hết hạn. –

Trả lời

25

Bạn có thể sử dụng XHR javascript, hoặc như những người khác gọi nó, AJAX.

Sử dụng ajax bạn có thể gọi một kịch bản php mà làm mới phiên của bạn mỗi 10 phút. :)


Đây là điều tôi có thể đi đến "chính xác".

javascript

var refreshSn = function() 
{ 
    var time = 600000; // 10 mins 
    settimeout(
     function() 
     { 
     $.ajax({ 
      url: 'refresh_session.php', 
      cache: false, 
      complete: function() {refreshSn();} 
     }); 
    }, 
    time 
); 
}; 

refresh_session.php

<?php 
session_start(); 

// store session data 
if (isset($_SESSION['id'])) 
$_SESSION['id'] = $_SESSION['id']; // or if you have any algo. 
?> 

Dù sao, một giải pháp khác sẽ được kéo dài thời gian phiên cho trang thử nghiệm chỉ sử dụng giải pháp trình bày ở đây

How do I expire a PHP session after 30 minutes?

+0

tôi cần thêm trợ giúp, bạn có thể cho tôi mã chính xác không? –

+1

cập nhật câu trả lời của tôi :) – sheeks06

+8

Trong tập lệnh PHP, không phải là 'session_start()' chỉ đủ? –

9

Tất cả bạn cần là này (sử dụng jQuery cho $ .post):

Javascript (đặt bên trong onload chức năng hay cái gì của bạn)

setInterval(function(){$.post('path/to/refresh_session.php');},600000); //refreshes the session every 10 minutes 

refresh_session.php

<?php 
    session_start(); 

    if (isset($_SESSION['token'])) { //if you have more session-vars that are needed for login, also check if they are set and refresh them as well 
    $_SESSION['token'] = $_SESSION['token']; 
    } 
?> 

(Tôi biết điều này khá giống với câu trả lời được chấp nhận, tôi thực sự muốn nhận xét về câu trả lời đó nhưng tôi chưa có đủ danh tiếng.
Thay đổi lớn nhất là trong JavaScript, bạn không cần toàn bộ chức năng, chỉ một dòng.)



INFO EXTRA:

Mặc dù tôi nghĩ rằng nó là đủ để chỉ cần gọi session_start() trong php, nếu tôi đọc quyền này (http://nl3.php.net/function.session-start):

Các đọc callback sẽ truy xuất bất kỳ dữ liệu phiên hiện có nào (được lưu trữ ở định dạng đặc biệt được lưu trữ theo định dạng ) và sẽ không được tự động hóa và được sử dụng để tự động về mặt vật lý cư trú siêu đô thị $ _SESSION khi cuộc gọi trả lời đọc dữ liệu phiên đã lưu trở lại xử lý phiên PHP.

Và trong khi thử nghiệm, tôi chỉ đặt mã ở trên trên trang khách truy cập của mình chứ không phải trên trang quản trị. Nhưng tôi đã có cả hai trang mở trong cùng một trình duyệt (Chrome), và trang quản trị vẫn đăng nhập là tốt, ít nhất là trong hơn một giờ (không kiểm tra nữa). NHƯNG, tôi không biết nếu nó vẫn hoạt động nếu bạn chỉ sử dụng session_start(), mà không tự làm mới bất kỳ phiên var ở tất cả ..

Dù bằng cách nào, tôi muốn chắc chắn rằng phiên vars tôi cần thực sự vẫn còn ở đó :)

+0

"THÔNG TIN THÊM" của bạn dường như không đúng. Tôi gặp vấn đề tương tự. Đã tạo một cuộc gọi ajax (ping/pong) đến máy chủ đang cố giữ phiên của tôi còn sống. Đối với prupose thử nghiệm chạy mỗi 5 phút. Đề cập đến điều gì, tôi bị chứng thực sau khoảng 2 giờ.Bây giờ hãy thử phiên làm thay đổi aprouch. –

+0

@FlipVernooij vậy cách "cách tiếp cận thay đổi phiên" đi như thế nào? –

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