Descrição
O Workerman a partir da versão 4.x aprimorou o suporte a serviços HTTP. Foram introduzidas as classes de requisição, resposta, sessão e SSE. Se você deseja utilizar o serviço HTTP do Workerman, é altamente recomendável usar a versão 4.x ou superior.
Nota: Todos os exemplos a seguir são para a versão Workerman 4.x, não são compatíveis com a versão Workerman 3.x.
Obter o objeto de requisição
O objeto de requisição deve ser obtido sempre na função de callback onMessage, onde o framework automaticamente passará o objeto Request como o segundo parâmetro da função de callback.
Exemplo
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 é o objeto de requisição, aqui não executamos nenhuma operação no objeto de requisição, apenas retornamos hello para o navegador
$connection->send("hello");
};
// Executar worker
Worker::runAll();
Quando o navegador acessar http://127.0.0.1:8080, retornará hello.
Obter parâmetros da requisição GET
Obter todo o array GET
$get = $request->get();
Se a requisição não tiver parâmetros GET, retornará um array vazio.
Obter um valor específico do array GET
$name = $request->get('name');
Se o array GET não contiver esse valor, retornará null.
Você também pode passar um valor padrão como segundo parâmetro para o método get; se o valor correspondente não for encontrado no array GET, retornará o valor padrão. Por exemplo:
$name = $request->get('name', 'tom');
Exemplo
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'));
};
// Executar worker
Worker::runAll();
Quando o navegador acessar http://127.0.0.1:8080?name=jerry&age=12, retornará jerry.
Obter parâmetros da requisição POST
Obter todo o array POST
$post = $request->post();
Se a requisição não tiver parâmetros POST, retornará um array vazio.
Obter um valor específico do array POST
$name = $request->post('name');
Se o array POST não contiver esse valor, retornará null.
Assim como no método get, você também pode passar um valor padrão como segundo parâmetro para o método post; se o valor correspondente não for encontrado no array POST, retornará o valor padrão. Por exemplo:
$name = $request->post('name', 'tom');
Exemplo
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));
};
// Executar worker
Worker::runAll();
Obter o corpo da requisição POST original
$post = $request->rawBody();
Essa função é semelhante à operação file_get_contents("php://input"); em php-fpm. Ela é usada para obter o corpo da requisição HTTP original. Isso é útil para obter dados de requisições POST que não estão no formato application/x-www-form-urlencoded.
Exemplo
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');
};
// Executar worker
Worker::runAll();
Obter cabeçalhos
Obter todo o array de cabeçalhos
$headers = $request->header();
Se a requisição não tiver cabeçalhos, retornará um array vazio. Note que todas as chaves são em minúsculas.
Obter um valor específico do array de cabeçalhos
$host = $request->header('host');
Se o array de cabeçalhos não contiver esse valor, retornará null. Note que todas as chaves são em minúsculas.
Assim como no método get, você também pode passar um valor padrão como segundo parâmetro para o método header; se o valor correspondente não for encontrado no array de cabeçalhos, retornará o valor padrão. Por exemplo:
$host = $request->header('host', 'localhost');
Exemplo
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');
}
};
// Executar worker
Worker::runAll();
Obter cookies
Obter todo o array de cookies
$cookies = $request->cookie();
Se a requisição não tiver cookies, retornará um array vazio.
Obter um valor específico do array de cookies
$name = $request->cookie('name');
Se o array de cookies não contiver esse valor, retornará null.
Assim como no método get, você também pode passar um valor padrão como segundo parâmetro para o método cookie; se o valor correspondente não for encontrado no array de cookies, retornará o valor padrão. Por exemplo:
$name = $request->cookie('name', 'tom');
Exemplo
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));
};
// Executar worker
Worker::runAll();
Obter arquivos enviados
Obter todo o array de arquivos enviados
$files = $request->file();
O formato retornado dos arquivos é semelhante a:
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',
)
)
Onde:
- name é o nome do arquivo
- tmp_name é o local do arquivo temporário no disco
- size é o tamanho do arquivo
- error é o código de erro
- type é o tipo MIME do arquivo.
Nota:
-
O tamanho máximo do arquivo enviado é limitado pelo defaultMaxPackageSize, que por padrão é 10M e pode ser modificado.
-
Os arquivos serão automaticamente removidos após o final da requisição.
-
Se a requisição não tiver arquivos enviados, retornará um array vazio.
Obter arquivo enviado específico
$avatar_file = $request->file('avatar');
Retorna algo semelhante a:
array (
'name' => '123.jpg',
'tmp_name' => '/tmp/workerman.upload.9hjR4w',
'size' => 1196127,
'error' => 0,
'type' => 'application/octet-stream',
)
Se o arquivo enviado não existir, retornará null.
Exemplo
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');
};
// Executar worker
Worker::runAll();
Obter o host
Obter informações do host da requisição.
$host = $request->host();
Se o endereço da requisição estiver em uma porta não padrão, como 80 ou 443, as informações do host podem incluir a porta, por exemplo, example.com:8080. Se a porta não for necessária, o primeiro parâmetro pode ser passado como true.
$host = $request->host(true);
Exemplo
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());
};
// Executar worker
Worker::runAll();
Quando o navegador acessar http://127.0.0.1:8080?name=tom, retornará 127.0.0.1:8080.
Obter o método da requisição
$method = $request->method();
O valor retornado pode ser GET, POST, PUT, DELETE, OPTIONS, HEAD.
Exemplo
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());
};
// Executar worker
Worker::runAll();
Obter o URI da requisição
$uri = $request->uri();
Retorna o URI da requisição, incluindo a parte do path e queryString.
Exemplo
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());
};
// Executar worker
Worker::runAll();
Quando o navegador acessar http://127.0.0.1:8080/user/get.php?uid=10&type=2, retornará /user/get.php?uid=10&type=2.
Obter o caminho da requisição
$path = $request->path();
Retorna a parte do path da requisição.
Exemplo
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());
};
// Executar worker
Worker::runAll();
Quando o navegador acessar http://127.0.0.1:8080/user/get.php?uid=10&type=2, retornará /user/get.php.
Obter a queryString da requisição
$query_string = $request->queryString();
Retorna a parte da queryString da requisição.
Exemplo
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());
};
// Executar worker
Worker::runAll();
Quando o navegador acessar http://127.0.0.1:8080/user/get.php?uid=10&type=2, retornará uid=10&type=2.
Obter a versão HTTP da requisição
$version = $request->protocolVersion();
Retorna a string 1.1 ou 1.0.
Exemplo
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());
};
// Executar worker
Worker::runAll();
Obter o sessionId da requisição
$sid = $request->sessionId();
Retorna uma string composta por letras e números.
Exemplo
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());
};
// Executar worker
Worker::runAll();