Source de données : Socket


1Présentation

Cette source de données permet de se connecter à un serveur (local ou distant) en utilisant une socket (réseau ou Unix), en TCP/IP, en UDP/IP ou en TCP/IP+SSL.

Elle peut être utilisée pour se connecter à un serveur HTTP(S), (x)inetd, etc.

Si vous avez correctement configuré les paramètres de connexion par socket, Temma crée automatiquement un objet de type \Temma\Datasources\Socket. Par convention, nous partirons du principe que vous avez nommé cette connexion sock dans le fichier etc/temma.php (voir la documentation de la configuration).

La connexion est alors disponible dans le contrôleur en écrivant :

$socket = $this->sock;

Dans les autres objets gérés par le composant d'injection de dépendances, la connexion par socket est accessible en écrivant :

$socket = $loader->dataSources->sock;
$socket = $loader->dataSources['sock'];

2Configuration

Dans le fichier etc/temma.php (voir la documentation de la configuration), vous déclarez le DSN (Data Source Name) qui permet d'ouvrir une socket.

Le DSN permettant de créer la socket s'écrit de la forme : PROTOCOLE://SERVEUR:PORT[#TIMEOUT]
Dans le cas d'une socket Unix, le DSN s'écrira de la forme : unix:///chemin/vers/socket.sock

  • PROTOCOLE : est le protocole à utiliser.
    • tcp : pour ouvrir une socket TCP.
    • udp : pour ouvrir une socket UDP.
    • ssl : pour ouvrir une socket TCP+SSL. L'objet tentera de négocier une connexion SSLv2 ou SSLv3, en fonction du serveur.
    • sslv2 : pour ouvrir une socket TCP+SSLv2.
    • sslv3 : pour ouvrir une socket TCP+SSLv3.
    • tls : pour ouvrir une socket TCP+TLS.
    • unix : pour ouvrir une socket Unix.
  • SERVEUR : est le nom du serveur auquel se connecter, ou son adresse IP. Les adresses IPv6 doivent être écrites entre crochets.
  • PORT : est le numéro de port de connexion.
  • TIMEOUT : (optionnel) est le délai de timeout pour la connexion, en secondes. Ce paramètre ne s'applique que pour les sockets réseau, pas pour les sockets Unix.

Exemples :

  • udp://localhost:7
  • tcp://www.google.com:80
  • ssl://www.google.com:443#3
  • tls://[fe80::1]:443
  • unix:///var/run/myapp/myapp.sock

3Appels unifiés

3.1Accès de type tableau

// envoi d'une ligne sur la socket
// si la donnée n'est pas une chaîne, elle est sérialisée en JSON
// si c'est une chaîne, les "\r" et "\n" sont retirés à la fin
// une séquence CRLF ("\r\n") est ajoutée à la fin de la ligne
$socket[''] = $data;

// lecture d'une ligne de données
// les caractères "\r" et "\n" sont retirés à la fin de la chaîne
$line = $socket[''];

// fermeture de la connexion
// (la socket est rouverte automatiquement en cas de nouvelle écriture)
unset($socket['']);

3.2Méthodes générales

// fermeture de la connexion
// (la socket est rouverte automatiquement en cas de nouvelle écriture)
$socket->remove('');

3.3Gestion de données ligne à ligne

// écriture d'une ligne
// si la donnée n'est pas une chaîne, elle est sérialisée en JSON
// si c'est une chaîne, les "\r" et "\n" sont retirés à la fin
// une séquence CRLF ("\r\n") est ajoutée à la fin de la ligne
$socket->set('', $data);

// écriture de plusieurs lignes
// une séquence CRLF ("\r\n") est ajoutée à la fin de chaque ligne
$socket->mSet([
    'GET / HTTP/1.1',
    'Host: www.myhost.com',
    'Connection: Close',
    '',
]);

// lecture d'une ligne de données
// les caractères "\r" et "\n" sont retirés à la fin de la chaîne
$line = $socket->get('');
// lecture d'une ligne de données en mode non bloquant
$line = $socket->get('', null, false);
// lecture d'une ligne de données avec un timeout de 3 secondes
$line = $socket->get('', null, 3);
// lecture d'une ligne en mode non bloquant, avec un timeout de 2 secondes
$line = $socket->get('', null, [
    'blocking' => false,
    'timeout'  => 2,
]);

3.4Gestion de données brutes

// lecture de données (brutes)
$html = $socket->read('');
// lecture de données (brutes) en mode non bloquant
$html = $socket->read('', null, false);
// lecture de données (brutes) avec un timeout de 3 secondes
$html = $socket->read('', null, 3);
// lecture de données (brutes) en mode non bloquant, avec un timeout de 2 secondes
$html = $socket->read('', null, [
    'blocking' => false,
    'timeout'  => 2,
]);

// écriture de données (brutes)
$socket->write('', $msgData);

// écriture de plusieurs données (brutes)
$socket->mWrite({
    $user1data,
    $user2data,
    $user3data,
]);

// écriture de donées (brutes) à partir d'un fichier local
$socket->copyTo('', '/path/to/file');

// écriture de plusieurs données (brutes) à partir de fichiers locaux
$socket->mCopyTo([
    '/path/to/file1',
    '/path/to/file2',
    '/path/to/file3',
]);