2009-03-24 14 views
39

क्या सर्वर पर सभी सत्रों (और प्रत्येक के भीतर चर) की सूची प्राप्त करने के लिए PHP में कोई तरीका है?PHP में सभी सर्वर के सत्रों के माध्यम से लूपिंग

असल में, हमारे पास एक रखरखाव कार्य है जिसे यह जानने की आवश्यकता है कि वर्तमान में साइट पर कौन से उपयोगकर्ता लॉग इन हैं। हम पहले से ही प्रत्येक उपयोगकर्ता के लिए सत्र चर में डेटा स्टोर करते हैं, लेकिन मुझे आशा है कि मैं इन सत्रों में से प्रत्येक के माध्यम से लूप कर सकता हूं और मुझे आवश्यक डेटा निकाल सकता हूं।

मेरा PHP बहुत सीमित है (मैं एक नेट डेवलपर हूं) लेकिन अगर कोई जानता है कि यह भी संभव है (और इसे कैसे करें) तो मैं बहुत आभारी हूं। मैंने इसे गुमराह किया, और जिन परिणामों को मैंने पाया, यह पता चला कि यह संभव नहीं था, लेकिन मुझे यह स्वीकार करना बहुत मुश्किल लगता है।

फिर भी, यदि आप नहीं कर सकते हैं लेकिन मैंने सोचा था कि स्टैक ओवरव्लो पर मेरे दोस्त मुझे एक निश्चित उत्तर दे सकते हैं!

उत्तर

38

PHP प्रत्येक सर्वर के लिए सर्वर पर एक अस्थायी फ़ोल्डर में सत्र डेटा संग्रह करता है। यह फ़ोल्डर php.ini कॉन्फ़िगरेशन फ़ाइल में परिवर्तनीय session.save_path के अंतर्गत परिभाषित किया गया है। के रूप में यह सामग्री है

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

, और अपने ब्राउज़र में फ़ाइल को खोलने: अपने php.ini फ़ाइल के भीतर से इस मान, या वैकल्पिक रूप, के साथ एक php फ़ाइल बनाएँ।

एक बार जब आप सत्र डेटा के लिए सहेजें पथ पाते हैं, तो उस फ़ोल्डर को खोलें और आपको एक काफी सरल संरचना दिखाई देगी। सभी सत्र प्रारूप में संग्रहीत हैं: sess_ $ SESSIONID।

सत्र डेटा डिस्क पर संग्रहीत होने से पहले क्रमबद्ध किया जाता है। इस प्रकार, सत्र फ़ाइल में संग्रहीत वस्तुओं को प्रयोग करने योग्य होने से पहले deserialized किया जाना होगा। हालांकि, यदि आप अपने उपयोगकर्ताओं के बारे में जानकारी संग्रहीत करने के लिए अपने सत्र डेटा (उदा। $_SESSION['userid'] = 1234) को संग्रहीत करने के लिए सादा पाठ का उपयोग कर रहे हैं, जो आपके द्वारा संग्रहीत डेटा को पार्स करने के लिए पर्याप्त आसान होना चाहिए, फाइलों के भीतर।

एक और बात ... मैंने इसमें नहीं देखा है, लेकिन ऐसा लगता है कि फ़ाइल नाम में दिखाई देने वाली सत्र आईडी सीधे उदाहरण के लिए मेल खाती है, उदाहरण के लिए, उपयोगकर्ता के कंप्यूटर पर संग्रहीत PHPSESSID कुकी का नाम। इसलिए, इस बात को ध्यान में रखते हुए, अस्थायी सत्र निर्देशिका में फ़ाइलों के माध्यम से लूप करना संभव हो सकता है, सभी $ SESSIONID मान प्राप्त करें, session_id($SESSIONID) का उपयोग कर वर्तमान सत्र आईडी सेट करें, session_start() के साथ एक सत्र प्रारंभ करें और PHP के माध्यम से आवश्यक डेटा तक पहुंचें सामग्री फ़ाइलों को स्वयं पार्स किए बिना। क्या कोई यह पुष्टि कर सकता है कि यह संभव होगा या नहीं?

संपादित करें: इटै की टिप्पणी से मेल खाने के लिए समायोजित पोस्ट।

+13

यह उल्लेख करना महत्वपूर्ण है कि इस तरह के हैक्स भयानक विचार हैं। PHP में 'कुछ भी साझा नहीं' वास्तुकला है और इसे हैक करने की कोशिश करना नाखून लगाने के लिए एक स्क्रूड्राइवर का उपयोग करना होगा। सीरवर आंतरिक फाइलों को पार्स करने के बजाए अपनी खुद की एक बनाएं, या जो कुछ भी आपको चाहिए उसे बनाए रखने के लिए बेहतर डेटाबेस का उपयोग करें। – smentek

+0

php में स्मृति डेटा सत्र को सहेजने का विकल्प है। हमेशा हम उन्हें फाइलों से बाहर नहीं निकाल सकते हैं। – jondinham

+1

और अधिक, उन "ses_ *" फ़ाइलों को निर्देशिकाओं की एक बहु-स्तर संरचना के तहत रखा जा सकता है। यह php.net – jondinham

6

यहाँ एक अधिक संक्षिप्त तरीका संग्रहीत फ़ाइलों के माध्यम से सत्र की एक सूची प्राप्त करने के लिए है:

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

यह आप सभी सत्रों का डेटा, एक सरणी में संग्रहीत और सत्र 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); 
संबंधित मुद्दे