Costruttore __construct

Descrizione:

Worker::__construct([string $listen , array $context])

Inizializza un'istanza del contenitore Worker, permettendo di impostare alcune proprietà e callback del contenitore per completare funzioni specifiche.

Parametri

$listen (parametro opzionale, omesso indica di non ascoltare alcuna porta)

Se è impostato il parametro di ascolto $listen, verrà eseguita 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 è il protocollo di testo integrato in Workerman, compatibile con telnet, vedi dettagli nella sezione appendice Protocollo Text)

e altri protocolli personalizzati, fare riferimento alla sezione di personalizzazione del protocollo di comunicazione di questo documento.

può essere nei seguenti formati:

Se è un socket unix, l'indirizzo è un percorso del disco locale.

Per i socket non unix, il formato dell'indirizzo è :

può essere ```0.0.0.0``` per ascoltare su tutte le interfacce di rete, inclusi ip privati e pubblici e l'interfaccia di loopback locale 127.0.0.1. Se è ```127.0.0.1```, significa che ascolterà solo sull'interfaccia loopback locale, accessibile solo localmente, non da altre macchine. Se è un ip privato, come ```192.168.xx.xx```, significa che ascolterà solo su quell'ip privato, e quindi gli utenti esterni non potranno accedervi. Se il valore impostato su non appartiene all'ip della macchina, non sarà possibile eseguire l'ascolto, e verrà visualizzato l'errore ```Cannot assign requested address```. **Nota:** non può essere maggiore di 65535. Se è minore di 1024 è necessaria l'autenticazione come root per ascoltare. La porta di ascolto deve essere una porta non occupata dalla macchina, altrimenti non sarà possibile ascoltare, e verrà visualizzato l'errore ```Address already in use```. #### **``` $context ```** Un array. Viene 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 ascoltare e gestire 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 worker Worker::runAll(); ``` Worker come contenitore websocket per ascoltare e gestire 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 worker Worker::runAll(); ``` Worker come contenitore tcp per ascoltare e gestire 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 worker Worker::runAll(); ``` Worker come contenitore udp per ascoltare e gestire 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 worker Worker::runAll(); ``` Worker che ascolta i socket di dominio unix ```(richiede Workerman >= 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 worker Worker::runAll(); ``` Worker che non esegue alcun ascolto, utilizzato per gestire alcuni compiti programmati ```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 $time_interval = 2.5; Timer::add($time_interval, function() { echo "task run\n"; }); }; // Esegui worker Worker::runAll(); ``` **Worker che ascolta le porte del 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 sorgente di Workerman, non modificare il codice interno ``` 1. Creare la directory Protocols e creare un file di protocollo Protocols/MyTextProtocol.php(fare riferimento alla struttura delle directory sopra) ```php // Lo spazio dei nomi del protocollo personalizzato deve essere unificato con Protocols namespace Protocols; // Protocollo di testo semplice, il formato del protocollo è testo+nuova riga class MyTextProtocol { // Funzione di frammentazione, restituisce la lunghezza del pacchetto attuale public static function input($recv_buffer) { // Cerca il carattere di nuova riga $pos = strpos($recv_buffer, "\n"); // Se non viene trovato, significa che non è un pacchetto completo, restituisce 0 e continua ad attendere dati if($pos === false) { return 0; } // Se viene trovato il carattere di nuova riga, restituisce la lunghezza del pacchetto attuale, inclusa la nuova riga return $pos+1; } // Dopo aver ricevuto un pacchetto completo, viene automaticamente decodificato tramite decode, qui viene solo rimosso il carattere di nuova riga public static function decode($recv_buffer) { return trim($recv_buffer); } // Prima di inviare dati al client, verrà automaticamente codificato tramite encode e quindi inviato al client, qui viene aggiunta una nuova riga public static function encode($data) { return $data."\n"; } } ``` 2. Usare il protocollo MyTextProtocol per ascoltare e gestire le richieste Creare il file test.php secondo la struttura finale delle directory sopra ```php use Workerman\Worker; use Workerman\Connection\TcpConnection; require_once __DIR__ . '/vendor/autoload.php'; // #### MyTextProtocol worker #### $text_worker = new Worker("MyTextProtocol://0.0.0.0:5678"); /* * Dopo aver ricevuto un dato completo (con una nuova riga alla fine), viene eseguito automaticamente MyTextProtocol::decode('i dati ricevuti') * Il risultato viene passato al callback onMessage attraverso $data */ $text_worker->onMessage = function(TcpConnection $connection, $data) { var_dump($data); /* * L'invio di dati al client chiamerà automaticamente MyTextProtocol::encode('hello world') per l codifica del protocollo, * e poi lo invierà al client */ $connection->send("hello world"); }; // Esegui tutti i worker Worker::runAll(); ``` 3. Test Aprire un terminale, entrare nella directory in cui si trova test.php ed eseguire ```php test.php start``` ``` php test.php start Workerman[test.php] avviato in modalità DEBUG ----------------------- WORKERMAN ----------------------------- Versione Workerman:3.2.7 Versione PHP:5.4.37 ------------------------ WORKERS ------------------------------- utente worker ascolto processi stato root none myTextProtocol://0.0.0.0:5678 1 [OK] ---------------------------------------------------------------- Premere Ctrl-C per uscire. Avvio riuscito. ``` Aprire un terminale e testare con telnet (si consiglia di utilizzare telnet su sistemi linux) Assumendo che sia un test locale, Eseguire nel terminale telnet 127.0.0.1 5678 Quindi digitare hi e premere invio Si riceverà il dato hello world\n ``` telnet 127.0.0.1 5678 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. hi hello world ```