Açıklama

workerman 4.x sürümünden itibaren HTTP servisi desteğini güçlendirdi. İstemci sınıfı, yanıt sınıfı, oturum sınıfı ve SSE tanıtıldı. Eğer workerman'ın HTTP hizmetini kullanmak istiyorsanız, workerman 4.x veya daha yüksek bir sürümü kullanmanızı öneririz.

Aşağıdakilerin tamamı workerman 4.x sürümünün kullanım şeklidir, workerman 3.x ile uyumlu değildir.

Oturum depolama motorunu değiştirme

workerman, oturum için dosya depolama motoru ve redis depolama motoru sunar. Varsayılan olarak dosya depolama motoru kullanılır. Eğer redis depolama motoru olarak değiştirmek istiyorsanız, aşağıdaki kodu dikkate alabilirsiniz.

<?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 yapılandırması
$config = [
    'host'     => '127.0.0.1', // Zorunlu parametre
    'port'     => 6379,        // Zorunlu parametre
    'timeout'  => 2,           // Opsiyonel parametre
    'auth'     => '******',    // Opsiyonel parametre
    'database' => 1,           // Opsiyonel parametre
    'prefix'   => 'session_'   // Opsiyonel parametre
];
// Oturumun alt sürücü sınıfını değiştirmek için Workerman\Protocols\Http\Session::handlerClass yöntemini kullanın
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();

Oturum depolama konumunu ayarlama

Varsayılan depolama motorunu kullanırken, oturum verileri varsayılan olarak diskte saklanır, varsayılan konum session_save_path()'in geri döndüğü yerdir.
Depolama konumunu değiştirmek için aşağıdaki yöntemi kullanabilirsiniz.

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

// Oturum dosya depolama konumunu ayarlama
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'ı çalıştırma
Worker::runAll();

Oturum dosyalarını temizleme

Varsayılan oturum depolama motorunu kullanırken disk üzerinde birçok oturum dosyası olacaktır,
workerman, php.ini'de ayarlanan session.gc_probability, session.gc_divisor, session.gc_maxlifetime seçeneklerine göre süresi dolmuş oturum dosyalarını temizler. Bu üç seçenek hakkında açıklama için php belgesine bakın.

Depolama sürücüsünü değiştirme

Dosya oturum depolama motoru ve redis oturum depolama motoru dışında, workerman, standart SessionHandlerInterface arabirimi aracılığıyla yeni oturum depolama motorları eklemenize olanak tanır; örneğin, mangoDb oturum depolama motoru, MySQL oturum depolama motoru gibi.

Yeni oturum depolama motoru ekleme süreci

  1. SessionHandlerInterface arabirimini uygulayın.
  2. Workerman\Protocols\Http\Session::handlerClass($class_name, $config) yöntemini kullanarak alt seviye SessionHandler arabirimini değiştirin.

SessionHandlerInterface arabiriminin uygulanması

Özelleştirilmiş oturum depolama sürücüsü, SessionHandlerInterface arabirimini uygulamalıdır. Bu arabirim aşağıdaki yöntemleri içerir:

SessionHandlerInterface {
    /* Yöntemler */
    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 açıklaması

  • read yöntemi, depolama alanından session_id ile ilişkilendirilmiş tüm oturum verilerini okumak için kullanılır. Lütfen verilere serileştirme işlemi yapmayın, çerçeve bunu otomatik olarak tamamlayacaktır.
  • write yöntemi, depolama alanına session_id ile ilişkilendirilmiş oturum verilerini yazmak için kullanılır. Lütfen verilere serileştirme işlemi yapmayın, çerçeve bunu otomatik olarak tamamlamıştır.
  • destroy yöntemi, session_id ile ilişkilendirilmiş oturum verilerini yok etmek için kullanılır.
  • gc yöntemi, süresi dolmuş oturum verilerini silmek için kullanılır, depolama alanı, son değişiklik tarihinin maxlifetime'dan büyük olduğu tüm oturumları silmelidir.
  • close, herhangi bir işlem gerektirmez, doğrudan true döndürmek yeterlidir.
  • open, herhangi bir işlem gerektirmez, doğrudan true döndürmek yeterlidir.

Alt sürücüyü değiştirme

SessionHandlerInterface arabirimini tamamladıktan sonra, aşağıdaki yöntemi kullanarak oturumun alt sürücüsünü değiştirebilirsiniz.

Workerman\Protocols\Http\Session::handlerClass($class_name, $config);
  • $class_name, SessionHandlerInterface arabirimini uygulayan SessionHandler sınıfının adıdır. Eğer bir ad alanı varsa tam ad alanı ile birlikte yazılmalıdır.
  • $config, SessionHandler sınıfının yapılandırıcı fonksiyonunun parametreleridir.

Örnek uygulama

Dikkat, bu MySessionHandler sınıfı yalnızca oturumun alt sürücüsünü değiştirme sürecini açıklamak içindir; MySessionHandler üretim ortamında kullanılamaz.

<?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]);
            }
        }
    }
}

//  Yeni uygulanan SessionHandler sınıfının bazı yapılandırmalara ihtiyaç duyduğunu varsayalım
$config = ['host' => 'localhost'];
//  Oturumun alt sürücüsünü değiştirmek için Workerman\Protocols\Http\Session::handlerClass($class_name, $config) kullanın
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();