Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP
Code

Gerez des Travaux de Cron avec PHP

by
Difficulty:IntermediateLength:LongLanguages:

French (Français) translation by Katerina Katapodi (you can also view the original English article)

Le cronTab (Cronometre), est un  Linux/daemon qui aide a mettre en programme des taches répétitives, facilitant la routine quotidienne. 

Dans ce seminaire, nous allons  une classe PHP dynamique, utilisant une connection de , qui nous fournit le moyen pour  le cronTab!

Backround-Une Vue du Crontab

Traitons  le, pouvant mettre en programme des taches pour fonctionnement est super! Du backup d'une base de données SQL, en menant/envoyant des emails pour faire operer des taches, analyser la performance, ou meme capter des feeds RSS, les travaux de cron sont merveilleux!

Bienque la mise en programme d'une nouvelle tache soit problematique, a premiere vue, il est assez simple de comprendre lors interrompue.  Un travail de cron doit avoir toujours cinq colonnes, dont chacune  un 'opérateur' chronologique, suivi d'un chemin plein et commande a executer:

Chaque colonne chronologique a une relation  pour mettre une tache en programme.  Elles sont comme suivant:

  • Minutes représentent les minutes d'une heure specifique 0-59 . 
  • Heures represente les heure d'un jour, 0-23 respectivement. 
  • Jours (days)représente  les jours d'un mois , 1-31 respectivement. 
  • Mois représente les mois d'un an, 1-12 environ.
  • Jour de la Semaine represente le jour de la semaine, Dimanche a Samedi, avec des numeros, 0-6 environ. 

Donc, par exemple, si l'on veut mettre en programme une tache pour 12am le premier jour de chaque mois, il doit paraitre comme ca:

Si nous voulons mettre en programme une tache a opérer chaque Samedi a 8:30 am, il faudra l'écrire comme suivant"

Il y a aussi un nombre d'operateurs qui peut etre utilise pour personnaliser le programme encore plus:

  • Commas (virgules) est utilisé pour créer   une liste séparee  par commas de valeurs pour toutes les colonnes du chronometre. 
  • Les tirets sont utilises pour definir un rang de valeurs.
  • Les asteriskis est utilise pour définir  ''tout'' ou 'chaque' valeur. 

Le chronometre (cronTab), par defaut va envoyer un message d'email lorsqu'une tache a été exécutée. 

Le cronTab (chronometre), va envoyer par defaut, un message de email lorsqu'une tache a été exécutée , Dans plusieurs cas, toutefois, ca n'est pas nécessaire.  Nous pouvons limiter les fonctions facilement, toutefois, en diffusant la production standard de cette commande au 'black hole' (trou noir) ou appareil dev/null. En faite, ca c'est un fichier qui va rejeter tout ce que y est écrit.  La diffusion de la production est faite par l'>. Jetons un coup d'oeil, sur comment nous pouvons diffuser la tache pproduite au trou noir, utilsant notre travail echantillon du chronometre qui fait operer une tache mise en programme chaque Samedi a 8:30am:

En plus, si l'on diffuse la production standard a un appareil inactif, nous voudrons probablement y diffuser les erreurs standards aussi.  Nous pouvons faire ca, juste en diffusant les erreurs standards, la ou la production standard a ete deja redirigee, l'appareil inactif.

Etape 1-Le Blueprint

Afin d'utiliser le cronTab avec PHP, il faudra performer des commandes, au serveur isole, comme l'utilisateur dont nous editons le cronTab.  Heureusement, PHP nous donne une manière simple  pour faire ca a travers la bibliotheque SSH2. Vous avez probablement installe ou no installle la bibliotheque, allors, si non, Vous voudrez l'installer:

PHP libssh2 Installation/Configuration

Nous allons commencer notre seminaire, en referant quatre proprietes, qui sont toutes privees:

  • $connection represente notre connection/ressource
  • $path represente la mode de gestion de ce fichier.
  • $handle va representer le nom de notre fichier de cron temporaire.
  • $cron_file represente le chemin entier et nom du fichier de cron temporaire. 

Notre classe doit  capable de connecter et authetifier, comme utilisateur , pour performer des commandes et avoir acces au cronTab d'utilisateur.  Donc, nous allons etablir une connection SSH2 et l'authentifier dans le cadre du constructeur.

Par une connection authentifiée , nous aurons besoin d'une méthode pour pouvoir performer des diverses commandes.   Nous allons appeler la méthode exec(). En general, nous allons appliquer cette méthode   parmi les autres méthode  de notre classe, quand nous voudrons performer une commande au serveur isole. 

Apres, il faudra écrire le cronTab dans un fichier pour pouvoir l'utiliser.  Il faudra aussi eliminer ce fichier quand nous en aurons fini. Définissons la méthode qui a la propriété de mettre la production du cronTab dans un fichier comme write_to_file (), et la  d'eliminer ce fichier comme remove_file ().

Biensur, nous aurons besoin aussi de créer  et eliminer des taches de cron.  Ainsi nous allons definir des méthodes append_cronjob() et remove_cronjon(), respectivement.

Au cas que nous avons efface le seul/dernier travail de cron, il faudra pouvoir eliminer le cronTab entier, plus que essayer de créer un cronTab vide.  Nous allons utiliser la méthode remove_crontab() pour pouvoir gerer ceci.

Finalement, nous  deux  pour aider notre classe. La première méthode ,qui va retourner une valeur boolean, va , si le fichier cron temporaire existe déjà. Le dernier en sera utilise pour afficher des messages d'erreurs s'il y a une erreur. Nous allons appeler les methodes crontab_file_exists et error_message() respectivement.

Etape 2-Le Constructeur!

Le constructeur de classe sera responsable tout d'abord pour l'installation et authentification de la connection SSH2. Je vais prendre quatre arguments, dont chacun a une valeur defaut NULL.

  • $host:représente  l'adresse ip du serveur isole ou nous voulons nous connecter.

  • $port: le portail qui sera utilise pour la connection SSH2
  • $username (nom d'utilisateur): va donner acces au nom d'utilsateur au serveur.
  • $password (mot de passe): represente le mot de passe d'utilisateur au serveur.

Par rapport au constructeur lui meme, la premiere propriete que nous allons definir est $this->path qui va représenter' une liste d'adresses par défaut  ' pour nos fichiers de corn temporaires. 

En effet, nous devrons utiliser juste la constante magique PHP--DIR-- pour definir cette prop. comme le repertoire du travail.  Toutefois, il y a des cas ou cette constante n'est pas definie.  Comme telle, nous allons verifier si --DIR--est definie. 

Si non, nous devrons obtenir la liste d'adresses du travail manuellement. Nous ferons ca, utilisant une combinaison de fonctions du strrpos() et substr() en conjonction avec la constante --FILE--qui  le chemin entier et nom du fichier . 

Nous allons utiliser strrpos(), qui fait retourner la position du dernier cas d'un sous-fichier, pour trouver la position du slash au fiche --FILE-- Cette valeur, que nous allons reserver comme var.$path_length, nous donnera le nombre des caractères  final mais sans y inclure le dernier slash. 

La propriete substr() va en quelque sorte'' épisser'' un fiche lors retour du volume du fichier defini, sur la position du démarrage  de l'épisse et le nombre des caractères  que nous voulons retourner. 

Nous allons passer trois arguments a la fonction substr()

  • le fichier avec lequel nous travaillons 
  • la place de démarrage  de l', dans ce cas 
  • la place finale de l' par la variable $path_length

Nous allons apres enchaîner un slash de promotion a la fin de ce fiche qui va nous donner le directoire du travail de ce moment 

Maintenant, nous allons definir un nom de fichier par defaut pour le fichier de cron temporaire comme $this->handle et après nous allons enchainer   le chemin et traiter les proprietes ensemble comme $this->cron_file Cette prop (propriete) va correspondre au chemin plein par défaut et nom du fichier pour le fichier du cron temporaire. 

Quand ces proprietes seront definies , nous allons desormais travailler, en faisant une connection au serveur et l'authentifier.  Nous allons ajouter quelques erreurs importantes pour etre gerees par notre classe en inscrivant le code suivant dans un bloque de probe/introduction. De cette facon, nous pouvons attraper erreur en jetant  les exceptions pour fournir a l'utilisateur une opinion spécifique. 

Dans le block d'essaie, nous allons vérifier d'abord si tous les arguments  utilisant la fonction is_null() qui va donner vrai ou faux Si quelques de ces  arguments sont NULL, nous allons donner une nouvelle exception par un message .

Apres, nous allons definir $this->connection en passant les arguments $host et $port a la fonction ssh2_connect()qui va  une connection isolee et retourner cette ressource ou FALSE si la connection echoue.

Comme nous utilisons notre propre gestion de fautes, nous allons utiliser aussi l' pour contrôler  les fautes @ qui va  le nombre des messages d' erreurs pour cette fonction.  Si la connection a échoué, nous donnerons une autre exception avec un message respectivement.

Nous allons maintenant authentifier/se connecter utilisant ssh2_auth_password, passant a la ressource retournée  par notre connection ainsi que le nom d'utilisateur et son mot de passe de notre connexion.   ssh2_auth_password() va donner une valeur boolean qui représente  le status  d'authentification selon lequel nous pouvons donner une autre exception si l'authentification n'a pas .  

PHP essaiera de trouver un bloc catch convenable , pour chaque exception qui a , et après créer/passer une exception qui comprend un nombre de proprietes utiles pour ce bloc. 

Donc, dans le bloc catch, nous allons utiliser la methode de l'objet d'exception getMessage pour acceder et afficher le message d'exception.

Vous allez noter que nous allons afficher le message en applicant la methode error_message de notre classe. Bienque cette methode ne soit pas definie encore, elle va juste presenter des messages d'erreurs proprement..

Etape 3-Performant des Commandes Multiples

Nous allons utiliser cette methode pour performer des commandes au serveur isole.  Il est compatible d'introduire des commandes manuellement dans une case, a dire PuTTY. Pour achever une flexibilite plus grande, nous allons publier cette methode pour que les utilisateurs puissent  performer toutes autres commandes lors besoin. Nous allons donner aussi des arguments de  si longue comme au moins l'un d'eux y soit defini.  Ces arguments vont correspondre aux commandes que nous voulons executer utilisant la fonction ssh2_exec ().

Donc, la premiere chose que ferons dans cette methode sera  definir une variable qui représente un nombre du nombre total d'arguments donnés. Nous allons utiliser la fonction du PHP func_num_args() pour achever ce nombre.

Maintenant, au bout d'un bloc d'essaie, nous allons verifier s'il y a d'autres arguments donnes ou non dans cette .  Si le nombre d'arguments est 0, nous allons donner une nouvelle exception  avec un message relatif.

Ensuite, utilisant la fonction func_get_args, nous créerons  un rang de tous les arguments donnes a  cette methode. 

A l''aide un operateur ternaire, nous donnerons une autre variable, $command_string, comme une ligne simple de fiche des commandes de Linux, que nous performons... 

Si nous avons a performer beaucoup de commandes, nous allons utiliser la fonction de PHP implode, pour analyser le rang des arguments d' un fiche. Nous passerons deux arguments a implode(), la colle ou separateur, qui est en faite un fiche qui sera insere entre les éléments  du rang et le rang lui-meme..  Nous allons separer chaque element par un operateur Linux,$$ qui va nous permettre d'executer des commandes consecutives sur une ligne!

Au contraire, s'il y a une seule commande, nous definirons le fiche des commandes comme $arguments {0} qui represente le premier argument/commande.

Quand les commandes seront pretes et analysees comme un fiche, nous pourrons maintenant les performer utilisant la fonction ssh2_exec(). Nous allons adapter le lien de connexion, $this->connection, ainsi que notre $command_string a cette fonction qui va retourner une ligne lors succes ou faux lors echec.

Les lignes sont definies comme  ressources qui font  exposer leur comportement.qui peut etre lu d'une seule ligne ou ecrits en graphe lineaire.

Nous allons utiliser l'operateur de controle d'erreurs @ ici, de nouveau, pour reduire le nombre des messages d'erreurs en jetant notre propre exception, par un message relatif, au cas d'erreur.

Ca c'est pour le bloc d'essai! Au bout du bloc catch, nous allons juste appliquer la methode d'error_message () afin de montrer les messages d'erreurs a notre utilisateur. Lorsque le teste et les blocs catch sont complets, nous allons retourner $this a la fin de la methode exec() qui va enchainer cette methode.

Etape 4-Ecrire le CronTab dans un Fichier

La methode suivante, write_to_file, sera appliquee pour ecrire le cronTab dans un fichier temporaire ou creer un blanc temp.  fichier si il n'y a pas de travaux de cron. It will take two arguments

  • le chemin du fichier temporaire que nous allons creer
  • le nom que nous allons utiliser lors creation.

Continuant avec la logique de notre constructeur et les methodes d'execution, nous allons donner des valeurs defaut pour ces arguments si NULL.

La premiere chose que nous ferons maintenant est verifier si le fichier du cron existe deja, utilisant le boolean crontab_file_exists(), que nous allons creer bientôt. Si le fichier existe, il n'y a pas besoin d'y proceder. Si non, nous allons utiliser un operateur ternaire pour tester les $path et $handle pour determiner si elles sont NULL ou non. Si un d'entre eux ont la valeur NULL, nous utiliserons les secours prédéfinis de notre constructeur pour les définir.

Puis, nous allons enchainer ces proprietes ensemble dans une nouvelle fonction qui va representer le chemin entier et le nom du fichier pour le fichier de cron temporaire.

Apres, nous allons utiliser la commande Linux crontab, avec le set auxiliaire, pour afficher les utilisateurs du cronTab comme production standard.  Apres, utilisant l'operateur Linux, nous allons diffuser la production standard, ou STDOUT, a notre fichier de cron temporaire au lieu d'enchainer $this->cron_file au fiche des commandes. Diffusant la production dans un fiche, utilisant l'operateur >, va creer toujours ce fichier s'il n'existe pas.

Ca fonctionne tres bien mais seulement s'il y a des travaux deja mis en programme dans le cronTab. S'il n'y a pas de travaux de cron, toutefois, ce fichier ne sera jamais cree.  Utilisant l' && pourtant, nous pouvons introduire des commandes aditionnelles/expressions dans ce fiche. Donc, ajoutons une expression relative pour verifier que le fichier de cron deja existe. Si le fichier n'existe pas, cette expression va donner une valeur fausse.  Ainsi, nous pouvons utiliser le | | ou operateur apres cette condition pour creer un nouveau fichier vide lors besoin!

Les commandes placées après  ''ou'' vont executer si la condition/conditions donnent des valeurs fausses.  Maintenant, utilisant l'opérateur de nouveau, cette fois sans le  par une commande ll'spécifique', nous pouvons creer un nouveau fichier vide! Donc, en faite, ce fichier de commandes va produire le cronTab dans un fichier, puis tester si ce fichier existe, que nous allons indiquer qu'il a des entrees dans le cronTab et apres creer un fichier vide, s'il n' y a pas deja. 

Finalement, nous allons utiliser la méthode  exec() en y passant le fichier de commande comme la seule méthode d'aide.  Puis, afin d'integrer cette méthode aussi, nous allons retourner $this.

Etape 5-Eliminer le Fichier de Cron Temporaire

Cette méthode, remove_file est autant facile que possible! Nous allons utiliser la méthode auxiliaire crontab_file_exists, pour verifier si le fichier de cron temporaire existe et apres performer la commandes de Linux rm pour l'eliminer si oui.  Comme d'habitude, nous allons retourner $this pour l'enchainement.

 Etape 6-Créer de Nouveaux Travaux de Cron 

Cette méthode va créer de nouveaux travaux de cron en ajoutant des nouveaux travaux/lignes au fichier de cron temperaire et apres performer la commande crontab sur ce fichier qui va installer tous les travaux comme un nouveau travail de cronTab. Ainsi, append_cronjob() va prendre un support, $cron_jobs, qui sera soit un fichier ou un rang de fichiers qui devront   les travaux de cron ajoutes. 

Nous allons commencer cette méthode en determinan si $cron_jobs est NULL. Si oui, nous allons appliquer la méthode error_message afin de cesser toute autre execution et afficher un message d'erreur a l'utilisateur. 

En faite, nous pouvons enregistrer notre tache au fichier de cron en diffusant la production standard dans le fichier de nouveau.

Puis, nous allons donner une nouvelle variable, $append_cronfile, comme ficher, avec le texte ''echo'' suivi d'un espace et une seule quote a la fin. Nous allons publier ce fichier avec dies travaux de cron, en ajoutant aussi comme la quote de cloture, d'instant. Nous allons construire ce fichier en connenctant l' du fichier. 

Utilisant un operateur ternaire, nous allons determiner si $cron_jobs est un rang ou non. Si oui, nous allons imploser ce rang par de nouvelles lignes, \n, de sorte que chaque travail de cron soit écrit sur sa propre ligne dans le fichier du cron. Si le support $cron_jobs n'est pas un rang, nous allons juste enchainer ce travail au fichier $append_cron sans processus .  De cette facon, nous aurons un fichier bien formatte, sans egard  si nous travaillons avec un rang ou non. 

En faite, nous pouvons enregistrer notre travail comme audio dans fichier du cron, en diffusant la production standard dans le fichier de nouveau.  Ainsi, en enchain.ant les fichier, nous allons ajouter la seule quote de cloture au fichier des commande, ainsi que comme l'operateur Linux >> suivi d'un chemin plein et nom de fichier pour le fichier de cron. L'opérateur >>, differement de l' > qui va toujours effacer le contenu d'un fichier, va ajouter la production a la fin d'un fichier.  Ainsi en utilisant l'opérateur, nous n'allons pas eliminer des travaux de cron.

Nous allons maintenant donner une variable, comme un fiche, avec la commande que nous allons utiliser pour installer le nouveau fichier du cron que nous voulons creer. Ca c'est aussi simple que appliquer la commande du crontab suivie d'une mode et nom du fichier du fichier de cron.

Avant d'executer ces commandes par la méthode exec(), toutefois, nous allons d'abord appliquer la  write_to_file afin de creer le fichier de cron temporaire.  Puis, au bout d'une chaine, nous allons performer ces commandes et utiliser la méthode  remove_file() pour eliminer le fichier temporaire.  Enfin, nous allons appliquer return$this, pour que la méthode  soit connectable. 

Etape 7-Eliminant des Travaux de Cron Existants

Lors nous pouvons créer de nouvelles taches de cron, a condition que nous puissions  les eliminer aussi.  La methode remove_cronjob aura besoin d'aide qui sera une (simple)expression reguliere.  Ce regEx sera utiliser pour trouver des travaux realtifs dans le cronTab en les effacant respectivement. Comme la méthode append_cronjob,la premiere chose qu'il faut faire est de tester si le &cron_jobs, parametre d'aide est NULL et cesser l'execution si oui. Si non,nous allons utiliser create_file pour  le cron tab dans un fichier. 

Ayant cree le fichier du cron, nous allons le lire maintenant dans un rang utilisant la fonction file de PHP.  Cette fonction va analyser un fichier dans le rang et chaque ligne comme élément du rang.  Nous allons passer notre fichier de cron a cette fonction pour iader et apres installer une marque spéciale , FILE_IGNORE_NEW_LINES qui va forcer le fichier d'ignorer toutes les nouvelles lignes. De cette facon, nous aurons un rang avec seulement les travaux de cron eux-. 

S'il n'a pas de travaux de cron programmes, ce rang sera vide. Ensuite, il n'y aura pas de raison de continuer. Donc, nous allons verifier si le $cron_array est vide et cesser l'execution si oui.

Si le cronTab n'est pas vide, nous allons compter les éléments  du $cron_array utilisant la fonction count du PHP. Nous allons reserver cette valeur comme $original_count. Nous allons l'utiliser, pour determiner si l'on a annule des travaux de cron du $cron_array.

Maintenant, nous allons voir si la methode $cron_jobs est un rang ou non. S'il est un rang nous allons naviguer dans lui avec un ''loop'' foreach Au bout de ce 'loop' nous allons executer une fonction seulement, preg_grep Cette fonction fine, pas comme preg_match, va retourner un rang de tous les éléments  du rang qui sont ajustes a l'expression fréquence spécifique  Dans ce cas, au contraire, nous voulons les  du rang qui n'y sont pas ajustes. Pour dire autrement, nous avons besoin d'un rang de tous les travaux du cron, que nous allons garder pour pouvoir activer le cronTab avec juste trois travaux. Ainsi, nous allons installer un signe  ici, PREG_GREP_INVERT, qui va causer preg_grep de retourner un rang de tous les éléments, qui ne sont pas convenables pour l'expression réguliere.  Donc, nous aurons un rang de tous les travaux du cron que nous voulons reserver!

Si l’argument $cron_jobs n’est pas un tableau, nous allons procéder de la même manière, mais sans  itération. En plus, nous allons redefinir le $cron_array comme le rang resultant de la fonction preg_grep ayant pose le signe PREG_GREP_INVERT.

Avec notre set $cron_array, maintenant, nous allons comparer la longueur de ce rang a la longueur originale que nous avons  mis en cache dans la variable $original_count. Si les longueurs sont les mêmes, nous allons juste retourner a la methode remove_file, pour eliminer le fichier de cron temporaire.  Si elles ne sont pas les mêmes , nous allons eliminer le cronTab existant et apres installer le nouveau cronTab. 

Les methodes remove_file, remove_crontab et append_cronjob vont retourner $this, ainsi en retournant ces  nous allons preserver la chianabilite des méthodes . 

Etape 8-Eliminer le Crontab Entier

Eliminer le cronTab entier est assez simple de faire. En faite, nous allons juste performer la commande crontab avec le signe r qui fait eliminer le cronTan entier pour un utilisateur. Comme le crontab , nous pouvons aussi eliminer le fichier de cron temporaire, s'il existe. Apres nous allons return $this afin de preserver la chianabilite.

Etape 9-Quelques Methodes a Vous Aider

Avec le pois brut de notre classe de management de cron , nous allons maintenant jeter un coup d'oeil aux deux petites méthodes mais utiles, que nous avons  dans notre classe, crontab_file_exists et error_message()

  • $this->crontab_file_exists()

    Cette methode  va juste retourner le résultat de file_exists de PHP, vrai ou faux, selon de si le fichier de cron temporaire existe ou non.

  • $this->error_message($error)

    Cette méthode d'aide, aura besoin d;un fiche, representant le message d'erreurs que nous voulons afficher.  Nous allons alors appliquer la  die() afin de cesser l'execution et afficher ce message. Le fiche comme tel sera enchaine al'element <pre> avec un style peu applique a lui. 

Etape 10-Mettre tout ensemble 

Maintenant que nous avons conclu notre classe de management de cron, voyons un peu les exemples sur comment l'utiliser!

  • Commencer la classe et etablir  une connexion authentifiée :

    Tout d’abord, nous allons créer une nouvelle instance de notre classe. Rappelez Vous, que nous devrons passer l'adresse ip, port, nom d'utilisateur et mot de passe au constructeur de classe.

  • Ajoutant une simple tache de cron:

    Avec une connexion authentifiee  sur place, jetons un coup d'oeil sur comment on peut créer un travail de cron simple.

  • Ajouter un rang de travaux de cron:

    Ajouter plusieurs travaux de cron est autant facile qu'ajouter un simple travail de cron. Nous allons juste passer un rang a la methode append_cronjob.

  • Eliminer un simple travail de cron:

    Concernant la facon dont nous avons cree  une simple tache de cron, nous allons maintenant eliminer une. Cette fois, pourtant, nous allons utiliser une expression frequente pour trouver la tache en question. Ce regEx peut etre aussi simple ou aussu complique comme il  faut. En faite, il y a quelques  pour regex pour le travail cherche.  Par exemple, si le travail que Vous devez eliminer est unique, en ce que la commande de fonctionnement n'est pas  autre part dans le cronTab, Vous pouvez juste definir le nom de commande comme Vous etes regEx.  En plus, si Vous voulez eliminer toutes les taches d'un mois, vous pouvez juste ecrire une expression frequente pour trouver une combinaison de tous les travaux d'un mois concret!

  • Eliminant un rang de travaux de cron:

    Eliminer des travaux de cron peut être géré  de la même  facon, comme eliminer un seul travail de cron avec une simple expression, nous allons donner un rang d'expressions  pour travaux de cron a la methode remove_cronjob.

Conclusion

C'est tout mes amis! J'crois que Vous avez été contents de lire cet article comme moi, que je suis amuse  amuse a l'ecrire et que que Vous avez aquis de nouvelles connaissances concernant le cronTab en le  avec PHP.  Merci bien d'avoir lu!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.