説明

workermanは4.xバージョンからHTTPサービスのサポートを強化しました。リクエストクラス、レスポンスクラス、セッションクラス、およびSSEが導入されています。workermanのHTTPサービスを使用したい場合は、workerman4.xまたはそれ以降のバージョンを強く推奨します。

以下はすべてworkerman4.xバージョンの使い方であり、workerman3.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を実行
Worker::runAll();

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

リクエストパラメータgetの取得

全get配列の取得

$get = $request->get();

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

get配列の特定の値の取得

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

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

getメソッドの第二引数にデフォルト値を渡すこともでき、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メソッドの第二引数にデフォルト値を渡すこともでき、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();

リクエストにヘッダーパラメータが存在しない場合は空の配列が返されます。注意:すべてのkeyは小文字です。

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

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

ヘッダー配列にこの値が含まれていない場合はnullが返されます。注意:すべてのkeyは小文字です。

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