2009-03-24 37 views
39

Có cách nào trong PHP để nhận danh sách tất cả các phiên (và các biến trong mỗi phiên) trên máy chủ không?Lặp qua tất cả các phiên của máy chủ trong PHP

Về cơ bản, chúng tôi có chức năng bảo trì cần biết người dùng nào hiện đang đăng nhập vào trang web. Chúng tôi đã lưu trữ dữ liệu cho mỗi người dùng trong một biến phiên, nhưng tôi hy vọng rằng tôi có thể lặp qua từng phiên này và loại bỏ dữ liệu tôi cần.

PHP của tôi rất hạn chế (tôi là một nhà phát triển .Net theo cách khác) nhưng nếu có ai biết nếu điều này thậm chí có thể (và cách thực hiện), tôi sẽ rất biết ơn. Tôi googled này, và kết quả tôi tìm thấy có xu hướng để inidcate rằng nó không thể, nhưng tôi thấy điều này rất khó chấp nhận.

Tuy nhiên, nếu bạn không thể bạn không thể nhưng tôi nghĩ rằng bạn bè của tôi trên StackOverflow có thể cho tôi một câu trả lời dứt khoát!

Trả lời

38

PHP lưu trữ dữ liệu phiên cho từng người dùng trong một thư mục tạm thời trên máy chủ. Thư mục này được định nghĩa trong tệp cấu hình php.ini dưới biến session.save_path. Định vị giá trị này từ bên trong tệp php.ini của bạn, hoặc cách khác, tạo tệp php bằng:

<?php echo "Session Save Path: " . ini_get('session.save_path');?> 

làm nội dung và mở tệp trong trình duyệt của bạn.

Khi bạn tìm thấy đường dẫn lưu cho dữ liệu phiên, hãy mở thư mục đó và bạn sẽ nhận thấy một cấu trúc khá đơn giản. Tất cả các phiên được lưu trữ ở định dạng: sess_ $ SESSIONID.

Dữ liệu phiên được tuần tự hóa trước khi được lưu trữ trên đĩa. Như vậy, các đối tượng được lưu trữ trong tệp phiên sẽ phải được deserialized trước khi có thể sử dụng được. Tuy nhiên, nếu bạn đang sử dụng văn bản thuần túy, được lưu trữ dưới dạng, để lưu trữ dữ liệu phiên của bạn (ví dụ: $_SESSION['userid'] = 1234) để lưu trữ thông tin về người dùng của bạn, sẽ dễ dàng phân tích dữ liệu bạn đang tìm kiếm trong các tệp.

Một điều nữa ... Tôi chưa xem xét, nhưng có vẻ như ID phiên xuất hiện trong tên tệp tương ứng trực tiếp, ví dụ, tên của cookie PHPSESSID được lưu trữ trên máy tính của người dùng. Vì vậy, với ý nghĩ này, có thể lặp qua các tệp trong thư mục phiên tạm thời, nhận tất cả các giá trị $ SESSIONID, đặt ID phiên hiện tại bằng cách sử dụng session_id($SESSIONID), bắt đầu phiên với session_start() và truy cập dữ liệu bạn cần thông qua PHP mà không cần phân tích cú pháp các tệp nội dung. Bất cứ ai có thể xác nhận hay không điều này sẽ có thể?

Chỉnh sửa: Bài chỉnh được điều chỉnh cho phù hợp với nhận xét của Itay.

+13

Điều đáng nói là loại hack này là ý tưởng khủng khiếp. PHP có kiến ​​trúc 'không chia sẻ gì' và cố gắng hack nó sẽ giống như sử dụng một tuốc nơ vít để trồng móng tay. Thay vì phân tích cú pháp các tệp nội bộ serwer tạo tệp của riêng bạn hoặc sử dụng cơ sở dữ liệu tốt hơn để duy trì bất cứ điều gì bạn cần. – smentek

+0

php có tùy chọn lưu dữ liệu phiên trong bộ nhớ. không phải lúc nào chúng tôi cũng có thể lấy chúng ra khỏi tệp. – jondinham

+1

và hơn thế nữa, những tệp "ses_ *" này có thể được đặt trong cấu trúc thư mục đa cấp. đây là những gì được nói trong php.net – jondinham

6

Đây là một cách gọn gàng hơn để có được một danh sách các phiên qua các tập tin lưu trữ:

<?php 
print_r(scandir(session_save_path())); 
?> 
0

Điều này sẽ giúp bạn có được các dữ liệu cho tất cả các phiên, lưu trữ trong một mảng và lập chỉ mục của phiên id:

<?php 
$allSessions = []; 
$sessionNames = scandir(session_save_path()); 

foreach($sessionNames as $sessionName) { 
    $sessionName = str_replace("sess_","",$sessionName); 
    if(strpos($sessionName,".") === false) { //This skips temp files that aren't sessions 
     session_id($sessionName); 
     session_start(); 
     $allSessions[$sessionName] = $_SESSION; 
     session_abort(); 
    } 
} 
print_r($allSessions); 
Các vấn đề liên quan