Costruttore __construct
Descrizione:
Worker::__construct([string $listen , array $context])
Inizializza un'istanza del contenitore Worker, può impostare alcune proprietà del contenitore e interfacce di callback per completare funzionalità specifiche.
Parametri
$listen
(parametro opzionale, se omesso significa che non si sta in ascolto su nessuna porta)
Se si imposta il parametro di ascolto $listen
, verrà eseguito l'ascolto del socket.
Il formato di $listen è ://
può essere nei seguenti formati:
tcp: ad esempio tcp://0.0.0.0:8686
udp: ad esempio udp://0.0.0.0:8686
unix: ad esempio unix:///tmp/my_file
(richiede Workerman>=3.2.7)
http: ad esempio http://0.0.0.0:80
websocket: ad esempio websocket://0.0.0.0:8686
text: ad esempio text://0.0.0.0:8686
(text è un protocollo di testo integrato in Workerman, compatibile con telnet, vedere dettagli nella sezione Protocollo di testo dell'appendice)
e altri protocolli personalizzati, vedere la sezione del manuale Protocolli di comunicazione personalizzati
può essere nei seguenti formati:
Se si tratta di un socket Unix, l'indirizzo è il percorso locale di un file sul disco.
Se non è un socket Unix, il formato dell'indirizzo è :
può essere ```0.0.0.0``` per ascoltare su tutte le interfacce di rete del computer locale, compreso l'IP interno ed esterno e l'anello locale 127.0.0.1
Se l'indirizzo IP del computer locale è ```127.0.0.1```, verrà eseguito l'ascolto sull'anello locale, accessibile solo dal computer locale e non dall'esterno.
Se l'indirizzo IP del computer locale è un IP interno, simile a ```192.168.xx.xx```, indica che verrà effettuato l'ascolto solo sull'IP interno e gli utenti esterni non potranno accedere.
Se il valore dell'indirizzo IP del computer locale non corrisponde a un IP locale, non sarà possibile effettuare l'ascolto e verrà visualizzato l'errore "Cannot assign requested address"
**Nota:** Il non può essere maggiore di 65535. Se il è inferiore a 1024, è necessario disporre dei privilegi di root per ascoltare. La porta in ascolto deve essere una porta non utilizzata nel computer locale, in caso contrario non sarà possibile effettuare l'ascolto e verrà visualizzato l'errore "Address already in use"
#### **``` $context ```**
Un array utilizzato per passare le opzioni di contesto del socket. Vedere [Opzioni di contesto del socket](https://php.net/manual/it/context.socket.php)
## Esempi
Worker come contenitore http per l'ascolto e la gestione delle richieste http
```php
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:8686');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$connection->send("hello");
};
// Esegui il worker
Worker::runAll();
```
Worker come contenitore websocket per l'ascolto e la gestione delle richieste websocket
```php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:8686');
$worker->onMessage = function(TcpConnection $connection, $data)
{
$connection->send("hello");
};
// Esegui il worker
Worker::runAll();
```
Worker come contenitore tcp per l'ascolto e la gestione delle richieste tcp
```php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('tcp://0.0.0.0:8686');
$worker->onMessage = function(TcpConnection $connection, $data)
{
$connection->send("hello");
};
// Esegui il worker
Worker::runAll();
```
Worker come contenitore udp per l'ascolto e la gestione delle richieste udp
```php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('udp://0.0.0.0:8686');
$worker->onMessage = function(TcpConnection $connection, $data)
{
$connection->send("hello");
};
// Esegui il worker
Worker::runAll();
```
Worker in ascolto su un socket di dominio Unix ```(richiede Workerman versione>=3.2.7)```
```php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('unix:///tmp/my.sock');
$worker->onMessage = function(TcpConnection $connection, $data)
{
$connection->send("hello");
};
// Esegui il worker
Worker::runAll();
```
Contenitore Worker che non effettua alcun ascolto, utilizzato per gestire determinati compiti periodici
```php
use \Workerman\Worker;
use \Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$task = new Worker();
$task->onWorkerStart = function($task)
{
// Esegui ogni 2,5 secondi
$intervallo_di_tempo = 2.5;
Timer::add($intervallo_di_tempo, function()
{
echo "task run\n";
});
};
// Esegui il worker
Worker::runAll();
```
**Worker in ascolto su una porta con un protocollo personalizzato**
Struttura finale delle directory
```
├── Protocols // Questa è la directory Protocols da creare
│ └── MyTextProtocol.php // Questo è il file di protocollo personalizzato da creare
├── test.php // Questo è lo script test da creare
└── Workerman // Directory del codice sorgente di Workerman, il codice al suo interno non deve essere modificato
```
1. Creare la directory Protocols e creare un file di protocollo
Protocols/MyTextProtocol.php (fare riferimento alla struttura della directory sopra)
```php
// Spazio dei nomi del protocollo personalizzato degli utenti unificato come Protocols
namespace Protocols;
// Protocollo testuale semplice, il formato del protocollo è testo + nuova riga
class MyTextProtocol
{
// Funzione di suddivisione del pacchetto, restituire la lunghezza del pacchetto corrente
public static function input($recv_buffer)
{
// Trovare il carattere di nuova riga
$pos = strpos($recv_buffer, "\n");
// Se non viene trovato il carattere di nuova riga, significa che non è un pacchetto completo, restituisce 0 per continuare ad attendere i dati
if($pos === false)
{
return 0;
}
// Se viene trovato il carattere di nuova riga, restituisce la lunghezza del pacchetto corrente, inclusa la nuova riga
return $pos+1;
}
// Dopo aver ricevuto un pacchetto completo, eseguire automaticamente il decode tramite decode('dati ricevuti')
// I risultati vengono passati a $data tramite il callback onMessage
public static function decode($recv_buffer)
{
return trim($recv_buffer);
}
// Prima di inviare dati al client, vengono automaticamente codificati tramite encode, e quindi inviati al client, qui è stata aggiunta la nuova riga
public static function encode($data)
{
return $data."\n";
}
}
```
2. Utilizzare il protocollo MyTextProtocol per ascoltare e gestire le richieste
Seguire la struttura delle directory della struttura finale
```php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// #### Worker protocol personalizzato ####
$text_worker = new Worker("MyTextProtocol://0.0.0.0:5678");
/*
* Dopo aver ricevuto dati completi (terminati da una nuova riga), eseguire automaticamente MyTextProtocol::decode('dati ricevuti')
* I risultati vengono passati a $data tramite il callback onMessage
*/
$text_worker->onMessage = function(TcpConnection $connection, $data)
{
var_dump($data);
/*
* Invia dati al client, automaticamente chiamerà MyTextProtocol::encode('hello world') per codificare il protocollo,
* quindi invierà al client
*/
$connection->send("hello world");
};
// Esegui tutti i worker
Worker::runAll();
```
3. Testing
Aprire il terminale, accedere alla directory in cui si trova test.php e digitare ```php test.php start```
```sh
php test.php start
Workerman[test.php] start in DEBUG mode
----------------------- WORKERMAN -----------------------------
Workerman version:3.2.7 PHP version:5.4.37
------------------------ WORKERS -------------------------------
user worker listen processes status
root none myTextProtocol://0.0.0.0:5678 1 [OK]
----------------------------------------------------------------
Press Ctrl-C to quit. Start success.
```
Aprire un terminale e utilizzare telnet per testare (si consiglia di utilizzare il telnet di sistema di Linux)
Assumendo un test locale,
Eseguire il telnet 127.0.0.1 5678 sul terminale
Quindi inserire hi e premere Invio
Verrà ricevuto il messaggio di "hello world\n"
```sh
telnet 127.0.0.1 5678
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
hi
hello world
```