Fonte de dados: Socket
1Apresentação
Esta fonte de dados pode ser usada para se conectar a um servidor (local ou remoto) usando um socket (de rede ou Unix), TCP/IP, UDP/IP ou TCP/IP+SSL.
Ela pode ser usada para se conectar a servidores HTTP(S), (x)inetd, etc.
Se você configurou corretamente os parâmetros de conexão do socket, o Temma cria automaticamente um objeto do tipo \Temma\Datasources\Socket. Por convenção, vamos supor que você nomeou essa conexão sock no arquivo etc/temma.php (veja a documentação de configuração).
A conexão fica então disponível no controlador da seguinte forma:
$socket = $this->sock;
Nos demais objetos gerenciados pelo componente de injeção de dependências, o socket é acessível da seguinte forma:
$socket = $loader->dataSources->sock;
$socket = $loader->dataSources['sock']
2Configuração
No arquivo etc/temma.php (veja a documentação de configuração), você declara o DSN (Data Source Name) usado para abrir um socket.
O DSN usado para criar o socket é escrito como:
PROTOCOL://SERVER:PORT[#TIMEOUT]
No caso de um socket Unix, o DSN é escrito da seguinte forma:
unix:///path/to/file.sock
-
PROTOCOL: é o protocolo a ser utilizado.
- tcp: para abrir um socket TCP.
- udp: para abrir um socket UDP.
- ssl: para abrir um socket TCP+SSL. O objeto tentará negociar uma conexão SSLv2 ou SSLv3, dependendo do servidor.
- sslv2: para abrir um socket TCP+SSLv2.
- sslv3: para abrir um socket TCP+SSLv3.
- tls: para abrir um socket TCP+TLS.
- unix: para abrir um socket Unix.
- SERVER: é o nome do servidor ao qual se conectar, ou seu endereço IP. Endereços IPv6 devem ser colocados entre colchetes.
- PORT: é o número da porta de conexão.
- TIMEOUT: (opcional) é o tempo limite para a conexão, em segundos. Este parâmetro se aplica apenas a sockets de rede, não a sockets Unix.
Exemplos:
- udp://localhost:7
- tcp://www.google.com:80
- ssl://www.google.com:443#3
- tls://[fe80::1]:443
- unix:///var/run/myapp/myapp.sock
3Chamadas unificadas
3.1Acesso tipo array
// envia uma linha de dados no socket
// se o dado não for uma string, ele é serializado para JSON
// se for uma string, “\r” e “\n” são removidos no final
// uma sequência CRLF (“\r\n”) é adicionada ao final da linha
$socket[''] = $data;
// lê uma linha de dados
// os caracteres “\r” e “\n” são removidos no final da string
$line = $socket[''];
// fecha a conexão
// (o socket é reaberto automaticamente quando uma nova escrita é feita)
unset($socket['']);
3.2Métodos gerais
// fecha a conexão
// (o socket é reaberto automaticamente quando uma nova escrita é feita)
$socket->remove('');
3.3Gerenciamento de dados linha a linha
// grava uma linha de dados
// se o dado não for uma string, ele é serializado para JSON
// se for uma string, “\r” e “\n” são removidos no final
// uma sequência CRLF ("\r\n") é adicionada ao final da linha
$socket->set('', $data);
// escrita de múltiplas linhas
// uma sequência CRLF ("\r\n") é adicionada ao final de cada linha
$socket->mSet([
'GET / HTTP/1.1',
'Host: www.myhost.com',
'Connection: Close',
'',
]);
// lê uma linha de dados
// os caracteres “\r” e “\n” são removidos no final da string
$line = $socket->get('');
// lê uma linha de dados em modo não bloqueante
$line = $socket->get('', null, false);
// lê uma linha de dados com um tempo limite de 3 segundos
$line = $socket->get('', null, 3);
// lê uma linha de dados em modo não bloqueante, com um tempo limite de 2 segundos
$line = $socket->get('', null, [
'blocking' => false,
'timeout' => 2,
]);
3.4Gerenciamento de dados brutos
// lê dados (brutos)
$html = $socket->read('');
// lê dados (brutos) em modo não bloqueante
$html = $socket->read('', null, false);
// lê dados (brutos) com um tempo limite de 3 segundos
$html = $socket->read('', null, 3);
// lê dados (brutos) em modo não bloqueante, com um tempo limite de 2 segundos
$html = $socket->read('', null, [
'blocking' => false,
'timeout' => 2,
]);
// grava dados (brutos)
$socket->write('', $msgData);
// grava múltiplos dados (brutos)
$socket->mWrite([
$user1data,
$user2data,
$user3data,
]);
// grava dados (brutos) a partir de um arquivo local
$socket->copyTo('', '/path/to/file');
// grava múltiplos dados (brutos) a partir de arquivos locais
$socket->mCopyTo([
'/path/to/file1',
'/path/to/file2',
'/path/to/file3',
]);