বর্ণনা

workerman 4.x সংস্করণ থেকে HTTP পরিষেবার সমর্থন শক্তিশালী করেছে। এতে অন্তর্ভুক্ত করা হয়েছে অনুরোধ ক্লাস, প্রতিক্রিয়া ক্লাস, সেশন ক্লাস এবং SSE। যদি আপনি workerman এর HTTP পরিষেবা ব্যবহার করতে চান, তাহলে workerman 4.x বা এর পরবর্তী উচ্চ সংস্করণ ব্যবহার করার সুপারিশ করা হচ্ছে।

লক্ষ্য করুন যে নিচের সবকিছু workerman 4.x সংস্করণের ব্যবহার, যা workerman 3.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 পদ্ধতি অবসান প্রাপ্ত সেশন ডেটা মুছে ফেলার জন্য ব্যবহৃত হয়, স্টোরেজকে শেষ সম্পাদনার সময় maxlifetime এর চেয়েও বড় সমস্ত সেশন মুছে ফেলতে হবে।
  • close এর জন্য কোনো ক্রিয়াকলাপের প্রয়োজন নেই, সরাসরি true ফেরত দিন।
  • open এর জন্য কোনো ক্রিয়াকলাপের প্রয়োজন নেই, সরাসরি true ফেরত দিন।

নিচের ড্রাইভার প্রতিস্থাপন

SessionHandlerInterface ইন্টারফেস বাস্তবায়নের পরে, নিম্নলিখিত পদ্ধতি ব্যবহার করে সেশন নিচের ড্রাইভার পরিবর্তন করুন।

Workerman\Protocols\Http\Session::handlerClass($class_name, $config);
  • $class_name হল SessionHandlerInterface ইন্টারফেসটি বাস্তবায়িত SessionHandler ক্লাসের নাম। যদি কোন নেমস্পেস থাকে তবে সম্পূর্ণ নেমস্পেস নিয়ে আসতে হবে।
  • $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]);
            }
        }
    }
}

//  সেশন হ্যান্ডলার ক্লাসে নতুন বাস্তবায়নের জন্য কিছু কনফিগারেশন প্রবেশ করাতে হবে ধরে নেবেন
$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();