在例子中,onMessage是一個(gè)協(xié)程,從這個(gè)協(xié)程進(jìn)入新的協(xié)Coroutine::create,這個(gè)新的協(xié)程結(jié)束后返回onMessage協(xié)程,然后通過(guò)context獲取user_info是成功,這樣做法與user_info保存到一個(gè)變量$user_info中,然后進(jìn)入新協(xié)程,協(xié)程結(jié)束后返回onMessage協(xié)程,照樣拿到$user_info的值,那context方式跟用變量保存方式好像沒(méi)什么區(qū)別?有沒(méi)有人知道context主要用在什么樣的場(chǎng)景呢?
<?php
use Workerman\Connection\TcpConnection;
use Workerman\Coroutine;
use Workerman\Coroutine\Context;
use Workerman\Events\Swoole;
use Workerman\Protocols\Http\Request;
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8001');
$worker->eventLoop = Swoole::class; // Or Swow::class or Fiber::class
$worker->onMessage = function (TcpConnection $connection, Request $request) {
// 在當(dāng)前協(xié)程設(shè)置context數(shù)據(jù)
Context::set('user_info', ['id' => 1, 'name' => 'name']);
// 新建協(xié)程
Coroutine::create(function () use ($connection) {
// 協(xié)程間context數(shù)據(jù)是隔離的,所以新協(xié)程里獲取的是null
$userInfo = Context::get('user_info');
var_dump($userInfo); // 輸出null
});
// 獲取當(dāng)前協(xié)程的context數(shù)據(jù)
$userInfo = Context::get('user_info'); // 得到['id' => 1, 'name' => 'name']
$connection->send(json_encode($userInfo));
};
$worker->onClose = function(TcpConnection $connection)use($worker,&$all_golbal_count)
{
echo json_encode(Context::get('user_info'))."\n";
echo connection closed."\n";
};
Worker::runAll();
?>