Descripción
A partir de la versión 4.x, Workerman ha mejorado el soporte para servicios HTTP. Introdujo clases de solicitud, respuesta, sesión y SSE. Si deseas utilizar el servicio HTTP de Workerman, se recomienda encarecidamente usar Workerman 4.x o versiones posteriores.
Ten en cuenta que todas las siguientes son formas de uso en Workerman 4.x, y no son compatibles con Workerman 3.x.
Obtener el objeto de solicitud
El objeto de solicitud se obtiene en la función de callback onMessage; el marco de trabajo pasará automáticamente el objeto Request como segundo parámetro a la función de callback.
Ejemplo
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 es el objeto de solicitud, aquí no se realiza ninguna operación sobre el objeto de solicitud, simplemente se devuelve hello al navegador
$connection->send("hello");
};
// Ejecutar el worker
Worker::runAll();
Cuando el navegador acceda a http://127.0.0.1:8080, devolverá hello.
Obtener parámetros de solicitud GET
Obtener todo el arreglo GET
$get = $request->get();
Si la solicitud no tiene parámetros GET, se devolverá un arreglo vacío.
Obtener un valor específico del arreglo GET
$name = $request->get('name');
Si el arreglo GET no contiene este valor, se devolverá null.
También puedes pasar un valor predeterminado como segundo parámetro al método get; si no se encuentra el valor correspondiente en el arreglo GET, se devolverá el valor predeterminado. Por ejemplo:
$name = $request->get('name', 'tom');
Ejemplo
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'));
};
// Ejecutar el worker
Worker::runAll();
Cuando el navegador acceda a http://127.0.0.1:8080?name=jerry&age=12, devolverá jerry.
Obtener parámetros de solicitud POST
Obtener todo el arreglo POST
$post = $request->post();
Si la solicitud no tiene parámetros POST, se devolverá un arreglo vacío.
Obtener un valor específico del arreglo POST
$name = $request->post('name');
Si el arreglo POST no contiene este valor, se devolverá null.
Al igual que con el método GET, también puedes pasar un valor predeterminado como segundo parámetro al método post; si no se encuentra el valor correspondiente en el arreglo POST, se devolverá el valor predeterminado. Por ejemplo:
$name = $request->post('name', 'tom');
Ejemplo
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));
};
// Ejecutar el worker
Worker::runAll();
Obtener el cuerpo de la solicitud POST sin procesar
$post = $request->rawBody();
Esta función es similar a file_get_contents("php://input") en php-fpm. Se utiliza para obtener el cuerpo de la solicitud HTTP sin procesar. Esto es útil al obtener datos de solicitudes POST en formatos que no son application/x-www-form-urlencoded.
Ejemplo
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');
};
// Ejecutar el worker
Worker::runAll();
Obtener encabezados
Obtener todo el arreglo de encabezados
$headers = $request->header();
Si la solicitud no tiene parámetros de encabezado, se devolverá un arreglo vacío. Ten en cuenta que todas las claves son minúsculas.
Obtener un valor específico del arreglo de encabezados
$host = $request->header('host');
Si el arreglo de encabezados no contiene este valor, se devolverá null. Ten en cuenta que todas las claves son minúsculas.
Al igual que con el método GET, también puedes pasar un valor predeterminado como segundo parámetro al método header; si no se encuentra el valor correspondiente en el arreglo de encabezados, se devolverá el valor predeterminado. Por ejemplo:
$host = $request->header('host', 'localhost');
Ejemplo
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');
}
};
// Ejecutar el worker
Worker::runAll();
Obtener cookies
Obtener todo el arreglo de cookies
$cookies = $request->cookie();
Si la solicitud no tiene parámetros de cookies, se devolverá un arreglo vacío.
Obtener un valor específico del arreglo de cookies
$name = $request->cookie('name');
Si el arreglo de cookies no contiene este valor, se devolverá null.
Al igual que con el método GET, también puedes pasar un valor predeterminado como segundo parámetro al método cookie; si no se encuentra el valor correspondiente en el arreglo de cookies, se devolverá el valor predeterminado. Por ejemplo:
$name = $request->cookie('name', 'tom');
Ejemplo
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));
};
// Ejecutar el worker
Worker::runAll();
Obtener archivos subidos
Obtener todo el arreglo de archivos subidos
$files = $request->file();
El formato de archivo devuelto es similar 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',
)
)
Donde:
- name es el nombre del archivo
- tmp_name es la ubicación del archivo temporal en el disco
- size es el tamaño del archivo
- error es el código de error
- type es el tipo MIME del archivo.
Nota:
-
El tamaño del archivo subido está limitado por defaultMaxPackageSize, que es de 10 MB por defecto, y se puede modificar.
-
Después de que finaliza la solicitud, los archivos se eliminan automáticamente.
-
Si la solicitud no contiene archivos subidos, se devolverá un arreglo vacío.
Obtener un archivo subido específico
$avatar_file = $request->file('avatar');
Devuelve algo similar a:
array (
'name' => '123.jpg',
'tmp_name' => '/tmp/workerman.upload.9hjR4w',
'size' => 1196127,
'error' => 0,
'type' => 'application/octet-stream',
)
Si el archivo subido no existe, se devolverá null.
Ejemplo
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');
};
// Ejecutar el worker
Worker::runAll();
Obtener el host
Obtén la información del host de la solicitud.
$host = $request->host();
Si la dirección de la solicitud tiene un puerto diferente de los estándares 80 o 443, la información del host puede incluir el puerto, por ejemplo, example.com:8080. Si no necesitas el puerto, puedes pasar el primer parámetro como true.
$host = $request->host(true);
Ejemplo
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());
};
// Ejecutar el worker
Worker::runAll();
Cuando el navegador acceda a http://127.0.0.1:8080?name=tom, devolverá 127.0.0.1:8080.
Obtener el método de solicitud
$method = $request->method();
El valor devuelto puede ser uno de GET, POST, PUT, DELETE, OPTIONS, HEAD.
Ejemplo
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());
};
// Ejecutar el worker
Worker::runAll();
Obtener el URI de solicitud
$uri = $request->uri();
Devuelve el URI de la solicitud, incluyendo la parte de path y queryString.
Ejemplo
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());
};
// Ejecutar el worker
Worker::runAll();
Cuando el navegador acceda a http://127.0.0.1:8080/user/get.php?uid=10&type=2, devolverá /user/get.php?uid=10&type=2.
Obtener el path de la solicitud
$path = $request->path();
Devuelve la parte de path de la solicitud.
Ejemplo
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());
};
// Ejecutar el worker
Worker::runAll();
Cuando el navegador acceda a http://127.0.0.1:8080/user/get.php?uid=10&type=2, devolverá /user/get.php.
Obtener el queryString de la solicitud
$query_string = $request->queryString();
Devuelve la parte de queryString de la solicitud.
Ejemplo
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());
};
// Ejecutar el worker
Worker::runAll();
Cuando el navegador acceda a http://127.0.0.1:8080/user/get.php?uid=10&type=2, devolverá uid=10&type=2.
Obtener la versión HTTP de la solicitud
$version = $request->protocolVersion();
Devuelve una cadena 1.1 o 1.0.
Ejemplo
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());
};
// Ejecutar el worker
Worker::runAll();
Obtener el sessionId de la solicitud
$sid = $request->sessionId();
Devuelve una cadena compuesta por letras y números.
Ejemplo
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());
};
// Ejecutar el worker
Worker::runAll();