Introduzione

Da Workerman 4.x in poi è stata potenziata la compatibilità con i servizi HTTP, introducendo la classe di richiesta, la classe di risposta, la classe di sessione e SSE. Se vuoi utilizzare il servizio HTTP di Workerman, si consiglia vivamente di utilizzare la versione 4.x di Workerman o una versione successiva.

Si noti che le seguenti istruzioni si applicano solo alla versione 4.x di Workerman e non sono compatibili con la versione 3.x.

Ottenere l'oggetto richiesta

L'oggetto richiesta viene sempre ottenuto nella funzione di callback onMessage e il framework passerà automaticamente l'oggetto Request come secondo parametro alla funzione di 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 di richiesta, qui non viene eseguita nessuna operazione sull'oggetto di richiesta, viene semplicemente restituito "hello" al browser
    $connection->send("hello");
};

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

Quando si accede a http://127.0.0.1:8080 dal browser, verrà restituito "hello".

Ottenere i parametri della richiesta GET

Ottenere l'intero array GET

$get = $request->get();

Se la richiesta non contiene parametri GET, viene restituito un array vuoto.

Ottenere un valore specifico dall'array GET

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

Se l'array GET non contiene quel valore, viene restituito null.

È anche possibile passare un valore predefinito come secondo argomento al metodo get. Se l'array GET non contiene il valore corrispondente, 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'));
};

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

Quando si accede a http://127.0.0.1:8080?name=jerry&age=12 dal browser, verrà restituito "jerry".

Ottenere i parametri della richiesta POST

Ottenere l'intero array POST

$post = $request->post();

Se la richiesta non contiene parametri POST, viene restituito un array vuoto.

Ottenere un valore specifico dall'array POST

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

Se l'array POST non contiene quel valore, viene restituito null.

Come il metodo get, è possibile passare un valore predefinito come secondo argomento al metodo post. Se l'array POST non contiene il valore corrispondente, 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));
};

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

Ottenere il corpo grezzo della richiesta POST

$post = $request->rawBody();

Questa funzionalità è simile all'operazione file_get_contents("php://input"); in php-fpm, ed è utile per ottenere il corpo grezzo della richiesta HTTP quando si ottengono dati di richiesta POST in un formato diverso 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');
};

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

Ottenere l'header

Ottenere l'intero array delle intestazioni (header)

$headers = $request->header();

Se la richiesta non contiene intestazioni (header), viene restituito un array vuoto. Si noti che tutte le chiavi sono in minuscolo.

Ottenere un valore specifico dall'array delle intestazioni (header)

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

Se l'array delle intestazioni (header) non contiene quel valore, viene restituito null. Si noti che tutte le chiavi sono in minuscolo.

Come per il metodo get, è possibile passare un valore predefinito come secondo argomento al metodo header. Se l'array delle intestazioni (header) non contiene il valore corrispondente, 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');
    }    
};

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

Ottenere i cookie

Ottenere l'intero array dei cookie

$cookies = $request->cookie();

Se la richiesta non contiene cookie, viene restituito un array vuoto.

Ottenere un valore specifico dall'array dei cookie

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

Se l'array dei cookie non contiene quel valore, viene restituito null.

Come per il metodo get, è possibile passare un valore predefinito come secondo argomento al metodo cookie. Se l'array dei cookie non contiene il valore corrispondente, 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));
};

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

Ottenere i file caricati

Ottenere l'intero array dei file caricati

$files = $request->file();

Il formato del 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',
      )
)

Dove:

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

Nota:

  • le dimensioni dei file caricati sono limitate dalla defaultMaxPackageSize, di default 10M, ma può essere modificato.
  • Dopo la fine della richiesta, i file verranno cancellati automaticamente.
  • Se non ci sono file caricati nella richiesta, viene restituito un array vuoto.

Ottenere un file specifico caricato

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

Restituisce qualcosa del genere

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

Se il file caricato non esiste, viene restituito 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');
};

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

Ottenere l'host

Ottieni le informazioni di host della richiesta.

$host = $request->host();

Se l'indirizzo della richiesta è su una porta non standard (diversa da 80 o 443), le informazioni di host potrebbero includere la porta, ad esempio example.com:8080. Se non è necessaria la porta, è possibile passare true come primo argomento.

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

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

Quando si accede a http://127.0.0.1:8080?name=tom dal browser, verrà restituito 127.0.0.1:8080.

Ottenere il metodo della richiesta

$method = $request->method();

Il valore restituito potrebbe essere uno tra 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());
};

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

Ottenere l'URI della richiesta

$uri = $request->uri();

Restituisce l'URI della richiesta, inclusi il percorso (path) e la stringa di query.

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

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

Quando si accede tramite browser a http://127.0.0.1:8080/user/get.php?uid=10&type=2, verrà restituito /user/get.php?uid=10&type=2.

Ottenere il percorso della richiesta

$path = $request->path();

Restituisce la parte del percorso 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());
};

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

Quando si accede tramite browser a http://127.0.0.1:8080/user/get.php?uid=10&type=2, verrà restituito /user/get.php.

Ottenere la stringa di query della richiesta

$query_string = $request->queryString();

Restituisce la parte della stringa di query 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());
};

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

Quando si accede tramite browser a http://127.0.0.1:8080/user/get.php?uid=10&type=2, verrà restituito 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());
};

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

Ottenere l'ID della sessione 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());
};

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