Sự khác biệt giữa session_unset () và session_destroy () trong PHP là gì?


88

Từ tài liệu php.net :

session_destroy - Hủy tất cả dữ liệu đã đăng ký cho một phiên

session_unset - Miễn phí tất cả các biến phiên

Câu hỏi ba phần của tôi là:

Hai chức năng có vẻ rất giống nhau.
Sự khác biệt thực sự giữa cả hai là gì?

Cả hai dường như xóa tất cả các biến được đăng ký cho một phiên. Có ai trong số họ thực sự tự phá hủy phiên không? Nếu không, làm thế nào để bạn thực hiện điều này (tự hủy phiên làm việc).

Có đúng không khi cả hai chức năng đều xóa cookie phiên tại máy khách?

Câu trả lời:


144

session_unsetchỉ xóa $_SESSIONbiến. Nó tương đương với làm:

$_SESSION = array();

Vì vậy, điều này chỉ ảnh hưởng đến $_SESSIONcá thể biến cục bộ chứ không ảnh hưởng đến dữ liệu phiên trong bộ nhớ phiên.

Ngược lại với điều đó, session_destroyhủy dữ liệu phiên được lưu trữ trong bộ lưu trữ phiên (ví dụ: tệp phiên trong hệ thống tệp).

Mọi thứ khác vẫn không thay đổi.


@Gumbo Không có vấn đề gì với session_unset () hiện không được dùng nữa phải không? Tôi đã kiểm tra điều này và nó không hoạt động với tôi.
Navneet

@hakre cảnh báo là gì?
GoTo

4
@GoTo: Session_unset đó được sử dụng để bỏ đặt các biến toàn cục đã đăng ký làm biến phiên như nó thường thấy trong PHP 4. Việc sử dụng hàm đó cho đến ngày nay là không hợp thời và không cần thiết. Lý do duy nhất mà nó vẫn còn trong PHP có lẽ là khả năng tương thích ngược và không có gì khác. Nếu bạn viết mã mới, bạn không nên sử dụng nó. Nếu bạn tìm thấy nó trong mã, bạn nên xóa nó cùng với các lệnh gọi tới session_register () và phần còn lại của các hàm xử lý biến phiên PHP 4 trừ khi bạn đang xử lý rõ ràng với mã PHP 4.
hakre

5
Vẫn còn đó là khó hiểu: Vui lòng mô tả local $_SESSION variable instance vs session data in the session storage. Như tôi biết, có 1000 người như tôi đã không hiểu ý bạn. Cảm ơn
Pratik

1
Câu trả lời của bạn là quá bối rối. Vui lòng xem xét chỉnh sửa nó, bởi vì tôi vẫn nghĩ rằng cả hai phiên đang phá hủy
Pratik

17

session_destroy(); đang xóa toàn bộ phiên.

session_unset();chỉ xóa các biến khỏi phiên - phiên vẫn tồn tại. Chỉ có dữ liệu bị cắt bớt.


15
session_unset();

Chỉ cần xóa tất cả dữ liệu của tất cả biến phiên.


session_destroy();

Xóa tất cả phiên.


Ví dụ :

session_start();
session_destroy();     
$a = "1234";
$_SESSION[a] = $a;

$_SESSION[a]NULL.


session_start();
session_unset();     
$a = "1234";
$_SESSION[a] = $a;

$_SESSION[a]1234.


Vì vậy, tôi sẽ sử dụng:

session_start();
session_destroy();   
session_start();  
$a = "1234";
$_SESSION[a] = $a;

2
trong ví dụ giữa của bạn -> session_unset();bạn KHÔNG làm bất cứ điều gì vì bạn vẫn có thể sử dụng phiên của $_SESSION["a"] , vậy việc sử dụng nó là gì?
Pratik

1
$_SESSION[a]nên $_SESSION['a'] và không giống như những gì bạn nói đây là NOT NULL trong ví dụ đầu tiên của bạn
Istiaque Ahmed

5

session_unset()sẽ xóa $_SESSIONbiến (như trong array()), nhưng nó sẽ không chạm vào tệp phiên. Nhưng khi kịch bản kết thúc; trạng thái của di $_SESSIONchúc được ghi vào tệp. Sau đó, nó sẽ xóa tệp nhưng sẽ không xóa nó. Khi bạn sử dụng, session_destroy()nó sẽ không chạm vào $_SESSION(Sử dụng var_dump($_SESSION)sau session_destroy()), nhưng sẽ xóa tệp phiên, vì vậy khi tập lệnh thoát sẽ không có tệp để ghi trạng thái của $_SESSION.


0

session_destroy()sẽ xóa phiên sau khi di chuyển trang và session_unset()sẽ xóa phiên khi mã được chạy.


0

Tôi đã cố gắng sử dụng với session_unset($_SESSION['session_name'])suy nghĩ rằng nó sẽ chỉ không đặt tên phiên cụ thể hoặc riêng lẻ / đơn lẻ. Nhưng việc sử dụng session_unset($_SESSION['session_name'])sẽ chỉ hủy đặt tất cả tên phiên. Mã phù hợp để sử dụng chỉ unset($_SESSION['session_name'])khi bạn muốn hủy đặt một tên phiên duy nhất.


0

session_start (); #it ​​sẽ tạo một mảng ảo (liên kết) trong bộ nhớ thời gian thực của trình duyệt

hai mục được thêm vào

> $_SESSION['me'] = "Yadab";  
> $_SESSION['you'] = "Avi";
>
> print_r($_SESSION); #will give, array( "me"=>"Yadab", "you"=>"Avi" )

test1

> unset($_SESSION['me']); #only 'me' variable is removed fully (index & value) 
> print_r($_SESSION); #now the array is Array("you"=>"Avi")

test2

> session_destroy(); #will unset the values of all session variables, but indexes exists 
> print_r($_SESSION); #Output, Array("you"=>undefined)
> #but some browser can store the value in cookies

test3

> session_unset(); #will unset all the main variables not only the values 
> print_r($_SESSION); #that means session array is now empty, like Array()

kiểm tra khối 1, 2 hoặc 3 riêng lẻ bằng cách nhận xét những người khác


-2

Tôi nghĩ rằng session_destroy () và session_unset () nên được sử dụng đồng thời để đảm bảo rằng dữ liệu phiên chắc chắn bị xóa.


Tôi nghĩ có nghĩa là bạn không chắc chắn về câu trả lời. Đây nên là một bình luận không phải là một câu trả lời.
Shaiful Islam

4
session_unset()sau session_destroy()đó sẽ là vô nghĩa. Sử dụng session_unset()để xóa tất cả các khóa và giá trị khỏi superglobal $ _SESSION hoặc sử dụng session_destroy()để xóa toàn bộ phiên; không sử dụng cả hai chỉ để "đảm bảo", hãy tin tưởng chức năng thực hiện công việc của nó.
redburn

@redburn session_destroy()không bỏ đặt var sess superglobal cho đến khi thoát khỏi trang hiện tại.
Yousha Aleayoub
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.