socket_stream_select: Attendre un flux (stream) et un socket en même temps

Avec PHP, on peut interagir avec l’extérieur (et l’intérieur) du serveur sur lequel est exécuté le PHP à l’aide de flux et de sockets. Pour PHP, les flux – ou streams – et les sockets sont différents, alors qu’au niveau système, ce sont en réalité tous les deux des sockets (différents des sockets tels que l’entend PHP).

L’on travaille sur les deux en utilisant des fonctions toutes distinctes:

Parmi celles-ci, il y a deux fonctions extrêmement utiles: stream_select et socket_select. Elles permettent d’attendre de nouvelles données respectivement depuis un flux et un socket.

Vous pouvez par exemple attendre deux flux de données en même temps avec stream_select. Si l’un des deux a de nouvelles informations, la fonction retourne un entier décrivant le nombre de flux qui ont eu de nouvelles notifications. Vous pouvez aussi ajouter un timeout, etc… De la même manière, vous pouvez attendre un ou plusieurs sockets avec socket_select.

Seulement, si vous travaillez à la fois avec des flux et des sockets… Comment faire?

  1. Vous pouvez très bien mettre des timeout à quelques dizaines de millisecondes, regarder pendant x ms le flux, x ms le socket, puis on recommence… C’est une solution comme une autre mais très peu propre, et qui ne sera jamais “instantanée”.
  2. Vous pouvez utiliser un système, auquel vous vous connecterez en socket, qui écoutera un flux et dès que le flux recevra des données, il vous l’enverra par le socket. Ainsi, vous aurez que des sockets, vous pouvez donc utiliser socket_select.
  3. Mais, pourquoi ne pas créer une fonction socket_stream_select, ou stream_socket_select, comme vous voulez, dans le coeur de PHP, qui transformera les flux et les sockets PHP en sockets systèmes pour les écouter avec la fonction C select ?

Continue reading socket_stream_select: Attendre un flux (stream) et un socket en même temps

facebooktwittergoogle_plusredditpinterestlinkedinmail

Cannot represent a stream of type SSH2 Channel as a select()able descriptor

Une extension PHP nommé ssh2, que l’on peut retrouver dans le dépôt pecl permet de se connecter à un serveur SSH depuis un script PHP à l’aide de plusieurs fonctions. Plus particulièrement, la fonction ssh2_shell qui retourne un flux de données, ou stream, nous permet de mettre en place entre le script PHP et le serveur SSH un vrai échange complet. L’intérêt d’avoir un flux de données pour converser avec un serveur SSH est que l’on peut manipuler assez facilement à l’aide de toutes les fonctions stream_* ces flux. Ça, c’est la théorie.

En pratique, il s’avère que l’utilisation d’un flux SSH2 Channel (retourné par ssh2_shell) avec la fonction stream_select qui permet d’attendre que le flux “change” – c’est-à-dire qu’une donnée arrive – est impossible. En effet, pour utiliser le flux avec stream_select, il faut pouvoir transformer ce flux en une donnée utilisable par la fonction C select(). C’est ce que l’on appelle “caster un stream” en franglais et “to cast a stream” en anglais. Le problème, c’est que la librairie pecl/ssh2 (basée sur libssh2) n’implémente pas cette fonctionnalité, ce qui nous donne droit à un magnifique:

Warning: stream_select() [function.stream-select]: cannot represent a stream of type SSH2 Channel as a select()able descriptor in /path/to/file.php on line XX

Nous allons donc voir comment ajouter cette fonctionnalité simplement, à l’aide de patchs développés par mes soins. Continue reading Cannot represent a stream of type SSH2 Channel as a select()able descriptor

facebooktwittergoogle_plusredditpinterestlinkedinmail