Archives par mot-clé : php

Win32Service 0.4 pour PHP 7.4

Peut-être savez-vous que la prochaine version de PHP sortira en novembre 2019 ! Il s’agit de la version 7.4 !

La bonne nouvelle c’est que l’extension Win32Service (que je gère) compile avec la version de développement de cette future version !

Cependant, il ne m’est pas possible de réaliser des tests plus poussés, car j’ai maintenant un accès limité à Windows.

Pour ceux que cela intéressent, vous pouvez télécharger la version alpha1 snapshot (ou plus récent) de PHP 7.4 puis le dernier artéfact généré par AppVeyor pour la version actuelle de l’extension Win32Service.

Un grand merci pour vos retours (via les issues de GitHub ou les commentaires) qui me sont bien utiles pour améliorer l’extension.

Modification du 15 juin : La DLL disponible sur github n’est utilisable qu’avec les versions récentes des constructions de PHP 7.4 disponibles dans la section snapshot du site de PHP ou la version 7.4alpha2 qui sortira prochainement.

Win32Service 0.4 for PHP 7.4

Do you know the time to release the next PHP version ? Yes, the PHP version 7.4 will be released in November 2019 !

I have some good news for the extension Win32Service. The latest version built for the next PHP version.

Otherwise, I have a restricted access to Windows and I cannot test more the build.

If you want, you can download the PHP 7.4 alpha1 snapshot (or newer) and the last artifact generated by AppVeyor for the actual version of Win32Service extension.

A big thanks for your feedback (in GitHub issues or in comment here). It’s very useful to enhance this extension.

June 15 update: The DLL available from github can be working only with the recent snapshots releases available from the snapshot section of the PHP website or the PHP 7.4 alpha2 coming soon.

[Win32Service] PHP 7.0 and 7.1 support

For all popular free software project, it is necessary to manage the supported versions.

The community (or the editor) in charge of the project release a new version for fix bugs and security vulnerabilities only for the supported versions.

For PHP, all supported version by the community is available here.

What is the link with Win32Service? The link is easy, to build the extension for each change the project uses the AppVeyor service. This service allows building, run automated tests, and keep the DLL for download. The DLL is used by you to test your projects with the new version and send feedback from the result of your tests.

But, to build this extension, I need to use some tools necessary for the PHP build on Windows. There tools are managed by the PHP community. In fact, I can build this extension only for the supported PHP version with build tools.

Otherwise, you can download the older extension versions from the pecl.php.net website or the releases page from the GitHub project.

If you want the new version of this extension for an unsupported PHP 7 version, you must build yourself this extension.

[Win32Service] Support de PHP 7.0 et PHP 7.1

Comme pour tout projet libre et populaire, il est nécessaire de mettre en place une gestion des versions supportées.

Les versions supportées sont les versions dont l’éditeur ou la communauté chargés du projet propose des mises à jour pour corriger des dysfonctionnements (bugs) ou des vulnérabilités (failles de sécurité).

Pour le projet PHP, c’est le cas et vous pouvez en voir une représentation graphique et tabulaire sur la page dédiée.

Quel est le rapport avec Win32Service ? Le rapport est très simple, l’extension utilise le service en ligne AppVeyor pour construire et tester automatique l’extension pour toutes les modifications réalisées sur le projet. Il permet également le téléchargement des DLL pour les utiliser sur vos environnements et ainsi me fournir des retours d’expérience.

Pour que la construction de l’extension soit réalisée à chaque modification il est nécessaire de récupérer les outils nécessaires pour la compilation de PHP. Ces outils sont gérés par la communauté en charge du projet PHP. Ce fait ne me permet de construire l’extension que pour les versions de PHP actuellement supportées ayant les outils de construction disponible.

Cependant, vous avez toujours la possibilité de télécharger les anciennes versions de l’extension via le site pecl.php.net ou via le projet sur GitHub.

Si vous souhaitez disposer de la dernière version de l’extension sur une version de PHP 7 non supportée, vous avez la possibilité de réaliser vous-même la construction de l’extension.

[Win32Service] Comment utiliser les paramètres de Récupération

Vous avez des services Windows écrit en PHP ? Il utilise l’extension Win32Service ? La version 0.4 apporte la gestion des options de récupération des services.

Ces paramètres permettent de définir des actions à réaliser dans le cas ou votre service défaille. Il existe 3 situations et donc 3 actions possibles qui sont :

  1. Action à réaliser lors de la première défaillance
  2. Action à réaliser lors de la seconde défaillance
  3. Action à réaliser lors des défaillances suivantes

Comment le gestionnaire des services compte-t-il les défaillances ?
Une défaillance est comptée si le programme exécuté sort en indiquant au gestionnaire de service un code retour différent de 0 (zéro).

Avant la version 0.4, quelle que soit la raison de la fin de l’exécution de PHP, la sortie était toujours avec un code égale à 0. Pour permettre de sortir avec une erreur, deux fonctions ont été ajoutées : win32_set_service_exit_mode et win32_set_service_exit_code.

« win32_set_service_exit_mode » permet de modifier le mode de sortie en passant l’argument à faux. PHP informera le gestionnaire des services que la sortie n’est pas correcte.

« win32_set_service_exit_code » permet de définit un code d’erreur lié a l’erreur rencontrée dans votre code. Ce numéro sera converti en « raison de l’erreur » puis enregistré dans le journal d’évènement de Windows.

Il est conseillé d’utiliser ces deux fonctions dès le lancement de votre service pour définir les paramètres de sortie. Ainsi la moindre erreur générée par PHP ou votre code déclenchera la gestion des défaillances.

Maintenant que nous pouvons signaler au gestionnaire des services que notre service défaille, il est intéressant de savoir comment sont utilisées les actions liées aux défaillances. Le gestionnaire de service tient un compteur des défaillances. Ce compteur est remis à zéro après un certain délai (1 jour pas défaut, il est configurable avec le paramètre ‘recovery_reset_period‘ lors de l’enregistrement du service) selon ce compteur, les actions sont exécutées.

Comment les actions en cas de défaillance sont-elles configurées ?
Pour cela il y a deux moyens : soit lors de l’enregistrement du service via la fonction ‘win32_create_service‘ soit en utilisant l’interface graphique du gestionnaire des services.
Avec la fonction ‘win32_create_service’, il existe plusieurs options de configuration liée à la gestion des défaillances. Le nom de toutes ces options commence par ‘recovery_’.

Dorénavant, notre service se relance s’il défaille, mais à quoi correspond le paramètre ‘recovery_delay’. Ce paramètre contient le délai entre la défaillance et l’exécution de l’action à exécuter suite à la défaillance. Il est exprimé en milliseconde et vaut 60000 millisecondes par défaut (soit 1 minute).

Comment réagit le service si la demande d’arrêt est demandée par le gestionnaire de service ?
Pour que la sortie soit correcte et que le gestionnaire de service ne considère pas que l’arrêt est une défaillance, il faut avoir informé le gestionnaire des services que votre service est stoppé via cette fonction ‘win32_set_service_status‘.

Nous avons fait le tour de cette nouvelle fonctionnalité. À vous d’expérimenter. Si vous avez des questions ou des remarques, les commentaires sont là !

Win32Service Bundle

Avec la sortie de la version 0.4 de l’extension Win32Service pour PHP, un nouveau bundle a été rendu disponible. Le but de ce bundle est de faciliter l’intégration de la librairie PHP « service-library » dans Symfony.

Ce bundle permet de limiter le travail nécessaire pour utiliser l’extension et ainsi rendre le travail plus rapide.

Voici un exemple. Vous disposez actuellement d’une commande Symfony exécutée via les tâches planifiées toutes les 2 minutes. Cette commande contient une boucle qui répète x fois le même traitement.

Voici les étapes pour transformer votre commande en service:
1 – ajouter le bundle à votre projet.
2 – ajouter la configuration pour votre service dans le fichier ‘config/package/win32_service.yaml’
3 – écrire une classe qui étant la classe abstraite « Win32Service\Model\AbstractServiceRunner »
4 – placer dans la fonction « run » le code nécessaire pour l’exécution d’un traitement.
5 – définir votre classe comme un service dans la configuration de Symfony avec le tag « win32service.runner » et un alias contenant la même valeur que la clé ‘service_id’ définit dans la configuration du bundle.

Afin de vous guider, voici un exemple concret d’un projet Symfony configuré.
1 – Le bundle a été ajouté dans le fichier ‘composer.json‘ et activé dans le fichier ‘config/bundles.php‘.
2 – Le fichier de configuration ‘config/packages/win32_service.yaml‘ a été ajouté avec un service.
3 – La classe ‘App\WindowsService\FirstService‘ étant la classe abstraite.
4 – La classe est présente dans un dossier dont toutes les classes seront considérées comme des services par Symfony. Il est uniquement nécessaire d’ajouter le tag pour ce service dans le fichier ‘config/services.yaml‘.

Il ne reste plus qu’à écrire le code et faire en sorte que la durée d’exécution de la méthode ‘run’ ne dépasse pas 30s. Cette limite est imposée par Microsoft pour toutes les actions d’un service. Le délai est également de 30 secondes pour le démarrage, la mise en pause, la reprise et l’arrêt d’un service.

Si vous avez des questions ou des suggestions, ou tout simplement un commentaire, je serai content de vous lire.

Nouveautés de Win32Service 0.4

Cette version apporte quelques nouveautés. La plus importante me semble être la gestion des défaillances du service.

Votre service fonctionne normalement et une erreur viens perturber son fonctionnement. PHP sort avec une erreur, mais vous devez relancer le service à la main.

Avec la version 0.4 de l’extension, il est possible de prédéfinir le type de sortie avec un code. Le mode de sortie par défaut est un mode gracieux qui informe juste le gestionnaire de service de l’arrêt de votre service quelques soit la cause réelle du service.

Avec ces nouvelles fonctions (win32_set_exit_mode, win32_set_exit_code), vous pouvez personnaliser le mode de sortie et le code de sortie. Ainsi si votre code lève une exception ou une erreur PHP, il est possible de la récupérer, de l’enregistrer dans un journal d’évènement puis de réaliser une sortie en erreur du service. Ainsi, le gestionnaire des services peut être configuré pour réaliser des actions lié aux défaillances.

Lors de l’arrêt du service, le gestionnaire déclenchera donc l’une des actions possibles selon le nombre de défaillances du service. Relancer le service sera surement votre premier choix. Ainsi à l’issue d’un délai d’attente, le service sera relancera correctement. Il pourra reprendre son travail sans votre intervention.

Dans cette version, quelques paramètres de configuration ont été ajoutés pour configurer le service lors de l’enregistrement auprès du gestionnaire de service.

Premier élément de configuration concerné justement la stratégie de gestion des défaillances. Quelles sont les actions à réaliser lors de la première défaillance, la seconde, les suivantes…

Ainsi, il vous est possible de définir le comportement du service lors de son enregistrement, mais également de déclarer la défaillance du service lors d’une sortie brutale pendant son exécution.

Un dernier élément de configuration apporté par cette version est la gestion des dépendances. Votre service dépend surement d’un autre service (par exemple le service de gestion du réseau). Vous pouvez maintenant déclarer ces dépendances lors de l’enregistrement du service pour que votre service soit démarré après toutes ses dépendances.

Comme à mon accoutumé, la documentation de l’extension a été mise à jour sur le site officiel de PHP tant en anglais qu’en français.

A vous de jouer avec cette nouvelle version. Je suis toujours ouvert à vos retours d’expérience, mais également a vos suggestions d’améliorations.

Projet Win32Service

Pour ceux qui ne le connaissent pas encore, ce projet permet l’exécution de script PHP en tant que service Windows. C’est un équivalent à systemd sous Linux.

Fin 2018, le projet a connu quelques changements, comme le déplacement du dépôt vers une entité indépendante du sponsor, l’ajout d’un nouveau site web et la sortie d’une librairie facilitant l’utilisation de l’extension.

La version 0.4.0 de l’extension PHP est en cours de développement, de nouvelles fonctionnalités sont déjà développées, mais il est toujours possible d’en proposer de nouvelles. La date de sortie n’est pas encore définie.

The new Win32Service library

Today, I want to write a new blog post for a new library. This library is written in PHP and need the Win32Service extension for PHP.

Why this library ? The goal is eased to use the Win32Service extension of separate clearly the two most important part provided by this extension.

The first part is the service management. This can be split in two subparts (register and unregister a service for first and start, pause, continue and stop the service in the second). There’s scripts need an elevated right on the server. Automatically, the security approach allows this usage only in the command line (cli SAPI).

The second part is the service running. This part assumes only the PHP script executed when the service state is « running ».

When you read the official documentation available in the PHP.net website, this different usage is not clearly defined. Many other points are in favor of the library. The full-oriented object is available with the library. An abstract class is provided for the service running. The access denied or service not found errors are converted in special exception and other errors in generic exception provided by the library.

In the execution case, the abstract class provides many hooks to execute some code before the changing of service state. The typical use case is opening a database connexion in start or continue, close-it in pause or stop…

Now with this library, you can write a Windows service easily.
The library is available here with examples. How did you manage your PHP service on Windows Server ?

Retrospective de l’année 2018

L’année 2018 a été riche en évènements autant dans l’actualité que dans mes domaines préférés tels que la sécurité de l’information et mon langage de programmation préféré ; qui est PHP.

Ainsi la documentation française de PHP a connu une nette amélioration dont toute la communauté francophone profite !

Merci aux nombreux contributeurs traducteurs et relecteurs qui soumettent chaque semaine de nouvelles traductions et corrections.

Je vous invite à nous rejoindre pour mettre à jour la traduction, corriger les fautes pour améliorer en permanence la qualité de la documentation française.

Pour cela, un petit tutoriel vidéo avait été réalisé :

Pour ce qui est de la sécurité de l’information, la mise en application du Réglement Général pour la Protection des Données (RGPD) fût l’évènement majeur de cette année et pour certain une prise de conscience sur les traitements réalisés par les entreprises.

Je me rends compte tous les jours qu’en question de sécurité de l’information, personne n’est épargné. Même la petite association qui dispose d’un site internet peut être victime des pirates.

La rétrospective réalisée par Zataz doit servir à prendre conscience des dangers d’internet et à se poser les bonnes questions. Ai-je réellement besoin d’étaler ma vie sur les réseaux sociaux ? Et par conséquent la vie des personnes qui m’entoure ?

Je vous souhaite en cette nouvelle année une bonne protection de vos données personnelles et une prise de conscience sur le contrôle de vos données.

Tous mes meilleurs voeux pour 2019 !