설명

workerman은 4.x 버전부터 HTTP 서비스 지원을 강화했습니다. 요청 클래스, 응답 클래스, 세션 클래스 및 SSE가 도입되었습니다. workerman의 HTTP 서비스를 사용하려면 workerman 4.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']);

또한 시스템은 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::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를 반환합니다.

주의 사항

세션 사용 시 불특정 소스에서 가져온 클래스의 인스턴스 객체를 직접 저장하는 것은 권장하지 않습니다. 역직렬화 시 잠재적인 위험을 초래할 수 있습니다.