Описание

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

Обратите внимание:

  • Размер загружаемого файла ограничен значением 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

Получение информации о host запроса.

$host = $request->host();

Если адрес запроса имеет нестандартные порты, отличные от 80 или 443, информация о host может включать порт, например 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();

Возвращаемое значение может быть одним из 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
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();