說明

workerman從4.x版本開始加強了HTTP服務的支持。引入了請求類、響應類、session類以及SSE。如果你想使用workerman的HTTP服務,強烈推薦使用workerman4.x或者以後的更高版本。

獲取session對象

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

注意事項

  • session必須在$connection->send()調用之前操作。
  • session在對象銷毀時會自動保存修改,所以不要把$request->session()返回的對象保存在全局數組或者類成員中導致session無法保存。
  • session默認存儲在磁盤文件中,如果想要更好的性能建議使用redis。

獲取所有session數據

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

返回的是一個數組。如果沒有任何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', 'tom');
    $connection->send(var_export($session->all(), true));
};

// 運行worker
Worker::runAll();

獲取session中某個值

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

如果數據不存在則返回null。

你也可以給get方法第二個參數傳遞一個默認值,如果session數組中沒找到對應值則返回默認值。例如:

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

儲存session

儲存某一項數據時用set方法。

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

set沒有返回值,session對象銷毀時session會自動保存。

當儲存多個值時使用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();

刪除session數據

刪除某個或者某些session數據時用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某個值

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

效果與如下代碼相同

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

如果對應session不存在,則返回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();

刪除所有session數據

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

沒有返回值,session對象銷毀時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)
{
    $request->session()->flush();
    $connection->send('ok');
};

// 運行worker
Worker::runAll();

判斷對應session數據是否存在

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

以上當對應的session不存在或者對應的session值為null時返回false,否則返回true。

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

以上代碼也是用來判斷session數據是否存在,區別時當對應的session項值為null時,也返回true。

注意事項

在使用 session 時不建議直接儲存類的實例對象,尤其是來源不可控的類實例,反序列化時可能造成潛在風險。