7

मेरे पास एक PHP वेबस्केट सर्वर है (https://github.com/lemmingzshadow/php-websocket/)।

जब कोई उपयोगकर्ता कनेक्ट होता है, तो मैं कुछ सत्र डेटा सेट/प्राप्त करना चाहता हूं।

समस्या यह है कि मैं $_SESSION का उपयोग नहीं कर सकता क्योंकि अगर मैं ऐसा करता हूं, तो क्लाइंट के सत्र के बजाय मुझे अपने वेबसाईट सर्वर का सत्र मिलता है।

मैं ग्राहकों की SESSID पाने में कामयाब रहे है

private function handshake($data) { 
    $this->log('Performing handshake'); 
    if(preg_match("/PHPSESSID=(.*?)(?:;|\r\n)/", $data, $matches)){ 
     $sessid = $matches[1]; 
    } 
    /* Do handshake */ 
} 

लेकिन अब मुझे लगता है कि SESSID से संबंधित सत्र डेटा प्राप्त करने के लिए कैसे पता नहीं है।

+2

लग रहा है। –

+0

@StevenV लेकिन, क्या मुझे अपने स्वयं के डीबी का उपयोग करना चाहिए, या क्या मैं डीबी तक पहुंच सकता हूं जहां php सत्र डेटा सहेजता है? – Oriol

+0

क्लाइंट सॉकेट पर अपना सत्र आईडी भेजता है, तो आप session_start –

उत्तर

5

ऐसा लगता है कि मैं इसे हल कर लिया है (लेकिन मैं और अधिक परीक्षण करने के लिए है):

private function handshake($data) { 
    $this->log('Performing handshake'); 
    if(preg_match("/PHPSESSID=(.*?)(?:;|\r\n)/", $data, $matches)){ 
     $this->sessID = $matches[1]; 
     session_id($this->sessID); 
     @session_start(); 
     if(isset($_SESSION['userName'])){ 
      $this->userName = $_SESSION['userName']; 
     }else{ 
      $_SESSION['userName'] = $this->userName; 
     } 
     session_write_close(); 
    }else{ 
     $this->log('No SESSID');  
     return false; 
    } 
    /* Do handshake */ 
} 

और सत्र कुकीज़ सक्षम करने के लिए, मेरे मुवक्किल पेज index.php

<?php 
session_start(); 
?> 
<!DOCTYPE html> 
<!-- Page's HTML --> 

स्पष्टीकरण पर

सबसे पहले, मैं session_id का उपयोग करता हूं ताकि निम्नलिखित session_start() मुझे दिए गए एसईएस से संबंधित सत्र दे सिड।

फिर, मैं सत्र शुरू करने के लिए @session_start() का उपयोग कर सकता हूं। यह @ जरूरत है क्योंकि WebSocket सर्वर पहले से ही शुरू कर दिया है, इसलिए का उपयोग नहीं कर यह पैदा करता है:

  • पीएचपी चेतावनी: session_start(): सत्र कुकी नहीं भेज सकता - हेडर पहले ही भेजा
  • पीएचपी चेतावनी: session_start(): नहीं भेजा जा सकता सत्र कैश सीमक - हेडर पहले ही

भेजा अब मैं क्या मैं $_SESSION साथ चाहते हैं कर सकते हैं।

अंत में, मैं सत्र बंद करने के लिए session_write_close() का उपयोग करता हूं। यह इस्तेमाल किया जाना चाहिए क्योंकि:

  • session_idsession_start() से पहले बुलाया जाना चाहिए। यदि सत्र बंद नहीं होता है, जब कोई दूसरा क्लाइंट कनेक्ट होता है, तो एक सत्र पहले ही खुल जाएगा, इसलिए session_id काम नहीं करेगा।

  • सत्र लॉकिंग से बचने के लिए। जैसा कि @ स्वेन ने कहा, केवल PHP का एक उदाहरण हो सकता है जिसमें सत्र फ़ाइल तक पहुंच हो। चूंकि वेबसाईट सर्वर की स्क्रिप्ट लंबे समय तक चलनी चाहिए, एक बार यह सत्र खोलने के बाद, यदि आप इसे बंद नहीं करते हैं तो आप अन्य स्क्रिप्ट में सत्र का उपयोग नहीं कर सकते हैं। की तरह आपको लगता है कि आपको दो के बीच सत्र साझा करने के लिए अनुमति देता है सत्र डेटाबेस में किसी प्रकार का जरूरत

+0

के साथ हल किया है बहुत बहुत धन्यवाद !! :) –

+0

@Oriol आप 'session_start ([' read_and_close '=> true]) का भी उपयोग कर सकते हैं;' सत्र को तुरंत बंद करने और सत्र लॉकिंग से बचने के लिए। – ubomb

+0

@ ओरियल एर ... कभी नहीं। दस्तावेज़ों में ऐसा करने का दावा है, लेकिन ऐसा लगता है कि यह अभी भी परीक्षण के दौरान इसे खुला रखता है। 'session_write_close(); हालांकि मेरे परीक्षण में काम करता है। – ubomb

संबंधित मुद्दे