ملاحظات

منذ إصدار 4.x، عزز Workerman دعم خدمة HTTP. تم تقديم فئات الطلب والاستجابة والجلسة بالإضافة إلى SSE. إذا كنت ترغب في استخدام خدمة HTTP الخاصة بـ Workerman، يُوصى بشدة باستخدام 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 القياسية، مثل محرك تخزين جلسة MongoDB، ومحرك تخزين جلسة MySQL، إلخ.

خطوات إضافة محرك تخزين جلسة جديدة

  1. تنفيذ واجهة SessionHandlerInterface
  2. استخدام طريقة Workerman\Protocols\Http\Session::handlerClass($class_name, $config) لاستبدال واجهة SessionHandler الأساسية

تنفيذ واجهة SessionHandlerInterface

يجب تنفيذ محرك تخزين الجلسة المخصص واجهة SessionHandlerInterface. تحتوي هذه الواجهة على الطرق التالية:

SessionHandlerInterface {
    /* Methods */
    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 هو اسم فئة 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();