Créez des démons multiprocesseurs robustes et stables PHP sans le code de la bail. La classe de démon de base gère la boucle principale et les événements et peut fonctionner à n'importe quelle fréquence souhaitée (dans les limites de PHP) . Vous n'avez qu'à implémenter une seule méthode execute pour exécuter un processus de démon, éventuellement en arrière-plan.
En utilisant des tâches et des travailleurs, le démon peut appeler des méthodes sur les processus de fond en toute transparence sans se soucier de gérer les enfants fourchus. Les plugins vous permettent de créer facilement du code réutilisable et partageable pour vos démons. Voir la section des fonctionnalités ci-dessous pour plus d'informations.
De toute évidence, l'écriture de démons robustes, stables et de longue date en PHP n'est généralement pas une bonne idée. C'est au moins très difficile à faire et à bien faire. Personnellement, j'avais besoin d'un démon en PHP parce que j'avais un cadre de site Web entier construit dans Symfony qui avait besoin d'un démon frontal majeur. Je voulais pouvoir réutiliser toutes mes dépendances et entités frontales sans reproduire de ressources ou de configurations.
Bien que cette bibliothèque fasse tout ce qu'elle peut pour vous permettre de créer un démon solide rock, il faut toujours prendre soin de votre code de terres utilisateur pour garder les choses stables.
Voir le wiki pour la documentation.
Voir le répertoire des exemples pour les exemples que vous pouvez exécuter.
Main Loop est maintenue par la classe de démon de base. Tout ce que vous avez à faire est d'implémenter une méthode execute qui sera appelée chaque cycle de boucle. La fréquence de boucle peut être n'importe quelle valeur fractionnée en secondes. Si vous êtes défini sur 0, votre méthode execute sera appelée le plus rapidement possible ( non normalement recommandée, à moins que votre boucle ne fasse une sorte d'appel de blocage, c'est-à-dire: écouter sur une prise, etc. ).Une tâche vous permet d'appeler n'importe quelle méthode ou rappel dans un processus d'arrière-plan. Aucune communication n'est effectuée entre le processus de fond et le parent. Les tâches sont destinées à des choses simples, par exemple: l'envoi d'un e-mail.
Un travailleur vous permet d'appeler n'importe quelle méthode sur un objet, ou même simplement un simple rappel comme une tâche. Les travailleurs peuvent renvoyer une valeur au parent via une instruction return simple dans vos méthodes de travail. Les travailleurs sont maintenus automatiquement et peuvent avoir plusieurs enfants en même temps, ce qui est géré de manière transparente. Même si un travailleur décède ou est tué par le système d'exploitation, l'API Daemon renverra toujours un résultat (ou une exception) à votre code. La valeur de retour d'un travailleur est généralement un objet Promise . Vous pouvez utiliser les méthodes de promesse standard comme then ou otherwise pour agir sur la valeur de retour. Ou vous pouvez enregistrer un rappel ON_RETURN sur le travailleur.
Les travailleurs utilisent un modèle de conception de médiateur et utilisent la mémoire partagée pour sa file d'attente et ses données de messagerie. Différentes classes IPC peuvent être créées pour fournir des méthodes de communication alternatives entre le parent et les enfants. Je pourrais travailler sur une deuxième classe IPC qui utilise des sockets au lieu de SHM pour fournir un autre choix .
Daemon Core propose plusieurs événements (voir: événements) avec lesquels vous pouvez facilement vous interfacer en enregistrant un rappel. Certains événements ont les moyens de changer le comportement du démon.ON_SIGNAL dans votre code. Votre rappel passera un SignalEvent avec le signal qui a été capturé.Plugin simple vous permet d'utiliser et de créer vos propres plugins qui peuvent être injectés dans le démon. Les plugins peuvent être chargés paresseusement.FileLock vous permet d'ajouter un mécanisme de verrouillage pour empêcher votre démon d'exécuter plus d'une instance à la fois. Enregistrez simplement le plugin dans votre démon et le reste est automatique. Un ShmLock est similaire mais utilise la mémoire partagée pour obtenir un verrou.Daemon a 3 méthodes de journalisation de base: log , error , debug . Tous ces éléments écrivent dans le fichier journal (s'ils sont configurés). Si le fichier journal est tourné, écrasé ou supprimé, le démon le détectera automatiquement et continuera d'écrire dans le nouveau fichier journal. L'événement Daemonevent :: ON_LOG vous permet également d'enregistrer un rappel pour modifier le comportement. Le code utilisateur peut utiliser le logtrait pour ajouter facilement la journalisation du démon natif à leur code.La base de cette bibliothèque a été inspirée par la bibliothèque PHP-Daemon de Shane Harter sur GitHub. Malheureusement, sa bibliothèque a été abandonnée (ou est sur une pause indéfinie), a été écrite pour PHP v5.3, n'avait pas d'espacement de noms, pas de gestion de package ou de chargeur automatique (IE: Composer).
Je choisis de créer une bibliothèque entièrement nouvelle au lieu de fournir et de modifier sa bibliothèque originale à des fins éducatives. Je n'étais pas non plus d'accord avec certaines de ses méthodologies. J'ai besoin de dépendances supplémentaires, mais le compositeur en fait un problème trivial.
_Ce bibliothèque est dans un état entièrement fonctionnel. J'ai créé des démons très complexes qui fonctionnent depuis des mois sans toute fuite de mémoire ou accidents. Plus pourrait être fait ...