説明
workermanは4.xバージョンからHTTPサービスのサポートを強化しました。リクエストクラス、レスポンスクラス、sessionクラス、及びSSEが導入されました。workermanのHTTPサービスを使用する場合は、workerman4.xまたはそれ以降のバージョンを強く推奨します。
セッションオブジェクトの取得
$session = $request->session();
例
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'));
};
// workerの実行
Worker::runAll();
注意事項
- セッションは
$connection->send()の呼び出しより前に操作しなければなりません。 - オブジェクトが破棄される時に、セッションは自動的に変更を保存するので、
$request->session()から返されたオブジェクトをグローバル配列やクラスメンバーに保存して、セッションが保存されないようにしないでください。 - セッションはデフォルトでディスクファイルに保存されます。より良いパフォーマンスを望む場合はredisの使用をお勧めします。
すべてのセッションデータの取得
$session = $request->session();
$all = $session->all();
返されるのは配列です。セッションデータがない場合は空の配列が返されます。
例
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));
};
// workerの実行
Worker::runAll();
セッションの特定の値の取得
$session = $request->session();
$name = $session->get('name');
データが存在しない場合はnullが返されます。
getメソッドに第二引数でデフォルト値を渡すこともできます。セッション配列に対応する値が見つからない場合はデフォルト値が返されます。例えば:
$session = $request->session();
$name = $session->get('name', 'tom');
例
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'));
};
// workerの実行
Worker::runAll();
セッションの保存
特定のデータを保存するにはsetメソッドを使用します。
$session = $request->session();
$session->set('name', 'tom');
setは返り値を持たず、セッションオブジェクトが破棄される時に自動的にセッションが保存されます。
複数の値を保存する場合はputメソッドを使用します。
$session = $request->session();
$session->put(['name' => 'tom', 'age' => 12]);
同様に、putも返り値を持ちません。
例
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'));
};
// workerの実行
Worker::runAll();
セッションデータの削除
特定のまたは複数のセッションデータを削除するにはforgetメソッドを使用します。
$session = $request->session();
// 一項目の削除
$session->forget('name');
// 複数項目の削除
$session->forget(['name', 'age']);
また、システムはdeleteメソッドも提供しています。forgetメソッドとの違いは、deleteは一項目のみを削除できます。
$session = $request->session();
// $session->forget('name')と同じ
$session->delete('name');
例
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');
};
// workerの実行
Worker::runAll();
セッションの特定の値の取得と削除
$session = $request->session();
$name = $session->pull('name');
効果は以下のコードと同じです。
$session = $request->session();
$value = $session->get($name);
$session->delete($name);
対応するセッションが存在しない場合はnullが返されます。
例
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'));
};
// workerの実行
Worker::runAll();
すべてのセッションデータの削除
$request->session()->flush();
返り値はなく、セッションオブジェクトが破棄される時にセッションが自動的にストレージから削除されます。
例
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');
};
// workerの実行
Worker::runAll();
対応するセッションデータの存在確認
$session = $request->session();
$has = $session->has('name');
この場合、対応するセッションが存在しないか、対応するセッションの値がnullの場合はfalseが返され、それ以外の場合はtrueが返されます。
$session = $request->session();
$has = $session->exists('name');
上記のコードもセッションデータの存在を確認するためのもので、対応するセッション項目の値がnullの場合にもtrueが返されます。
注意事項
セッションを使用する際には、特に制御できないクラスインスタンスの実例を直に保存することは推奨されません。デシリアライズ時に潜在的なリスクを引き起こす可能性があります。