說明
workerman從4.x版本開始加強(qiáng)了HTTP服務(wù)的支持。引入了請求類、響應(yīng)類、session類以及SSE。如果你想使用workerman的HTTP服務(wù),強(qiáng)烈推薦使用workerman4.x或者以后的更高版本。
注意以下都是workerman4.x版本的用法,不兼容workerman3.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'));
};
// 運(yùn)行worker
Worker::runAll();
注意事項(xiàng)
- session必須在
$connection->send()
調(diào)用之前操作。 - session在對象銷毀時(shí)會(huì)自動(dòng)保存修改,所以不要把
$request->session()
返回的對象保存在全局?jǐn)?shù)組或者類成員中導(dǎo)致session無法保存。 - session默認(rèn)存儲(chǔ)在磁盤文件中,如果想要更好的性能建議使用redis。
獲取所有session數(shù)據(jù)
$session = $request->session();
$all = $session->all();
返回的是一個(gè)數(shù)組。如果沒有任何session數(shù)據(jù),則返回一個(gè)空數(shù)組。
例子
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));
};
// 運(yùn)行worker
Worker::runAll();
獲取session中某個(gè)值
$session = $request->session();
$name = $session->get('name');
如果數(shù)據(jù)不存在則返回null。
你也可以給get方法第二個(gè)參數(shù)傳遞一個(gè)默認(rèn)值,如果session數(shù)組中沒找到對應(yīng)值則返回默認(rèn)值。例如:
$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'));
};
// 運(yùn)行worker
Worker::runAll();
存儲(chǔ)session
存儲(chǔ)某一項(xiàng)數(shù)據(jù)時(shí)用set方法。
$session = $request->session();
$session->set('name', 'tom');
set沒有返回值,session對象銷毀時(shí)session會(huì)自動(dòng)保存。
當(dāng)存儲(chǔ)多個(gè)值時(shí)使用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'));
};
// 運(yùn)行worker
Worker::runAll();
刪除session數(shù)據(jù)
刪除某個(gè)或者某些session數(shù)據(jù)時(shí)用forget
方法。
$session = $request->session();
// 刪除一項(xiàng)
$session->forget('name');
// 刪除多項(xiàng)
$session->forget(['name', 'age']);
另外系統(tǒng)提供了delete方法,與forget方法區(qū)別是,delete只能刪除一項(xiàng)。
$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');
};
// 運(yùn)行worker
Worker::runAll();
獲取并刪除session某個(gè)值
$session = $request->session();
$name = $session->pull('name');
效果與如下代碼相同
$session = $request->session();
$value = $session->get($name);
$session->delete($name);
如果對應(yīng)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'));
};
// 運(yùn)行worker
Worker::runAll();
刪除所有session數(shù)據(jù)
$request->session()->flush();
沒有返回值,session對象銷毀時(shí)session會(huì)自動(dòng)從存儲(chǔ)中刪除。
例子
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');
};
// 運(yùn)行worker
Worker::runAll();
判斷對應(yīng)session數(shù)據(jù)是否存在
$session = $request->session();
$has = $session->has('name');
以上當(dāng)對應(yīng)的session不存在或者對應(yīng)的session值為null時(shí)返回false,否則返回true。
$session = $request->session();
$has = $session->exists('name');
以上代碼也是用來判斷session數(shù)據(jù)是否存在,區(qū)別時(shí)當(dāng)對應(yīng)的session項(xiàng)值為null時(shí),也返回true。