Construtor __construct

Descrição:

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

Inicializa uma instância de contêiner Worker, pode configurar algumas propriedades do contêiner e interfaces de retorno de chamada para concluir funções específicas.

Parâmetros

$listen (parâmetro opcional, se não preenchido, significa que não está ouvindo em nenhuma porta)

Se o parâmetro listen estiver configurado, ele executará a escuta do soquete.

O formato de $listen é ://<endereço de escuta>

pode ser nos seguintes formatos:

tcp: Por exemplo, tcp://0.0.0.0:8686

udp: Por exemplo, udp://0.0.0.0:8686

unix: Por exemplo, unix:///tmp/my_file (requer Workerman>=3.2.7)

http: Por exemplo, http://0.0.0.0:80

websocket: Por exemplo, websocket://0.0.0.0:8686

text: Por exemplo, text://0.0.0.0:8686 (text é um protocolo de texto incorporado no Workerman, compatível com telnet, consulte a seção do Protocolo de Texto no apêndice para mais detalhes)

e outros protocolos personalizados, consulte a seção de Personalização de Protocolo de Comunicação neste manual

<endereço de escuta> pode ser nos seguintes formatos:

Se for um soquete Unix, o endereço é um caminho de arquivo local.

Se não for um soquete Unix, o formato do endereço é :<número da porta>.

pode ser `0.0.0.0` para escutar em todas as placas de rede locais, incluindo IP internos, IP externos e localhost 127.0.0.1. Se for `127.0.0.1`, ele escuta apenas no localhost, acessível somente localmente e não externamente. Se for um IP interno, como `192.168.xx.xx`, ele escutará apenas no IP interno, impedindo que usuários externos acessem. Se não for um IP local, a escuta não será executada e um erro `Cannot assign requested address` será exibido. **Observação:** `` não pode ser superior a 65535. Se for inferior a 1024, é necessário permissão de root para escutar. A porta ouvida deve ser uma porta não utilizada na máquina local; caso contrário, não será possível escutar e um erro `Address already in use` será exibido. #### **``` $context ```** Um array. Utilizado para passar opções de contexto do soquete, consulte [Opções de Contexto de Soquete](https://php.net/manual/pt_BR/context.socket.php) ## Exemplos Worker atuando como contêiner http ouvindo e tratando solicitações 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"); }; // Executa todos os workers Worker::runAll(); ``` Worker atuando como contêiner websocket ouvindo e tratando solicitações 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"); }; // Executa todos os workers Worker::runAll(); ``` Worker atuando como contêiner tcp ouvindo e tratando solicitações 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"); }; // Executa todos os workers Worker::runAll(); ``` Worker atuando como contêiner udp ouvindo e tratando solicitações 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"); }; // Executa todos os workers Worker::runAll(); ``` Worker ouvindo soquete de domínio unix ```(requer Workerman versão >= 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"); }; // Executa todos os workers Worker::runAll(); ``` Contêiner Worker que não executa nenhum tipo de escuta, usado para processar tarefas agendadas ```php use \Workerman\Worker; use \Workerman\Timer; require_once __DIR__ . '/vendor/autoload.php'; $task = new Worker(); $task->onWorkerStart = function($task) { // Executa a cada 2,5 segundos $time_interval = 2.5; Timer::add($time_interval, function() { echo "task run\n"; }); }; // Executa todos os workers Worker::runAll(); ``` **Worker ouvindo em uma porta com um protocolo personalizado** Estrutura final do diretório ``` ├── Protocols // Este é o diretório Protocols a ser criado │ └── MyTextProtocol.php // Este é o arquivo de protocolo personalizado a ser criado ├── test.php // Este é o script test a ser criado └── Workerman // Diretório de código-fonte do Workerman, o código lá dentro não deve ser alterado ``` 1. Cria o diretório Protocols e um arquivo de protocolo Protocols/MyTextProtocol.php (de acordo com a estrutura do diretório acima) ```php // O namespace dos protocolos personalizados é unificado como Protocols namespace Protocols; // Protocolo de texto simples, o formato do protocolo é texto + quebra de linha class MyTextProtocol { // Função de empacotamento, retorna o comprimento do pacote atual public static function input($recv_buffer) { // Procura o caractere de quebra de linha $pos = strpos($recv_buffer, "\n"); // Se não encontrar o caractere de quebra de linha, indica que não é um pacote completo, retorna 0 para continuar aguardando dados if($pos === false) { return 0; } // Se encontrar o caractere de quebra de linha, retorna o comprimento do pacote atual, incluindo o caractere de quebra de linha return $pos+1; } // Após receber um pacote completo, ele é automaticamente decodificado usando o método decode. Aqui, apenas remove a quebra de linha. public static function decode($recv_buffer) { return trim($recv_buffer); } // Antes de enviar dados ao cliente, eles são automaticamente codificados pelo método encode e, em seguida, enviados ao cliente. Aqui é adicionada uma quebra de linha. public static function encode($data) { return $data."\n"; } } ``` 2. Usando o protocolo MyTextProtocol para ouvir e tratar solicitações Criar o arquivo test.php, de acordo com a estrutura de diretórios acima ```php use Workerman\Worker; use Workerman\Connection\TcpConnection; require_once __DIR__ . '/vendor/autoload.php'; // #### Worker do MyTextProtocol #### $text_worker = new Worker("MyTextProtocol://0.0.0.0:5678"); /* * Após receber os dados completos (terminando com uma quebra de linha), o MyTextProtocol::decode('dados recebidos') é executado automaticamente. * O resultado é passado para a função de retorno de chamada onMessage através de $data. */ $text_worker->onMessage = function(TcpConnection $connection, $data) { var_dump($data); /* * Envia dados para o cliente. Ao fazer isso, o MyTextProtocol::encode('hello world') é chamado automaticamente para codificar o protocolo, * e depois é enviado para o cliente */ $connection->send("hello world"); }; // Executa todos os workers Worker::runAll(); ``` 3. Testando Abra o terminal e acesse o diretório onde está o test.php, execute `php test.php start` ``` 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. ``` Abra o terminal e teste usando telnet (recomendável usar telnet em um sistema Linux) Supondo que seja um teste local, No terminal, digite telnet 127.0.0.1 5678 Em seguida, insira hi e pressione Enter Você receberá a resposta 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 ```