Session trong PHP

Em có biết Session được tạo ra khi browser gửi request lần đầu đến server của website, khi đó server sẽ gửi 1 session ID lưu vào cookie của phía client. Khi duyệt trong website đó thì ID bên phía client sẽ được gửi lên server để đối chiếu xem client đó là ai. Nhưng giờ nếu em thoát website hoặc đóng trình duyệt rồi vào lại thì session ID (cũng như dữ liệu trong session hiện tại trên server) của em có bị tạo mới lại không, hay lúc đó ID cũ trong cookie sẽ được gửi lại phía server để check và có thể tiếp tục phiên làm việc ạ? Em cảm ơn.

Khi bạn tiến hành đóng trình duyệt thì session sẽ tự động bị hủy nhé. Còn đóng tab thì session vẫn còn.
Những trang web khi đăng nhập có nút remember me thì nó set vào cookie nhé còn set như nào tùy vào mục đích sử dụng.

có cách nào để khi đóng trình duyệt mà session vẫn được lưu trên server không ạ?

Session được hiểu với nghĩa là một phiên làm việc, là một khoảng thời gian tương tác giữa người sử dụng và website. Session được tạo ra bởi website do người lập trình quy định và được lưu trữ tại server, thời gian sống của session ngắn hoặc do website quyết định. Session giúp ta lưu trữ thông tin về user, các biến, giá trị trong khoảng thời gian ta tương tác với website. Sau khi ta tắt trình duyệt web tức là đã kết thúc một phiên làm việc thì session sẽ tự động hủy.
Có thể sử dụng cookie để thay thế, thế nên mới có cookie mà xài chứ :slight_smile:

bạn em nó bảo nếu nó có session ID phiên làm việc của em trên một website thì nó có thể acess vào website đó với tư cách là của em từ máy nó, có đúng ko thế bác

cái set thời gian sống của session phải có điều kiện là trình duyệt vẫn mở chứ bác?

Điều đó hoàn toàn có thể, giống như token trong fb có thể cướp quyền truy cập - đó thuộc vấn đề bảo mật.

Trình duyệt mở thì session mới còn tồn tại, đóng trình duyệt session bị xóa mà b đó là điểu hiển nhiên.

nếu tắt tab mà em đang acess vào website, nhưng trình duyệt vẫn mở, thì browser liên kết với server của website đó kiểu gì hả bác

Bạn đọc kĩ cái này hi vọng có thể giúp được cho bạn:
[https://github.com/tpphu/workspace/blob/master/article/php%20session.md]

Hi bạn!

Theo ý kiến mình là như sau:

1, Session thường để lưu các thông tin tạm thời trong một phiên làm việc của người dùng tại một site (VD các thao tác đặt hàng, config, …) Khi close trình duyệt tức là phiên làm việc đó đã kết thúc và Session ID sẽ bị xóa đúng theo cơ chế của Session. (Session cookie trên máy client được tạo ra cùng thời điểm với Session trên server để đối chiếu trong phiên làm việc đó người đang làm việc đó chính là bạn (nó có định danh IP, Browsers, …) hết phiên nó cũng bị xóa như Session trên server)

2, Các site muốn lưu trữ các thông tin tạm đó của người dùng đó cho dù họ có tắt trình duyệt và sau vô lại thì vẫn còn thì đó chính là cơ chế lưu thủ công của từng site nó thiết lập (lưu Session ID đó vào Cookie, localStorage, Database, Text file, …)

Tại sao close tab mà lại không được coi là đóng phiên làm việc hả bác :sweat_smile:

Đóng chứ sao không đóng.

Tự kiểm chứng: nếu bạn không tin nó đóng hay không thì bạn làm một chương trình login bằng PHP mà không dùng đến cookies hay storage , khi bạn đóng tab này lại, và mở tab khác ra, vào lại trang đó ở tab mới xem nó có nhận ra là bạn còn đăng nhập không hay là đã xem như bạn thoát đăng nhập?

Vấn đề nhiều người không chịu là đóng tab lại là dứt phiên làm việc mà phải đóng trình duyệt đó có lẽ là bởi lý do trình duyệt có chức năng undo để mở lại tab vừa đóng. Do đó, đóng trình duyệt mới thực sự là đóng phiên. Còn nếu đóng tab mà tab đó vẫn có thể mở lại y chang thì không. Còn nếu trình duyệt chỉ có 1 tab duy nhất và đóng luôn tab đó lại không undo được thì xem ra đã kết thúc phiên.

1 Like

Nếu close tab có thể coi là kết thúc một session thì session sẽ không bao giờ cần dùng nữa và cũng sẽ chẳng có khái niệm session trong lập trình nói riêng.

Session giúp lưu trữ thông tin TẠM THỜI trong một khoảng thời gian nhất định để giúp người dùng không bị gián đoạn trong khi đang thao tác trên website mà không phải nhập lại toàn bộ dữ liệu.

Bản chất của Session vẫn là Cookie và lưu trên ổ cứng, nhưng không phải loại cookie tồn tại theo thời gian mà là loại tồn tại theo session, nếu như tắt trình duyệt thì cookie loại này cũng bị xoá hết.

Không chỉ là trình duyệt mở mà trình duyệt phải gửi tối thiểu 1 request đến server trong thời gian sống để session reset lại timeout. Nếu như trình duyệt tắt trước khi session time out, thì session đó vẫn tồn tại ở phía server đến khi timeout, nhưng nếu bạn mở trình duyệt lại thì cookie cũ không còn, session mới được tạo ở phía server không còn liên quan gì đến session cũ nữa nên session cũ cũng sẽ chết.

Đây là cơ sở của “Heartbeat design pattern”, giảm thời gian sống của session (mặc định là 20 phút) xuống còn 1-2 phút để giảm thiểu bộ nhớ cho session của trình duyệt bị tắt và client sẽ gửi request rỗng đến server mỗi 30 giây để reset timeout.

1 Like

Thực sự, có tới 3 thứ đang đề cập ở chủ đề này, giờ các bạn cần thảo luận kỹ để làm rõ thêm:

  1. Session : ở đây ta chỉ dừng lại với giao thức HTTP hoặc HTTPS dùng trong web, liên quan đến trang web và trình duyệt trao đổi theo kiểu client - server, không đề cập đến session với tư cách chung chung trong lĩnh vực mạng máy tính.

  2. Cookies: cũng dính dáng đến HTTP, trình duyệt web.

  3. Session cookies : là session nhưng mà có tạo ra một cookies ở phía client, có thể xem thấy cookie này trên ổ cứng.

( Các ngôn ngữ lập trình web có dùng session cookies thì có các tên như JSESSIONID (JSP), PHPSESSID (PHP), CGISESSID (CGI), and ASPSESSIONID (ASP) )

Như vậy, không phải lúc nào session cũng là session cookies, có những lúc bạn không thể tìm ra session dưới dạng cookie trên ổ cứng nhưng phiên làm việc vẫn thiết lập và server vẫn nhận ra client, lúc đó có lẽ trình duyệt lưu session trong vùng nhớ nào đó do giao thức HTTP quy định hay có cách khác để bắt tay nhau. Mình không biết nó dùng cách nào nhưng ngày xưa hay vọc phpBB thì thấy có lẽ người ta sử dụng chuỗi token làm tham số GET.

Thảo luận mở rộng ra: nếu ai dó cho rằng session chính là session cookie, vậy thì khi trình duyệt tắt chức năng cho phép cookie, như vậy là những web nào xài session là bị ngọng, không thể nhận diện được client như chúng ta đang hiểu về session?

OK, mời các bạn cùng vào thảo luận chơi. À, mà tiếng Anh mình không rõ, tại sao chữ cookies nó lại luôn là cookies mà không thấy ghi là cookie dù chỉ có 1 cái.

1 Like

Close tab thì có xóa session cookie của trang hiện tại không bác?

Không bạn. Trừ khi tắt trình duyệt / người dùng xoá bằng thao tác trình duyệt cung cấp / có response xoá session từ phía server gửi về

Ví dụ chrome thì như thế này:

ý mình là xóa session id được server gửi vể và lưu ở client ý bạn, cookie cứng của trang đó thì không xóa được rồi

Bạn thử đăng nhập rồi xoá cookies trong 1 giờ đi, lại phải đăng nhập lại ngay mà :))
Đã nói rồi, session cũng là cookies

Còn xoá từ phía server thì mình không biết, nhưng mà chắc là có, vì bên ASP.NET cũng có xoá session từ server

Dùng SID vẫn được nhé :smiley: https://stackoverflow.com/questions/3740845/php-session-without-cookies

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?