Fuente de datos: Socket
1Presentación
Esta fuente de datos puede usarse para conectarse a un servidor (local o remoto) mediante un socket (de red o Unix), TCP/IP, UDP/IP o TCP/IP+SSL.
Puede usarse para conectarse a servidores HTTP(S), (x)inetd, etc.
Si has configurado correctamente los parámetros de conexión del socket, Temma crea automáticamente un objeto de tipo \Temma\Datasources\Socket. Por convención, supondremos que has nombrado esta conexión sock en el archivo etc/temma.php (consulta documentación de configuración).
La conexión está entonces disponible en el controlador de la siguiente forma:
$socket = $this->sock;
En los demás objetos gestionados por el componente de inyección de dependencias, el socket es accesible de la siguiente forma:
$socket = $loader->dataSources->sock;
$socket = $loader->dataSources['sock']
2Configuración
En el archivo etc/temma.php (consulta documentación de configuración), declaras el DSN (Data Source Name) usado para abrir un socket.
El DSN usado para crear el socket se escribe como:
PROTOCOL://SERVER:PORT[#TIMEOUT]
En el caso de un socket Unix, el DSN se escribe de la siguiente forma:
unix:///ruta/a/archivo.sock
-
PROTOCOL: es el protocolo que se utilizará.
- tcp: para abrir un socket TCP.
- udp: para abrir un socket UDP.
- ssl: para abrir un socket TCP+SSL. El objeto intentará negociar una conexión SSLv2 o SSLv3, según el servidor.
- sslv2: para abrir un socket TCP+SSLv2.
- sslv3: para abrir un socket TCP+SSLv3.
- tls: para abrir un socket TCP+TLS.
- unix: para abrir un socket Unix.
- SERVER: es el nombre del servidor al que conectarse, o su dirección IP. Las direcciones IPv6 deben ir entre corchetes.
- PORT: es el número de puerto de conexión.
- TIMEOUT: (opcional) es el tiempo límite para la conexión, en segundos. Este parámetro solo se aplica a los sockets de red, no a los sockets Unix.
Ejemplos:
- udp://localhost:7
- tcp://www.google.com:80
- ssl://www.google.com:443#3
- tls://[fe80::1]:443
- unix:///var/run/myapp/myapp.sock
3Llamadas unificadas
3.1Acceso tipo array
// envía una línea de datos en el socket
// si el dato no es una cadena, se serializa a JSON
// si es una cadena, se eliminan “\r” y “\n” al final
// se añade una secuencia CRLF (“\r\n”) al final de la línea
$socket[''] = $data;
// lee una línea de datos
// los caracteres “\r” y “\n” se eliminan al final de la cadena
$line = $socket[''];
// cierra la conexión
// (el socket se vuelve a abrir automáticamente cuando se realiza una nueva escritura)
unset($socket['']);
3.2Métodos generales
// cierra la conexión
// (el socket se vuelve a abrir automáticamente cuando se realiza una nueva escritura)
$socket->remove('');
3.3Gestión de datos línea por línea
// escribe una línea de datos
// si el dato no es una cadena, se serializa a JSON
// si es una cadena, se eliminan “\r” y “\n” al final
// se añade una secuencia CRLF ("\r\n") al final de la línea
$socket->set('', $data);
// escritura de varias líneas
// se añade una secuencia CRLF ("\r\n") al final de cada línea
$socket->mSet([
'GET / HTTP/1.1',
'Host: www.myhost.com',
'Connection: Close',
'',
]);
// lee una línea de datos
// los caracteres “\r” y “\n” se eliminan al final de la cadena
$line = $socket->get('');
// lee una línea de datos en modo no bloqueante
$line = $socket->get('', null, false);
// lee una línea de datos con un tiempo límite de 3 segundos
$line = $socket->get('', null, 3);
// lee una línea de datos en modo no bloqueante, con un tiempo límite de 2 segundos
$line = $socket->get('', null, [
'blocking' => false,
'timeout' => 2,
]);
3.4Gestión de datos en bruto
// lee datos (en bruto)
$html = $socket->read('');
// lee datos (en bruto) en modo no bloqueante
$html = $socket->read('', null, false);
// lee datos (en bruto) con un tiempo límite de 3 segundos
$html = $socket->read('', null, 3);
// lee datos (en bruto) en modo no bloqueante, con un tiempo límite de 2 segundos
$html = $socket->read('', null, [
'blocking' => false,
'timeout' => 2,
]);
// escribe datos (en bruto)
$socket->write('', $msgData);
// escribe varios datos (en bruto)
$socket->mWrite([
$user1data,
$user2data,
$user3data,
]);
// escribe datos (en bruto) desde un archivo local
$socket->copyTo('', '/path/to/file');
// escribe varios datos (en bruto) desde archivos locales
$socket->mCopyTo([
'/path/to/file1',
'/path/to/file2',
'/path/to/file3',
]);