설명

workerman은 4.x 버전부터 HTTP 서비스 지원을 강화했습니다. 요청 클래스, 응답 클래스, 세션 클래스 및 SSE를 도입했습니다. workerman의 HTTP 서비스를 사용하려면 workerman 4.x 또는 이후의 높은 버전을 사용하는 것을 강력히 권장합니다.

다음은 모두 workerman 4.x 버전의 사용법이며, workerman 3.x와 호환되지 않습니다.

요청 객체 얻기

요청 객체는 onMessage 콜백 함수 내에서만 얻을 수 있으며, 프레임워크는 Request 객체를 콜백 함수의 두 번째 매개변수로 자동으로 전달합니다.

예제

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는 요청 객체이며, 여기서는 요청 객체를 사용하여 브라우저에 hello를 반환합니다.
    $connection->send("hello");
};

// 워커 실행
Worker::runAll();

브라우저가 http://127.0.0.1:8080에 접근하면 hello를 반환합니다.

요청 파라미터 get 얻기

전체 get 배열 얻기

$get = $request->get();

요청에 get 파라미터가 없으면 빈 배열을 반환합니다.

get 배열의 특정 값 얻기

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

get 배열에 해당 값이 없으면 null을 반환합니다.

두 번째 매개변수로 기본값을 전달할 수 있으며, get 배열에 값을 찾지 못하면 기본값을 반환합니다. 예를 들어:

$name = $request->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)
{
    $connection->send($request->get('name'));
};

// 워커 실행
Worker::runAll();

브라우저가 http://127.0.0.1:8080?name=jerry&age=12에 접근하면 jerry를 반환합니다.

요청 파라미터 post 얻기

전체 post 배열 얻기

$post = $request->post();

요청에 post 파라미터가 없으면 빈 배열을 반환합니다.

post 배열의 특정 값 얻기

$name = $request->post('name');

post 배열에 해당 값이 없으면 null을 반환합니다.

get 메서드와 마찬가지로 post 메서드의 두 번째 매개변수로 기본값을 전달할 수 있으며, post 배열에서 값을 찾지 못하면 기본값을 반환합니다. 예를 들어:

$name = $request->post('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)
{
    $post = $request->post();
    $connection->send(var_export($post, true));
};

// 워커 실행
Worker::runAll();

원시 요청 post 본문 얻기

$post = $request->rawBody();

이 기능은 php-fpmfile_get_contents("php://input");와 유사합니다. HTTP 원시 요청 본문을 얻는 데 사용됩니다. 이는 application/x-www-form-urlencoded가 아닌 형식의 post 요청 데이터를 얻을 때 유용합니다.

예제

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)
{
    $post = json_decode($request->rawBody());
    $connection->send('hello');
};

// 워커 실행
Worker::runAll();

헤더 얻기

전체 헤더 배열 얻기

$headers = $request->header();

요청에 헤더 파라미터가 없으면 빈 배열을 반환합니다. 모든 키는 소문자입니다.

헤더 배열의 특정 값 얻기

$host = $request->header('host');

헤더 배열에 해당 값이 없으면 null을 반환합니다. 모든 키는 소문자입니다.

get 메서드와 마찬가지로 header 메서드의 두 번째 매개변수로 기본값을 전달할 수 있으며, 헤더 배열에 값을 찾지 못하면 기본값을 반환합니다. 예를 들어:

$host = $request->header('host', 'localhost');

예제

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)
{
    if ($request->header('connection') === 'keep-alive') {
        $connection->send('hello');
    } else {
        $connection->close('hello');
    }    
};

// 워커 실행
Worker::runAll();

쿠키 얻기

전체 쿠키 배열 얻기

$cookies = $request->cookie();

요청에 쿠키 파라미터가 없으면 빈 배열을 반환합니다.

쿠키 배열의 특정 값 얻기

$name = $request->cookie('name');

쿠키 배열에 해당 값이 없으면 null을 반환합니다.

get 메서드와 마찬가지로 cookie 메서드의 두 번째 매개변수로 기본값을 전달할 수 있으며, 쿠키 배열에 값을 찾지 못하면 기본값을 반환합니다. 예를 들어:

$name = $request->cookie('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)
{
    $cookie = $request->cookie();
    $connection->send(var_export($cookie, true));
};

// 워커 실행
Worker::runAll();

업로드 파일 얻기

전체 업로드 파일 배열 얻기

$files = $request->file();

반환된 파일 형식은 다음과 유사합니다:

array (
    'avatar' => array (
            'name' => '123.jpg',
            'tmp_name' => '/tmp/workerman.upload.9hjR4w',
            'size' => 1196127,
            'error' => 0,
            'type' => 'application/octet-stream',
      ),
     'anotherfile' =>  array (
            'name' => '456.txt',
            'tmp_name' => '/tmp/workerman.upload.9sirSws',
            'size' => 490,
            'error' => 0,
            'type' => 'text/plain',
      )
)

여기서:

  • name은 파일 이름
  • tmp_name은 디스크 임시 파일 위치
  • size는 파일 크기
  • error는 오류 코드
  • type은 파일 mime 유형입니다.

주의:

  • 업로드 파일 크기는 defaultMaxPackageSize 제한을 받으며, 기본값은 10M이고 수정할 수 있습니다.

  • 요청이 끝난 후 파일은 자동으로 삭제됩니다.

  • 요청에 업로드된 파일이 없는 경우 빈 배열을 반환합니다.

특정 업로드 파일 얻기

$avatar_file = $request->file('avatar');

반환된 형식은 다음과 유사합니다:

array (
        'name' => '123.jpg',
        'tmp_name' => '/tmp/workerman.upload.9hjR4w',
        'size' => 1196127,
        'error' => 0,
        'type' => 'application/octet-stream',
  )

업로드 파일이 없으면 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)
{
    $file = $request->file('avatar');
    if ($file && $file['error'] === UPLOAD_ERR_OK) {
        rename($file['tmp_name'], '/home/www/web/public/123.jpg');
        $connection->send('ok');
        return;
    }
    $connection->send('upload fail');
};

// 워커 실행
Worker::runAll();

호스트 얻기

요청의 호스트 정보를 얻습니다.

$host = $request->host();

요청 주소가 비표준 80 또는 443 포트인 경우, 호스트 정보는 포트를 포함할 수 있습니다. 예: example.com:8080. 포트를 포함하지 않으려면 첫 번째 매개변수에 true를 전달할 수 있습니다.

$host = $request->host(true);

예제

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->host());
};

// 워커 실행
Worker::runAll();

브라우저가 http://127.0.0.1:8080?name=tom에 접근하면 127.0.0.1:8080을 반환합니다.

요청 메서드 얻기

$method = $request->method();

반환 값은 GETPOSTPUTDELETEOPTIONSHEAD 중 하나일 수 있습니다.

예제

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->method());
};

// 워커 실행
Worker::runAll();

요청 URI 얻기

$uri = $request->uri();

요청의 URI를 반환하며, path와 queryString 부분을 포함합니다.

예제

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->uri());
};

// 워커 실행
Worker::runAll();

브라우저가 http://127.0.0.1:8080/user/get.php?uid=10&type=2에 접근하면 /user/get.php?uid=10&type=2을 반환합니다.

요청 경로 얻기

$path = $request->path();

요청의 path 부분을 반환합니다.

예제

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->path());
};

// 워커 실행
Worker::runAll();

브라우저가 http://127.0.0.1:8080/user/get.php?uid=10&type=2에 접근하면 /user/get.php을 반환합니다.

요청 queryString 얻기

$query_string = $request->queryString();

요청의 queryString 부분을 반환합니다.

예제

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->queryString());
};

// 워커 실행
Worker::runAll();

브라우저가 http://127.0.0.1:8080/user/get.php?uid=10&type=2에 접근하면 uid=10&type=2를 반환합니다.

요청 HTTP 버전 얻기

$version = $request->protocolVersion();

반환 문자열은 1.1 또는 1.0입니다.

예제

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->protocolVersion());
};

// 워커 실행
Worker::runAll();

요청 sessionId 얻기

$sid = $request->sessionId();

문자열을 반환하며, 문자와 숫자로 구성됩니다.

예제

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->sessionId());
};

// 워커 실행
Worker::runAll();