विवरण

workerman ने 4.x संस्करण से HTTP सेवाओं के समर्थन को बढ़ाया है। इसने अनुरोध वर्ग, प्रतिक्रिया वर्ग, सत्र वर्ग और SSE को पेश किया। यदि आप workerman की HTTP सेवाओं का उपयोग करना चाहते हैं, तो 4.x या उच्चतर संस्करण का उपयोग करने की स推荐 की जाती है।

ध्यान दें कि निम्नलिखित सभी workerman4.x संस्करण के उपयोग हैं, जो workerman3.x के साथ असंगत हैं।

सत्र भंडारण इंजन में बदलाव

workerman सत्र के लिए फ़ाइल भंडारण इंजन और redis भंडारण इंजन प्रदान करता है। डिफ़ॉल्ट रूप से फ़ाइल भंडारण इंजन का उपयोग किया जाता है। यदि आप redis भंडारण इंजन में बदलाव करना चाहते हैं, तो कृपया नीचे दिए गए कोड को देखें।

<?php
use Workerman\Worker;
use Workerman\Protocols\Http\Session;
use Workerman\Protocols\Http\Session\RedisSessionHandler;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('http://0.0.0.0:8080');

// redis कॉन्फ़िगरेशन
$config = [
    'host'     => '127.0.0.1', // आवश्यक पैरामीटर
    'port'     => 6379,        // आवश्यक पैरामीटर
    'timeout'  => 2,           // वैकल्पिक पैरामीटर
    'auth'     => '******',    // वैकल्पिक पैरामीटर
    'database' => 1,           // वैकल्पिक पैरामीटर
    'prefix'   => 'session_'   // वैकल्पिक पैरामीटर
];
// Workerman\Protocols\Http\Session::handlerClass विधि का उपयोग करके सत्र के आधारभूत संचालक वर्ग को बदलें
Session::handlerClass(RedisSessionHandler::class, $config);

$worker->onMessage = function(TcpConnection $connection, Request $request)
{
    $session = $request->session();
    $session->set('somekey', rand());
    $connection->send($session->get('somekey'));
};

Worker::runAll();

सत्र भंडारण स्थान सेट करना

डिफ़ॉल्ट भंडारण इंजन का उपयोग करते समय, सत्र डेटा डिफ़ॉल्ट रूप से डिस्क में संग्रहीत होता है, और डिफ़ॉल्ट स्थान session_save_path() के लौटाए गए स्थान पर होता है।
आप निम्नलिखित विधियों का उपयोग करके भंडारण स्थान बदल सकते हैं।

use Workerman\Worker;
use \Workerman\Protocols\Http\Session\FileSessionHandler;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';

// सत्र फ़ाइल भंडारण स्थान सेट करें
FileSessionHandler::sessionSavePath('/tmp/session');

$worker = new Worker('http://0.0.0.0:8080');

$worker->onMessage = function(TcpConnection $connection, Request $request)
{
    $session = $request->session();
    $session->set('name', 'tome');
    $connection->send($session->get('name'));
};

// वर्कर चलाएँ
Worker::runAll();

सत्र फ़ाइल सफाई

डिफ़ॉल्ट सत्र भंडारण इंजन का उपयोग करते समय डिस्क पर कई सत्र फ़ाइलें होंगी,
workerman फ़ाइलों को साफ़ करने के लिए php.ini में सेट किए गए session.gc_probability session.gc_divisor session.gc_maxlifetime विकल्पों का उपयोग करेगा। इन तीन विकल्पों के विवरण के लिए कृपया php मैनुअल देखें।

भंडारण संचालक में बदलाव

फ़ाइल सत्र भंडारण इंजन और redis सत्र भंडारण इंजन के अलावा, workerman आपको मानक SessionHandlerInterface इंटरफ़ेस के माध्यम से नए सत्र भंडारण इंजन जोड़ने की अनुमति देता है, जैसे कि mangoDb सत्र भंडारण इंजन, MySQL सत्र भंडारण इंजन आदि।

नए सत्र भंडारण इंजन के जोड़ने की प्रक्रिया

  1. SessionHandlerInterface इंटरफ़ेस को लागू करें
  2. Workerman\Protocols\Http\Session::handlerClass($class_name, $config) विधि का उपयोग करके आधारभूत SessionHandler इंटरफ़ेस का स्थानांतरण करें

SessionHandlerInterface इंटरफ़ेस का कार्यान्वयन

अनुकूलित सत्र भंडारण संचालक को SessionHandlerInterface इंटरफ़ेस लागू करना आवश्यक है। इस इंटरफ़ेस में निम्नलिखित विधियाँ शामिल हैं:

SessionHandlerInterface {
    /* विधियाँ */
    abstract public read ( string $session_id ) : string
    abstract public write ( string $session_id , string $session_data ) : bool
    abstract public destroy ( string $session_id ) : bool
    abstract public gc ( int $maxlifetime ) : int
    abstract public close ( void ) : bool
    abstract public open ( string $save_path , string $session_name ) : bool
}

SessionHandlerInterface विवरण

  • read विधि भंडारण से session_id से जुड़े सभी सत्र डेटा को पढ़ने के लिए उपयोग की जाती है। कृपया डेटा का प्रत्यावर्तन न करें, फ्रेमवर्क इसे स्वचालित रूप से पूरा करेगा।
  • write विधि भंडारण में session_id से जुड़े सत्र डेटा को लिखने के लिए उपयोग की जाती है। कृपया डेटा का अनुक्रमण न करें, फ्रेमवर्क इसे स्वचालित रूप से पूरा कर चुका है।
  • destroy विधि session_id से संबंधित सत्र डेटा को नष्ट करने के लिए उपयोग की जाती है।
  • gc विधि पुरानी सत्र डेटा को हटाने के लिए उपयोग की जाती है, भंडारण को तारीख की तुलना में अधिक निश्चित समय वाली सभी सत्रों को हटाने का आदेश देना चाहिए
  • close को कोई कार्रवाई करने की आवश्यकता नहीं है, बस true लौटाएँ
  • open को कोई कार्रवाई करने की आवश्यकता नहीं है, बस true लौटाएँ

आधारभूत संचालक का स्थानांतरण

SessionHandlerInterface इंटरफ़ेस लागू करने के बाद, नीचे दी गई विधि का उपयोग करके सत्र के आधारभूत संचालक को बदलें।

Workerman\Protocols\Http\Session::handlerClass($class_name, $config);
  • $class_name उस SessionHandler वर्ग का नाम है जो SessionHandlerInterface इंटरफ़ेस को लागू करता है। यदि कोई नामस्थान है, तो इसे पूर्ण नामस्थान के साथ शामिल किया जाना चाहिए
  • $config उस SessionHandler वर्ग के कंस्ट्रक्टर के पैरामीटर हैं

विशिष्ट कार्यान्वयन

ध्यान दें, यह MySessionHandler वर्ग केवल सत्र के आधारभूत व्यापार के संचालन को स्पष्ट करने के लिए है, MySessionHandler का उत्पादन वातावरण में उपयोग नहीं किया जा सकता है।

<?php
use Workerman\Worker;
use Workerman\Protocols\Http\Session;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('http://0.0.0.0:8080');

class MySessionHandler implements SessionHandlerInterface
{
    protected static $store = [];

    public function __construct($config) {
        // ['host' => 'localhost']
        var_dump($config);
    }

    public function open($save_path, $name)
    {
        return true;
    }

    public function read($session_id)
    {
        return isset(static::$store[$session_id]) ? static::$store[$session_id]['content'] : '';
    }

    public function write($session_id, $session_data)
    {
        static::$store[$session_id] = ['content' => $session_data, 'timestamp' => time()];
    }

    public function close()
    {
        return true;
    }

    public function destroy($session_id)
    {
        unset(static::$store[$session_id]);
        return true;
    }

    public function gc($maxlifetime) {
        $time_now = time();
        foreach (static::$store as $session_id => $info) {
            if ($time_now - $info['timestamp'] > $maxlifetime) {
                unset(static::$store[$session_id]);
            }
        }
    }
}

//  मान लें कि नए लागू किए गए SessionHandler वर्ग को कुछ सेटिंग्स की आवश्यकता है
$config = ['host' => 'localhost'];
//  Workerman\Protocols\Http\Session::handlerClass($class_name, $config) का उपयोग करके सत्र के आधारभूत संचालक को बदलें
Session::handlerClass(MySessionHandler::class, $config);

$worker->onMessage = function(TcpConnection $connection, Request $request)
{
    $session = $request->session();
    $session->set('somekey', rand());
    $connection->send($session->get('somekey'));
};

Worker::runAll();