Инструкция

С версии 4.x workerman улучшил поддержку HTTP-сервиса. Были добавлены классы запроса, ответа, сессии, а также SSE. Если вы хотите использовать 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
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();

Эта функция похожа на операцию file_get_contents("php://input"); в php-fpm и используется для получения исходного тела HTTP-запроса. Она полезна при получении данных POST-запросов в формате, отличном от application/x-www-form-urlencoded.

Пример

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 и post, можно передать второй аргумент метода 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();

Получение cookie

Получение всего массива cookie

$cookies = $request->cookie();

Если запрос не содержит cookie-параметров, то возвращается пустой массив.

Получение значения из массива cookie

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

Если в массиве cookie нет данного значения, то возвращается null.

Как и в методах get и post, можно передать второй аргумент метода cookie в качестве значения по умолчанию. Если соответствующее значение в массиве 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, по умолчанию 10 Мб, но может быть изменен.

  • После завершения запроса файлы будут автоматически удалены.

  • Если в запросе отсутствуют загруженные файлы, вернется пустой массив.

Получение конкретного загруженного файла

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

Возвращает одно из значений GET, POST, PUT, DELETE, OPTIONS, HEAD.

Пример

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

Получение идентификатора сеанса запроса

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