説明

Workermanは4.xバージョンからHTTPサービスのサポートを強化しました。リクエストクラス、レスポンスクラス、セッションクラス、SSE を導入しました。WorkermanのHTTPサービスを使用する場合、Workerman 4.x以降のバージョンを強く推奨します。

以下はすべてWorkerman 4.xバージョンの使用方法であり、Workerman 3.xと互換性がありません。

リクエストオブジェクトの取得

リクエストオブジェクトは、onMessageコールバック関数内で取得し、フレームワークは自動的にRequestオブジェクトをコールバック関数の2番目の引数として渡します。

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を実行
Worker::runAll();

ブラウザがhttp://127.0.0.1:8080にアクセスすると、helloが返されます。

GETパラメーターの取得

GET配列全体を取得

$get = $request->get();

リクエストにGETパラメーターがない場合は、空の配列が返されます。

GET配列の特定の値を取得

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

GET配列にその値が含まれていない場合は、nullが返されます。

同様に、getメソッドに2番目の引数としてデフォルト値を渡すこともできます。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を実行
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メソッドに2番目の引数としてデフォルト値を渡すこともできます。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を実行
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を実行
Worker::runAll();

ヘッダーの取得

ヘッダー配列全体を取得

$headers = $request->header();

リクエストにヘッダーパラメーターがない場合は、空の配列が返されます。すべてのキーは小文字であることに注意してください。

ヘッダー配列の特定の値を取得

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

ヘッダー配列にその値が含まれていない場合は、nullが返されます。すべてのキーは小文字であることに注意してください。

GETメソッドと同様に、headerメソッドに2番目の引数としてデフォルト値を渡すこともできます。ヘッダー配列に対応する値が見つからない場合は、デフォルト値が返されます。例:

$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を実行
Worker::runAll();

クッキーの取得

クッキー配列全体を取得

$cookies = $request->cookie();

リクエストにクッキーパラメーターがない場合は、空の配列が返されます。

クッキー配列の特定の値を取得

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

クッキー配列にその値が含まれていない場合は、nullが返されます。

GETメソッドと同様に、cookieメソッドに2番目の引数としてデフォルト値を渡すこともできます。クッキー配列に対応する値が見つからない場合は、デフォルト値が返されます。例:

$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を実行
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を実行
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を、パスとクエリ文字列を含めて返します。

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

リクエストのパス部分を返します。

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 が返されます。

リクエストクエリ文字列の取得

$query_string = $request->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();

リクエストのセッションIDの取得

$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();