Descrizione

Workerman a partire dalla versione 4.x ha potenziato il supporto per i servizi HTTP. Sono state introdotte le classi Request, Response, Session e SSE. Se desideri utilizzare i servizi HTTP di Workerman, è fortemente consigliato di utilizzare Workerman 4.x o versioni successive.

Ottenere l'oggetto sessione

$session = $request->session();

Esempio

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

$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'));
};

// Esegui il worker
Worker::runAll();

Avvertenze

  • La sessione deve essere manipolata prima della chiamata a $connection->send().
  • La sessione viene automaticamente salvata quando l'oggetto viene distrutto, quindi non memorizzare l'oggetto restituito da $request->session() in un array globale o in un campo di classe, altrimenti la sessione non verrà salvata.
  • La sessione è memorizzata per impostazione predefinita in un file sul disco; se desideri prestazioni migliori, si consiglia di utilizzare Redis.

Ottenere tutti i dati della sessione

$session = $request->session();
$all = $session->all();

Restituisce un array. Se non ci sono dati di sessione, restituisce un array vuoto.

Esempio

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

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

$worker->onMessage = function(TcpConnection $connection, Request $request)
{
    $session = $request->session();
    $session->set('name', 'tom');
    $connection->send(var_export($session->all(), true));
};

// Esegui il worker
Worker::runAll();

Ottenere un valore dalla sessione

$session = $request->session();
$name = $session->get('name');

Se il dato non esiste, restituisce null.

Puoi anche passare un valore di default come secondo parametro al metodo get; se non viene trovato un valore corrispondente nell'array di sessione, verrà restituito il valore di default. Ad esempio:

$session = $request->session();
$name = $session->get('name', 'tom');

Esempio

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

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

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

// Esegui il worker
Worker::runAll();

Memorizzare la sessione

Per memorizzare un determinato dato, utilizza il metodo set.

$session = $request->session();
$session->set('name', 'tom');

Il metodo set non restituisce un valore; la sessione viene automaticamente salvata quando l'oggetto sessione viene distrutto.

Quando si memorizzano più valori, si utilizza il metodo put.

$session = $request->session();
$session->put(['name' => 'tom', 'age' => 12]);

Allo stesso modo, put non restituisce un valore.

Esempio

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

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

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

// Esegui il worker
Worker::runAll();

Eliminare dati dalla sessione

Per eliminare uno o più dati dalla sessione, utilizza il metodo forget.

$session = $request->session();
// Eliminare un elemento
$session->forget('name');
// Eliminare più elementi
$session->forget(['name', 'age']);

Inoltre, il sistema fornisce il metodo delete, che a differenza di forget, può eliminare solo un elemento.

$session = $request->session();
// Equivalente a $session->forget('name');
$session->delete('name');

Esempio

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

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

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

// Esegui il worker
Worker::runAll();

Ottenere e eliminare un valore dalla sessione

$session = $request->session();
$name = $session->pull('name');

Il risultato è equivalente al seguente codice:

$session = $request->session();
$value = $session->get($name);
$session->delete($name);

Se la sessione corrispondente non esiste, restituisce null.

Esempio

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

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

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

// Esegui il worker
Worker::runAll();

Eliminare tutti i dati della sessione

$request->session()->flush();

Non restituisce valori; i dati della sessione vengono automaticamente eliminati dallo storage quando l'oggetto sessione viene distrutto.

Esempio

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

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

$worker->onMessage = function(TcpConnection $connection, Request $request)
{
    $request->session()->flush();
    $connection->send('ok');
};

// Esegui il worker
Worker::runAll();

Verificare se i dati della sessione esistono

$session = $request->session();
$has = $session->has('name');

Il codice di cui sopra restituisce false se la sessione corrispondente non esiste o il valore della sessione corrisponde a null, altrimenti restituisce true.

$session = $request->session();
$has = $session->exists('name');

Il codice di cui sopra è utilizzato anche per verificare se i dati della sessione esistono; la differenza è che quando il valore della sessione corrispondente è null, restituisce comunque true.

Avvertenze

Quando utilizzi le sessioni, non è consigliabile memorizzare direttamente oggetti istanza di classe, specialmente istanze di classi di origine non controllabile, poiché la deserializzazione potrebbe comportare rischi potenziali.