Descrizione

A partire dalla versione 4.x, Workerman ha migliorato il supporto per i servizi HTTP. Sono state introdotte le classi per le richieste, le risposte, le sessioni e SSE. Se desideri utilizzare il servizio HTTP di Workerman, si consiglia vivamente di utilizzare la versione 4.x o versioni successive.

Nota che tutte le seguenti indicazioni si riferiscono all'uso di workerman versione 4.x e non sono compatibili con workerman versione 3.x.

Ottenere l'oggetto richiesta

L'oggetto richiesta deve essere ottenuto nel callback onMessage, il framework passerà automaticamente l'oggetto Request come secondo parametro del callback.

Esempio

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 è l'oggetto richiesta, qui non viene eseguita alcuna operazione sull'oggetto richiesta, viene semplicemente restituito hello al browser
    $connection->send("hello");
};

// Esegui il worker
Worker::runAll();

Quando il browser accede a http://127.0.0.1:8080, restituirà hello.

Ottenere i parametri di richiesta get

Ottenere l'intero array get

$get = $request->get();

Se la richiesta non ha parametri get, restituirà un array vuoto.

Ottenere un valore specifico dall'array get

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

Se l'array get non contiene questo valore, restituirà null.

Puoi anche passare un valore predefinito come secondo parametro al metodo get; se non viene trovato il valore corrispondente nell'array get, verrà restituito il valore predefinito. Ad esempio:

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

Esempio

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'));
};

// Esegui il worker
Worker::runAll();

Quando il browser accede a http://127.0.0.1:8080?name=jerry&age=12, restituirà jerry.

Ottenere i parametri di richiesta post

Ottenere l'intero array post

$post = $request->post();

Se la richiesta non ha parametri post, restituirà un array vuoto.

Ottenere un valore specifico dall'array post

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

Se l'array post non contiene questo valore, restituirà null.

Come per il metodo get, puoi anche passare un valore predefinito come secondo parametro al metodo post; se non viene trovato il valore corrispondente nell'array post, verrà restituito il valore predefinito. Ad esempio:

$name = $request->post('name', 'tom');

Esempio

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

// Esegui il worker
Worker::runAll();

Ottenere il corpo della richiesta post originale

$post = $request->rawBody();

Questa funzionalità è simile a file_get_contents("php://input"); in php-fpm. Serve per ottenere il corpo della richiesta HTTP originale. Questo è utile per ottenere dati delle richieste post in formati diversi da application/x-www-form-urlencoded.

Esempio

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');
};

// Esegui il worker
Worker::runAll();

Ottenere l'intestazione

Ottenere l'intero array delle intestazioni

$headers = $request->header();

Se la richiesta non ha parametri header, restituirà un array vuoto. Nota che tutte le chiavi sono in minuscolo.

Ottenere un valore specifico dall'array delle intestazioni

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

Se l'array delle intestazioni non contiene questo valore, restituirà null. Nota che tutte le chiavi sono in minuscolo.

Come per il metodo get, puoi anche passare un valore predefinito come secondo parametro al metodo header; se non viene trovato il valore corrispondente nell'array delle intestazioni, verrà restituito il valore predefinito. Ad esempio:

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

Esempio

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');
    }    
};

// Esegui il worker
Worker::runAll();

Ottenere i cookie

Ottenere l'intero array dei cookie

$cookies = $request->cookie();

Se la richiesta non ha parametri cookie, restituirà un array vuoto.

Ottenere un valore specifico dall'array dei cookie

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

Se l'array dei cookie non contiene questo valore, restituirà null.

Come per il metodo get, puoi anche passare un valore predefinito come secondo parametro al metodo cookie; se non viene trovato il valore corrispondente nell'array dei cookie, verrà restituito il valore predefinito. Ad esempio:

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

Esempio

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

// Esegui il worker
Worker::runAll();

Ottenere i file caricati

Ottenere l'intero array dei file caricati

$files = $request->file();

Il formato dei file restituito è simile 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',
      )
)

Nel quale:

  • name è il nome del file
  • tmp_name è la posizione del file temporaneo su disco
  • size è la dimensione del file
  • error è il codice di errore
  • type è il tipo mime del file.

Nota:

  • La dimensione massima del file caricato è limitata da defaultMaxPackageSize, che di default è 10M, può essere modificata.

  • Dopo la fine della richiesta, il file verrà automaticamente rimosso.

  • Se la richiesta non ha file caricati, restituirà un array vuoto.

Ottenere un file caricato specifico

$avatar_file = $request->file('avatar');

Restituisce qualcosa di simile a

array (
        'name' => '123.jpg',
        'tmp_name' => '/tmp/workerman.upload.9hjR4w',
        'size' => 1196127,
        'error' => 0,
        'type' => 'application/octet-stream',
  )

Se il file caricato non esiste, restituirà null.

Esempio

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');
};

// Esegui il worker
Worker::runAll();

Ottenere l'host

Ottenere le informazioni sull'host della richiesta.

$host = $request->host();

Se l'indirizzo della richiesta non è sulla porta standard 80 o 443, le informazioni sull'host potrebbero includere la porta, ad esempio example.com:8080. Se non è necessaria la porta, il primo parametro può essere impostato su true.

$host = $request->host(true);

Esempio

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

// Esegui il worker
Worker::runAll();

Quando il browser accede a http://127.0.0.1:8080?name=tom, restituirà 127.0.0.1:8080.

Ottenere il metodo della richiesta

$method = $request->method();

Il valore restituito può essere GET, POST, PUT, DELETE, OPTIONS, HEAD.

Esempio

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

// Esegui il worker
Worker::runAll();

Ottenere l'uri della richiesta

$uri = $request->uri();

Restituisce l'uri della richiesta, comprese le parti path e queryString.

Esempio

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

// Esegui il worker
Worker::runAll();

Quando il browser accede a http://127.0.0.1:8080/user/get.php?uid=10&type=2, restituirà /user/get.php?uid=10&type=2.

Ottenere il percorso della richiesta

$path = $request->path();

Restituisce la parte path della richiesta.

Esempio

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

// Esegui il worker
Worker::runAll();

Quando il browser accede a http://127.0.0.1:8080/user/get.php?uid=10&type=2, restituirà /user/get.php.

Ottenere la queryString della richiesta

$query_string = $request->queryString();

Restituisce la parte queryString della richiesta.

Esempio

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

// Esegui il worker
Worker::runAll();

Quando il browser accede a http://127.0.0.1:8080/user/get.php?uid=10&type=2, restituirà uid=10&type=2.

Ottenere la versione HTTP della richiesta

$version = $request->protocolVersion();

Restituisce la stringa 1.1 o 1.0.

Esempio

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

// Esegui il worker
Worker::runAll();

Ottenere il sessionId della richiesta

$sid = $request->sessionId();

Restituisce una stringa composta da lettere e numeri.

Esempio

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

// Esegui il worker
Worker::runAll();