2012-01-12 41 views
5

Tôi hiểu rằng PHP lưu trữ id phiên của người dùng trong cookie được gọi là "PHPSESSID" được lưu trữ trong trình duyệt của khách hàng và được khớp với phiên trên máy chủ để có thể liên quan đến 2. Sau khi đóng trình duyệt thông tin phiên biến mất nhưng cookie trên máy khách vẫn còn. Có thể sử dụng cookie này để khôi phục phiên cũ không? Hay tất cả dữ liệu phiên bị xóa khỏi máy chủ vào lúc máy khách đóng trình duyệt của họ?Làm cách nào để khôi phục phiên PHP?

Tôi có điều này trên trang của mình đầu tiên:

session_start(); 
$_SESSION['message'] = 'Hello'; 

echo $_SESSION['message']; // outputs hello 

sau đó tôi đã thay đổi trang để:

$old_session = session_id(); 
session_id($old_session); 
session_start(); 

echo $_SESSION['message']; 

Sau đó, tôi đóng trình duyệt và mở lại nó vào trang này và nhận được các lỗi này:

Warning: session_start() [function.session-start]: The session id is too long or contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' in C:\xampp\htdocs\localhost\test.php on line 5 

Notice: Undefined index: message in C:\xampp\htdocs\localhost\test.php on line 7 

Làm cách nào để truy xuất thông tin phiên cũ sau khi đóng trình duyệt, thậm chí có thể thực hiện được không?

+1

'Sau khi đóng trình duyệt, thông tin phiên sẽ biến mất nhưng cookie trên máy khách vẫn còn.' --- nó không chính xác. Trong hầu hết các trường hợp, cookie phiên id được đặt thành "trước khi trình duyệt không được đóng". '$ old_session = session_id(); session_id ($ old_session); '--- mã này không có ý nghĩa – zerkms

+0

http://php.net/manual/en/session.configuration.php#ini.session.gc-maxlifetime – j08691

+0

Trừ khi bạn đang nhìn qua cửa sổ của người dùng, máy chủ của bạn sẽ không có ý tưởng khi anh ta đóng trình duyệt của mình (AJAX cũng sẽ không đảm bảo điều đó). Máy chủ chỉ xóa dữ liệu phiên được coi là "cũ". – webbiedave

Trả lời

4

Phiên làm chính xác những gì nó nói trên tin - tồn tại trong suốt thời gian phiên của khách hàng. Một phiên duyệt theo định nghĩa (chẳng hạn như có một) kết thúc khi bạn đóng trình duyệt.

Phiên dựa trên cookie hoạt động bằng cách đặt cookie có tuổi thọ được xác định bằng PHP là 0 - điều này có nghĩa là trình duyệt sẽ hủy cookie khi trình duyệt bị đóng. Khi cookie đã bị hủy, ID phiên sẽ không được gửi trong bất kỳ yêu cầu máy chủ nào sau đó, vì vậy dữ liệu phiên sẽ không có sẵn trong tập lệnh PHP của bạn.

Tuy nhiên, dữ liệu phiên không bị hủy ở phía máy chủ tại thời điểm người dùng đóng trình duyệt, như bạn đã đề xuất - điều này là không thể, vì khách hàng không thông báo cho máy chủ rằng nó đã bị đóng. Thay vào đó, dữ liệu phiên ở phía máy chủ có TTL (thời gian sống) có giá trị mặc định là 15 phút. Sau khi điều này đã hết hạn, dữ liệu có thể sẽ bị xóa bất kỳ lúc nào bởi trình thu thập rác phiên. Về lý thuyết, điều này có thể là một số thời gian đáng kể, nhưng trong thực tế trên một máy chủ bận rộn dữ liệu sẽ bị xóa trong vòng một vài phút của TTL hết hạn.Tuy nhiên, PHP không thể làm cho dữ liệu phiên có sẵn trừ khi nó có ID phiên và nó sẽ không có ID phiên nếu cookie đã bị hủy, như tôi nói, sẽ xảy ra khi người dùng đóng trình duyệt của họ.

Vì vậy, câu trả lời ngắn cho câu hỏi How can I restore a PHP session? là: Bạn có thể không

+1

Tôi hiểu, thật tuyệt khi biết rằng dữ liệu máy chủ không bị xóa khi đóng trình duyệt. Tôi đã có thể làm việc xung quanh nhu cầu khôi phục bằng cách tạo một cookie khác và lưu trữ session_id hiện tại() trong đó. Sau đó, khi trình duyệt được mở lại, tôi đã làm session_id ($ _ COOKIE ['old_session']); và có thể lấy lại thông tin phiên trước đó. – TK123

1

session_start đặt cookie.

cookie có một param cookie-lifetime

theo mặc định thời gian tồn tại cookie được đặt thành 0

0 có nghĩa là cho đến khi trình duyệt đóng

2

này có thể hoặc không thể là một câu trả lời bạn đang tìm kiếm.

Theo như tôi biết, bạn không thể "khôi phục" phiên dựa trên cookie phiên. Những gì tôi làm là lưu trữ một cookie với id, tên người dùng và mật khẩu của khách hàng, được muối và băm. Tôi cũng lưu trữ khác với id của họ. Tôi kiểm tra cả hai cookie khi họ truy cập trang web, sau đó xác thực chúng với nhau, sau đó đăng nhập chúng tự động. Trong khi điều này không "khôi phục" phiên của họ, nó cho phép họ ở lại đăng nhập trên trang web của tôi khi họ đóng trình duyệt. Đây là cách tôi đã quyết định làm điều đó, và tôi hình dung nếu có ai đó đã xâm nhập hoặc xem cookie của người dùng khác, sẽ gần như không thể giải mã được với muối mà tôi đã sử dụng. Thông tin duy nhất họ thu được là id của người dùng.

+1

Tại sao không? ID phiên là giá trị được lưu trữ trong cookie. Tên của cookie phiên là 'session_name()' và giá trị được lưu trữ trong nó là 'session_id()'. –

+0

Tôi chưa bao giờ thực hiện theo cách đó vì tôi thấy các phiên bị xóa khỏi máy chủ quá sớm (có thể vài giờ hoặc không hoạt động, trừ khi tôi thay đổi cài đặt) và sử dụng phương pháp cookie sẽ cho phép phiên ban đầu bị xóa nhưng vẫn đăng nhập. –

+1

cookie phiên php không lưu trữ bất cứ điều gì trừ id phiên. nếu tệp phiên bị mất, thì phiên đã biến mất và tệp mới sẽ được tạo, để lại phiên trống. –

1

Câu trả lời được chấp nhận ở đây nên không được chấp nhận. Bạn chắc chắn nhất có thể phục hồi một phiên miễn là nó chưa được xóa. Nó thực sự là đơn giản này.

<?php 
    session_id($the_id_of_the_session_you_want_to_reopen); 
    session_start(); 
?> 

Tôi đã tìm thấy câu trả lời here.

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