Accès aux fichiers Windows en PHP depuis Linux
Voici quelques information sur l'extension libsmbclient-php que je viens de découvrir.
En fouillant dans le code de owncloud et dans ses dépendances, j'ai remarqué quelques bibliothèques et une extension PHP :
- icewind/streams un ensemble de flux (streams) génériques.
- icewind/smb un surcouche pour smbclient et libsmbclient-php
- libsmbclient-php une extension PHP, surcouche à la bibliothèque libsmbclient.
Dans tous les scenarii, pour accéder à des fichier Windows depuis Linux, il faudra utiliser les outils du logiciel Samba.
Bien que je comprenne le besoin d'une implémentation pur PHP (icewind/smb), je pense qu'encapsuler les appels à la commande smbclient est remarquablement laid, et vraiment pas robuste.
Après une première étude, le projet libsmbclient-php m'a semblé intéressant mais un peu tordu à utiliser, car il est nécessaire d'utiliser un ensemble de fonctions dédiées (smbclient_*).
Par exemple, pour afficher le contenu d'un fichier Windows vous devez écrire :
// Creation d'un état state = smbclient_state_new(); // Initialisation avec le domaine, nom d'utilisateur et mot de passe: smbclient_state_init($state, null, 'testuser', 'password'); // Ouverture du fichier $file = smbclient_open($state, 'smb://server/testshare/file.txt', 'r'); if ($file) { // Lecture séquentielle et affichage while ($data = smbclient_read($state, $file, 1000)) { echo $data; } } // Fermeture smbclient_close($state, $file) // Liberation smbclient_state_free($state);
Pas très amusant ;) évidement, il est possible de créer un streamWrapper pour simplifier l'utilisation, comme celui fournit par icewin/smb.
J'ai donc commencé à contribuer à ce projet pour l'améliorer :
- Support des flux 'smb' (PR acceptée) c'était mon principal objectif
- Compatibilité PHP 7 (PR acceptée) ce qui semble indispensable
Il est donc désormais possible d'écrire plus simplement l'exemple précédent :
readfile("smb://testuser:password@server/testshare/file.txt");
Il reste d'autres travaux en cours :
- Renommer l'extension en smbclient (PR en attente)
- Publication sur PECL (pour donner plus de visibilité à cette extension sympathique)
Dans le futur, il pourrait aussi être intéressant de remplacer l'utilisation des ressources par des objects (e.g; SmbClient\\State, SmbClient\\File, SmbClient\\Dir).
Évidement, les RPM de php-libsmbclient sont disponibles dans mon dépôt, la version 0.7.0 dans remi, remi-php55 et remi-php56 ou la version 0.8.0-dev dans remi-test et remi-php70.
Retour et commentaires sont les bienvenus.