Descrizione

A partire dalla versione 4.x, workerman ha rafforzato il supporto ai servizi HTTP. Ha introdotto una classe di richiesta, una classe di risposta, una classe di sessione e SSE. Se desideri utilizzare il servizio HTTP di workerman, ti consigliamo vivamente di utilizzare la versione 4.x o versioni successive.

Si noti che quanto segue si riferisce all'uso della versione 4.x di workerman e non è compatibile con la versione 3.x.

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();

Note

  • La sessione deve essere gestita prima della chiamata $connection->send().
  • La sessione verrà automaticamente salvata quando l'oggetto viene distrutto, quindi non salvare l'oggetto restituito da $request->session() in un array globale o nell'attributo di una classe, altrimenti la sessione potrebbe non essere salvata correttamente.
  • Per impostazioni predefinite, la sessione viene archiviata su file su disco, ma per 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 specifico dalla sessione

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

Restituisce null se i dati non esistono.

È anche possibile passare un valore predefinito al metodo get. Se l'array di sessione non contiene il valore corrispondente, verrà restituito il valore predefinito. 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

Usa il metodo set per memorizzare un dato specifico nella sessione.

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

Il metodo set non restituisce alcun valore, e la sessione verrà salvata automaticamente quando l'oggetto sessione viene distrutto.

Per memorizzare più valori, utilizzare il metodo put.

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

Anche in questo caso, il metodo put non restituisce alcun 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 i dati della sessione

Per eliminare uno o più dati della sessione, utilizzare il metodo forget.

$session = $request->session();
// Elimina un dato
$session->forget('name');
// Elimina più dati
$session->forget(['name', 'age']);

Inoltre, esiste il metodo delete che, a differenza del metodo forget, può eliminare solo un elemento.

$session = $request->session();
// Equivale 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 cancellare un valore specifico della sessione

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

Il risultato è lo stesso di questo codice

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

Se la sessione corrispondente non esiste, verrà restituito 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 alcun valore, e la sessione verrà automaticamente rimossa 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 un dato della sessione esiste

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

Se la sessione corrispondente non esiste o se il valore è null, restituirà false, altrimenti restituirà true.

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

Anche questo codice viene utilizzato per verificare se esiste un dato della sessione, l'unica differenza è che restituirà true anche se il valore dell'elemento della sessione è null.