Hinweis
Workerman hat ab Version 4.x die Unterstützung für HTTP-Dienste verbessert. Es wurden Klassen für Anfragen, Antworten, Sitzungen sowie SSE eingeführt. Wenn Sie die HTTP-Dienste von Workerman nutzen möchten, wird dringend empfohlen, Workerman 4.x oder höhere Versionen zu verwenden.
Bitte beachten Sie, dass die folgenden Beispiele für die Version 4.x von Workerman gelten und nicht mit Version 3.x kompatibel sind.
Ändern des Session-Speichermoduls
Workerman bietet ein Dateispeichermodul und ein Redis-Speichermodul für Sitzungen. Standardmäßig wird das Dateispeichermodul verwendet. Wenn Sie das Redis-Speichermodul verwenden möchten, lesen Sie den folgenden Code.
<?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-Konfiguration
$config = [
'host' => '127.0.0.1', // Erfordertes Parameter
'port' => 6379, // Erfordertes Parameter
'timeout' => 2, // Optionales Parameter
'auth' => '******', // Optionales Parameter
'database' => 1, // Optionales Parameter
'prefix' => 'session_' // Optionales Parameter
];
// Verwenden Sie die Methode Workerman\Protocols\Http\Session::handlerClass, um die zugrunde liegende Treiberklasse für die Sitzung zu ändern
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();
Festlegen des Speicherorts für Sitzungen
Wenn das Standard-Speichermodul verwendet wird, werden Sitzungsdaten standardmäßig auf der Festplatte gespeichert, der Standardort entspricht dem Rückgabewert von session_save_path().
Sie können den Speicherort mit der folgenden Methode ändern.
use Workerman\Worker;
use \Workerman\Protocols\Http\Session\FileSessionHandler;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
// Festlegen des Speicherorts für die Session-Dateien
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 ausführen
Worker::runAll();
Bereinigung von Sitzungdateien
Wenn das Standard-Speichermodul für Sitzungen verwendet wird, werden mehrere Sitzungsdateien auf der Festplatte vorhanden sein.
Workerman löscht abgelaufene Sitzungsdateien gemäß den in php.ini festgelegten Optionen session.gc_probability, session.gc_divisor und session.gc_maxlifetime. Weitere Informationen zu diesen drei Optionen finden Sie in der PHP-Dokumentation
Ändern des Speichermoduls
Neben dem Dateispeichermodul für Sitzungen und dem Redis-Speichermodul für Sitzungen erlaubt es Ihnen Workerman, neue Sitzungsspeichermodule über die Standard- SessionHandlerInterface-Schnittstelle hinzuzufügen, wie z.B. MongoDB-Speichermodule oder MySQL-Speichermodule.
Schritte zum Hinzufügen eines neuen Sitzungsspeichermoduls
- Implementieren Sie die SessionHandlerInterface-Schnittstelle.
- Verwenden Sie die Methode
Workerman\Protocols\Http\Session::handlerClass($class_name, $config), um die zugrunde liegende SessionHandler-Schnittstelle zu ersetzen.
Implementierung der SessionHandlerInterface-Schnittstelle
Ein benutzerdefinierter Sitzungsspeichermodul muss die SessionHandlerInterface-Schnittstelle implementieren. Diese Schnittstelle enthält die folgenden Methoden:
SessionHandlerInterface {
/* Methoden */
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
}
Erläuterungen zur SessionHandlerInterface
- Die read-Methode dient dazu, alle Sitzungsdaten, die der session_id entsprechen, aus dem Speicher zu lesen. Bitte führen Sie keine Deserialisierungsoperationen auf den Daten durch, das Framework erledigt dies automatisch.
- Die write-Methode dient dazu, Sitzungsdaten, die der session_id entsprechen, in den Speicher zu schreiben. Bitte führen Sie keine Serialisierungsoperationen auf den Daten durch, das Framework hat dies bereits automatisch erledigt.
- Die destroy-Methode dient dazu, die Sitzungsdaten, die der session_id entsprechen, zu löschen.
- Die gc-Methode dient dazu, abgelaufene Sitzungsdaten zu löschen; der Speicher sollte alle Sitzungen löschen, deren Änderungszeit größer als maxlifetime ist.
- Die close-Methode erfordert keine Maßnahmen, geben Sie einfach true zurück.
- Die open-Methode erfordert keine Maßnahmen, geben Sie einfach true zurück.
Ersetzen des zugrunde liegenden Treibers
Nachdem Sie die SessionHandlerInterface-Schnittstelle implementiert haben, verwenden Sie die folgende Methode, um den zugrunde liegenden Treiber für die Sitzung zu ändern.
Workerman\Protocols\Http\Session::handlerClass($class_name, $config);
- $class_name ist der Name der SessionHandler-Klasse, die die SessionHandlerInterface-Schnittstelle implementiert. Wenn es einen Namensraum gibt, muss der vollständige Namensraum angegeben werden.
- $config sind die Parameter des Konstruktors der SessionHandler-Klasse.
Konkrete Implementierung
Hinweis: Diese MySessionHandler-Klasse dient nur zu Illustrationszwecken zur Demonstration des Prozesses zur Änderung des Sitzungsspeichermoduls. MySessionHandler ist nicht für den Produktionsbetrieb geeignet.
<?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]);
}
}
}
}
// Angenommen, die neu implementierte SessionHandler-Klasse benötigt einige Konfigurationen
$config = ['host' => 'localhost'];
// Verwenden Sie Workerman\Protocols\Http\Session::handlerClass($class_name, $config), um die Treiberklasse für die Sitzung zu ändern
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();