Archives de catégorie : PHP

Extension PHP pour réaliser des services Windows

Aujourd’hui, je vais parler d’une extension PHP exclusivement réservée à Windows sur laquelle j’ai travaillé. Il s’agit de l’extension PECL win32service écrite à l’origine par Wez Furlong et maintenue jusqu’à maintenant par Richard Quadling. Cette extension permet d’exécuter un script PHP en tant que service windows et a été mise à jour pour PHP 7.0 et 7.1. Elle est maintenant téléchargeable depuis le dépôt de code source GitHub.

Dans la dernière version 0.2.0 actuellement en beta, quelques nouveautés ont été ajoutées par rapport à la version pour PHP5. La plus importante est la possibilité de charger l’extension quelle que soit la façon d’utiliser PHP (ligne de commande, module apache, CGI, FastCGI). Si vous souhaitez retrouver le comportement de l’extension tel qu’il était en PHP 5, il faut utiliser la version 0.1.2 également disponible pour PHP 7.0 et 7.1.

Voyons maintenant comment l’utiliser. Le Zip téléchargé depuis GitHub contient l’extension pour une version de PHP et pour toutes les variantes (x86/x64 et NTS/TS). Il contient également des scripts qui sont utilisés pour tester l’extension lors du développement.

La première chose à faire est d’installer l’extension adéquate dans le dossier « ext » de votre installation PHP.

Une fois la copie terminée, il est nécessaire de modifier le fichier de configuration « php.ini » pour que l’extension soit chargée.

extension_dir = "ext"
Vérifier que cette valeur est correcte.

Vérifions maintenant que l’extension est bien chargée avec la commande php --ri win32service

Maintenant que l’extension est chargée, il est possible d’utiliser les scripts d’exemples présents dans le zip téléchargé. Pour les utiliser, ouvrez une fenêtre de ligne de commande en tant qu’administrateur et placez-vous dans le dossier des exemples.

Maintenant, installez le service de test avec la commande php.exe service.php create

Ouvrez le gestionnaire de service windows, le service « Windows service PHP test » est maintenant présent.

Vous pouvez le démarrer, l’arrêter et le désinstaller via la ligne de commande.

Propriétés du service Windows
Le service dans le gestionnaire de service windows.
L’arrêt du service depuis la ligne de commande met à jour le gestionnaire de service Windows
La suppression du service peut se faire uniquement via la ligne de commande.

La documentation officielle présente sur le site de PHP est toujours valable.

Vous avez maintenant toutes les cartes en main pour réaliser de beaux services Windows avec PHP 7. Si un plantage intervient, il est possible de rapporter l’incident directement sur GitHub.

Utilisez-vous PHP sur Windows pour développer ou sur votre serveur Windows ?

[Modification du 8 mars 2017]

L’extension est maintenant  suffisamment stable pour être utilisé en production. La version 0.2.0 stable est disponible.

Retour sur l’Atoum Day 2016 de Lyon

Le premier Atoum Day a eu lieu le samedi 4 juin 2016 à Lyon. Cette journée était centrée sur le framework de tests unitaires Atoum pour PHP.

L’après-midi commença vers 14h par la présentation d’Atoum par Julien Bianchi. Cela a permis de voir que le framework a beaucoup évolué depuis les débuts. Et évidemment de mieux le découvrir.

Puis vient le moment de découverte des entrailles du framework (toujours par Julien). Connaître le fonctionnement interne d’un outil permet d’aller plus loin dans son utilisation.

Après une courte pause, Adrien Gallou nous raconte son aventure dans la création du plug-in Atoum pour PhpStorm. De la première version à maintenant, l’histoire est complète. Il a même montré certaines fonctionnalités à venir.

Enfin nous finissons l’après-midi avec Grummfy qui nous parle de la documentation d’Atoum. Comment la mise à jour de la documentation se passe, quels sont les outils utilisés, etc. Il est vrai que la doc est souvent un point faible des projets, mais celle d’Atoum est plutôt de bon niveau. Sans elle, je n’aurais peut-être pas utilisé Atoum.

Ce beau projet de framework de tests unitaires a été initié par mageekguy et je l’en remercie.

Ce fut une journée agréable et j’espère qu’elle se renouvellera. Merci à l’AFUP Lyon pour l’organisation et aux intervenants.

Version 0.1.0 du programme de télérelève EDF

La première version de l’outil permettant de réaliser un télérelevé EDF chez soi est arrivée.

Cette version 0.1.0 fige une première fois le code source et en donne une première base utilisable. J’utilise déjà cette version sur mon Raspberry Pi.

Attention toute fois, cette version corrige un manque dans la base de données SQLITE. Avant cette version, il n’y avait aucun index dans la table relevée.

Si vous utilisez les versions précédentes avec une base SQLITE, il est nécessaire à la mettre à jour manuellement.

Voici les requêtes SQL à exécuter pour la mettre à jour.

Après cela, la base est à jour.

Et vous, avez-vous mis en place un tel système ? Comment gérez-vous votre consommation électrique ?

Télé relève EDF automatique

Après avoir cherché de nombreuses fois la meilleure méthode pour suivre la consommation électrique de la maison, je suis tombé sur un gazouillis qui parlait du télé-relevé EDF côté client.

Puis une recherche Google plus loin, je suis arrivé sur cette page. Les gros avantages de cet exemple pour moi sont que la réalisation a été faite sur un Raspberry Pi et que le code est en PHP. Pour les premiers tests cela fut bien pratique.

Me voilà reparti à réaliser un montage électronique. Le dernier montage était il y a 3 ans maintenant.

Grâce à un généreux collège qui a déjà réalisé la performance, j’ai pu obtenir le bon optocoupleur. Deux résistances plus tard, un câble posé entre le compteur et le Raspberry Pi, me voici parti dans le dur du sujet.

Comme présenté dans le lien donné plus haut, il y a quelques modifications à réaliser dans la configuration du Raspberry Pi  avant de connecter le câble sur le port GPIO.

Ensuite, vient la création du port série. Cette création est rapidement réalisée par la commande suivante   stty -F /dev/ttyAMA0 1200 sane evenp parenb cs7 -crtscts

Avant l’exécution de la commande, soit le fichier  /dev/ttyAMA0 n’existe pas, soit il est muet lors de l’exécution de la commande cat.

Malheureusement, après un redémarrage du Raspberry Pi, le fichier est muet. Afin de palier ce problème, il est nécessaire d’ajouter la commande de création du port série à la cron tab (tâche planifiée) de l’utilisateur root.

Pour modifier la crontab :

Ligne ajoutée :

Maintenant la commande  cat /dev/ttyAMA0 affiche bien les données du télé-relevé après un redémarrage du Raspberry Pi.

Ensuite, étant développeur PHP, j’ai testé les scripts fournis dans l’article mais, n’étant pas pleinement satisfait, j’ai développé une application un peu plus moderne. Une fois développée, je me suis aperçu que le Raspberry ne disposait que de PHP 5.4 qui est incompatible avec mon travail (PHP 5.6 minimum).

Peu importe, PHP est libre, je vais le compiler. Et tant qu’à faire de le compiler, autant prendre la dernière version de PHP 7.0 pour profiter des nombreuses optimisations réalisées sur cette version. Afin de vous épargner bon nombre de désagréments, je vous fournis les commandes permettant la compilation de PHP 7.0 sur un Raspberry Pi A avec Raspbian 7.

Récupération des sources (les commandes durent longtemps) :

Maintenant, il faut installer les librairies et outils nécessaires à la compilation de PHP :

La commande va mettre un certain temps à tout télécharger et installer les packets.

Ajouter le fichier  /home/pi/buildphp2 avec le contenu suivant :

PHP est compilé puis installé dans /opt/php7 . Les fichiers de configuration de PHP sont disponibles dans le dossier /opt/php7/etc/ 

Commande permettant de lancer le script de compilation (à executer depuis la console du Raspberry Pi) :

La compilation a duré 4h15 sur mon Raspberry Pi A.

Une fois la compilation réalisée, un petit test s’impose :

Il y a plus de module car j’ai compilé quelques extensions complémentaires.

Afin de rendre PHP plus facile à utiliser nous allons créer un raccourci :

Maintenant que PHP 7 est compilé et opérationnel, il est temps d’installer le programme de télé-relève.

Pour le télécharger, rien de plus simple. Tout comme pour PH,  l’utilisation de GIT est recommandée.

Maintenant, nous sommes dans le dossier de l’application. La première chose à faire est de télécharger la dernière version du gestionnaire de dépendances Composer.

Une fois installé, installons les dépendances du logiciel :

Après la fin du téléchargement et de l’installation, le logiciel doit être configuré à minima en ajoutant ceci dans le fichier config.yml  situé à la racine du projet :

Le type de compteur correspond à la version la plus courante (doc EDF).

Maintenant vérifions que tout fonctionne bien :

Vérifions que la lecture se passe bien :

Screen Shot 2016-05-26 at 22.37.27

Maintenant que tout fonctionne bien, il reste à mettre en place la dernière chose nécessaire à la réalisation d’un relevé toutes les 5 minutes.

Modifions la crontab de l’utilisateur pi  crontab -e pour y ajouter la ligne suivante :

Que se passera-t-il toutes les 5 mins ? Le gestionnaire de tâches planifiées exécutera la commande « read » de mon application et stockera le relevé dans une base de données sqlite nommé « datas.sqlite ». Elle est située à la racine du projet. Afin de pouvoir vérifier ce qui s’est passé lors de l’exécution, le log est disponible dans le fichier « telereleve.log » également situé à la racine du projet.

Voici un exemple des données présentes dans la base de données (j’ai lu la base de données avec sqlite browser).

Screen Shot 2016-05-26 at 22.48.49

Les données sont exprimées en Wh. Il faut diviser par 1000 pour obtenir des KWh.

Merci de votre intérêt pour mon travail. Je suis impatient de lire vos retours d’expérience et vos commentaires sur le projet.

[Updated] DDD with Broadway and the Design Pattern State

Note : This article is the translate of this article. I use Google Translate for help me to write in english. Please, if you read wrong phrase send me the correct by one comment.

In a refactoring sprint, I found that my main aggregate class took much overweight.

I had exceeded 750 lines of code with, in many actions, a « switch » or a dozen « IF ». This did not please me very much because, if a change was required with this level, the amendment would be difficult.

Continuer la lecture de [Updated] DDD with Broadway and the Design Pattern State

[MàJ] DDD avec Broadway et le Design pattern State

[English version]

Au cours d’un petit sprint de refactorisation, j’ai constaté que la classe de mon principal agrégat prenait beaucoup d’embonpoint.

J’avais dépassé les 750 lignes de code avec, dans beaucoup d’actions, soit un “switch » soit une petite dizaine de “IF”. Cela ne me plaisait pas beaucoup car, si une modification était demandée à ce niveau-là, la modification serait délicate.

Continuer la lecture de [MàJ] DDD avec Broadway et le Design pattern State

[Updated] Symfony, Broadway and the replay event

Note : This article is the translate of this article. I use Google Translate for help me to write in english. Please, if you read wrong phrase send me the correct by one comment.

On of the main advantages of EventSourcing is the replay event for build a new view database or sync the an old view.

Do have you ever wondered how to go about not send emails on events issued by the aggregates ?

In my case, the dilemma is rather important because many things are based on events. If they are replayed, all treatments are rerun.

In my project, I use Broadway (by QandidateLabs) for implementing the CQRS/ES.

For use the default event bus, you must tag any services with broadway.domain.event_listener and extend this class Broadway\Processor\Processor.
All services will be injected into the event bus by a compiler pass. The latter takes 3 arguments: the event bus service identifier, the tag used for get all services to inject her, and the interface name that services must implement to be injected.

You can reuse the code to add a new event bus without write more code.

3 steps for separate into new bus all services necessary for refresh view.

1) Add a new event bus

2) Add new tag for all services to update the view. By exemple mon_bundle.domain.event_listener.
3) Run new compiler pass with new parameters

This is a SOLID code.

Your event listener must also be. One listener one responsibility.

Finally, during the retransmission of events, simply send them on the bus dedicated to replay events to perform the update only the view.
That’s done! You can retransmit all the events to update the view without having to change the configuration of the production application to prevent the resend of the emails.

Get the source code on github.

Now you can share your experiences in the comments.

[MàJ] Symfony, Broadway et le replay d’event

[English version]

L’un des principaux atouts qui reviennent souvent lorsque l’on parle de l’EventSourcing est la réémission des évènements afin de reconstruire la vue (par exemple). Cela peut être pour la construction d’une nouvelle base de vue ou le rafraichissement de la vue désynchronisée.

Ne vous est-il jamais arrivé de vous demander comment s’y prendre pour ne pas renvoyer les emails basés sur les évènements émis par les agrégats ?

Continuer la lecture de [MàJ] Symfony, Broadway et le replay d’event