설명
workerman은 4.x 버전부터 HTTP 서비스를 강화했습니다. 요청 클래스, 응답 클래스, 세션 클래스 및 SSE를 도입했습니다. workerman의 HTTP 서비스를 사용하려면 workerman 4.x 이상의 최신 버전을 사용하는 것을 강력히 권장합니다.
다음은 workerman 4.x 버전용 사용법이며, workerman 3.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::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::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::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::runAll();
세션 데이터 삭제
특정한 하나 또는 여러개의 세션 데이터를 삭제하려면 forget
메소드를 사용합니다.
$session = $request->session();
// 항목 하나 삭제
$session->forget('name');
// 다수 항목 삭제
$session->forget(['name', 'age']);
또한 시스템에서는 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::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::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::runAll();
해당 세션 데이터의 존재 여부 확인
$session = $request->session();
$has = $session->has('name');
해당 세션이 존재하지 않거나 세션 값이 null인 경우에는 false를 반환하고, 그렇지 않은 경우에는 true를 반환합니다.
$session = $request->session();
$has = $session->exists('name');
위 코드도 세션 데이터의 존재 여부를 확인하는 데 사용되며, 차이점은 해당 세션 항목 값이 null인 경우에도 true를 반환합니다.