Comment programmer avec Yii2 Exécution des services Cron

Ce que vous allez créer

Si vous demandez, "Qu'est-ce que Yii?" Découvrez mon tutoriel précédent: Introduction au framework Yii, qui passe en revue les avantages de Yii et inclut un aperçu des nouveautés de Yii 2.0, publiées en octobre 2014.

Dans cette série de programmation avec Yii2, je guide les lecteurs dans l'utilisation du framework Yii2 pour PHP. Dans le tutoriel d'aujourd'hui, je vais partager avec vous comment tirer parti de la capacité de la console de Yii pour exécuter des tâches cron..

Dans le passé, j’utilisais wget dans mes tâches cron: une URL accessible sur le Web exécutait mes tâches en arrière-plan. Cela posait des problèmes de sécurité et posait quelques problèmes de performances. Tandis que je cherchais quelques moyens d'atténuer les risques dans les épisodes de sécurité de notre série de startups, j'avais espéré passer aux commandes pilotées par console. Et avec Yii2 c'est assez simple.

Dans l'exemple d'aujourd'hui, je vais vous présenter les commandes cron basées sur la console de mon site Twixxr, décrites dans cet épisode de l'API Twitter. En raison de limites de taux et de problèmes de gestion des performances, l’API de Twitter dépend fortement de tâches efficaces et fiables. C'est donc un excellent exemple à partager avec vous.

Avant de commencer, je le répète: je suis toujours reconnaissant de vos idées et de vos commentaires. Si vous avez une suggestion de question ou de sujet, merci de poster vos impressions dans les commentaires ci-dessous. Vous pouvez également me joindre directement sur Twitter @reifman.

Qu'est-ce que Cron??

Wikipedia décrit cron comme "un planificateur de travaux basé sur le temps dans les systèmes d'exploitation informatiques de type Unix". Et c'est assez précis. Fondamentalement, cron exécute toutes les tâches d'arrière-plan dont nous avons besoin pour exécuter les services Web, de la gestion des journaux aux sauvegardes en passant par les requêtes d'API et le nettoyage de la base de données..

Pour voir vos tâches cron existantes sur un serveur, vous tapez généralement sudo crontab -l et voir quelque chose comme ça:

# Editez ce fichier pour introduire les tâches à exécuter par cron. # # Chaque tâche à exécuter doit être définie par une seule ligne # indiquant avec différents champs à quel moment la tâche sera exécutée # et quelle commande exécuter pour la tâche # # Pour définir le temps, vous pouvez fournir des valeurs concrètes pour # minute (m ), heure (h), jour du mois (dom), mois (lundi), # et jour de la semaine ou utilisez "*" dans ces champs (pour "tout"). # # Notez que les tâches seront lancées basé sur la notion de temps et de fuseaux horaires du démon système # du système cron. # # La sortie des travaux crontab (y compris les erreurs) est # envoyée par courrier électronique à l'utilisateur auquel le fichier crontab appartient (à moins qu'il ne soit redirigé). # # Par exemple, vous pouvez exécuter une sauvegarde de tous vos comptes utilisateur # à 5 heures chaque semaine avec: # 0 5 * * 1 tar -zcf /var/backups/home.tgz / home / # # Pour plus d'informations, consultez la section pages de manuel de crontab (5) et cron (8) # # mh commande mon dow commande * / 3 * * * * wget -O / dev / null http://meetingplanner.io/daemon/frequent * / 15 * * * * wget -O / dev / null http://meetingplanner.io/daemon/quarter 0 * * * * wget -O / dev / null http://meetingplanner.io/daemon/hourly 15 1 * * * wget -O / dev / null http://meetingplanner.io/daemon/overnight 40 2 * * * / usr / sbin / automysqlbackup 15 3 * * 5 wget -O / dev / null http://meetingplanner.io/daemon/weekly 30 2 * * 1 / opt / letsencrypt / letsencrypt-auto renew >> /var/log/le-renew.log

Le côté gauche indique que ces tâches doivent être activées toutes les 3 ou 15 minutes ou tous les jours à minuit, etc., tandis que le côté droit correspond au script à exécuter.. Voir également Planification de tâches avec des tâches cron (Envato Tuts +).

Notez que le script Let's Encrypt est une commande de console unique. Il court depuis la ligne de commande sur notre serveur. Cependant, toutes les tâches de Meeting Planner décrites ci-dessus sont exécutées via wget. Cela agit comme si un robot se trouvait sur un navigateur Web à une heure précise et exécutait des requêtes sur notre application Web qui effectuaient des tâches en arrière-plan.

Outre la surcharge requise par une requête Web externe et les limites de délai d'expiration des scripts sur les serveurs, vous devez sécuriser ces points d'accès. Voici un exemple de la façon dont Meeting Planner le fait:

// seuls les travaux cron et les administrateurs peuvent exécuter la fonction public des actions de ce contrôleur beforeAction ($ action) // votre code personnalisé ici, si vous voulez que le code soit exécuté avant les filtres d'action, // qui sont déclenchés sur [[EVENT_BEFORE_ACTION]] événement, par exemple PageCache ou AccessControl if (! Parent :: beforeAction ($ action)) return false;  // autre code personnalisé ici si (($ _SERVER ['REMOTE_ADDR'] == $ _SERVER ['SERVER_ADDR']) || (! \ Yii :: $ app-> user-> isGuest && \ common \ models \ User :: findOne (Yii :: $ app-> user-> getId ()) -> isAdmin ())) return true;  return false; // ou false pour ne pas exécuter l'action

Il vérifie que l'utilisateur est connecté en tant qu'administrateur ou s'exécute localement sur le serveur avec une adresse IP Internet identique..

Implémentation de commandes Cron basées sur la console

Alex Makarov, l'un des principaux bénévoles à l'origine du développement du cadre Yii, m'a été utile en répondant à mes questions alors que j'écris régulièrement au sujet du cadre pour Envato Tuts +. Après avoir lu mon épisode de sécurité, il m'a demandé pourquoi je n'utilisais pas la capacité de console inhérente à Yii2 pour les tâches cron. En gros, je ne le savais pas.

Tout comme j'avais un /frontend/controllers/DaemonController.php, j'ai créé un /console/controllers/DaemonController.php. Pour ce tutoriel, je le ferai pour le service Web Twixxr plus petit et plus simple..

J'ai l'habitude d'utiliser la console pour exécuter des migrations de bases de données (par exemple,. ./ yii migrate / up 7), mais c'est tout. J'avais hâte d'essayer de l'utiliser pour des tâches d'arrière-plan.

Comme je l'ai écrit dans un précédent tutoriel, mon nouveau site, Twixxr, nécessite de nombreux processus d'arrière-plan pour effectuer régulièrement la rotation des appels d'API afin que toutes les demandes d'utilisateurs soient destinées à créer un lien d'amitié avec des comptes Twitter influents détenus par des femmes.. 

Voici à quoi ressemble la page d'accueil:

J'ai donc pensé que Twixxr serait un excellent banc d'essai pour exécuter un contrôleur cron basé sur une console..

Le nouveau DaemonController.php

Voici le noyau de mon nouveau DaemonController.php basé sur une console:

process ($ time_start); $ time_end = microtime (true); echo 'Traitement pour'. ($ time_end- $ time_start). ' secondes ';  fonction publique actionQuarter () // appelée toutes les quinze minutes $ x = new \ frontend \ models \ Twixxr (); $ x-> loadProfiles ();  public function actionHourly () // toutes les heures $ current_hour = date ('G'); if ($ current_hour% 4) // toutes les quatre heures if ($ current_hour% 6) // toutes les six heures

Notez que c'est assez identique à la structure de mon contrôleur frontal, mais il est inaccessible au Web de manière sécurisée car il se trouve dans l'arborescence / console. Aucun site de serveur Web Apache n'est configuré pour parcourir cette zone.

Donc, dans l'exemple ci-dessus, actionFrequent () sera appelé toutes les deux à trois minutes. Il traite un autre ensemble de demandes d'amitié avec Twixxr. D'autre part, actionQuarter () est appelé toutes les 15 minutes et met à jour les informations de profil pour les comptes de navigation. Regardons comment fonctionne la planification dans le fichier cron.

Le nouveau fichier Crontab

Essentiellement, dans mon fichier crontab, je remplace wget par un script Linux direct, comme indiqué ci-dessus, pour les renouvellements de Let's Encrypt..

Vous tapez sudo crontab -e pour éditer ou -l pour lister son contenu. Voici mon fichier cron Twixxr:

$ sudo crontab -l # mh dom commande mon dow * / 3 * * * * / var / www / twixxr / yii daemon / frequent * / 15 * * * / var / www / twixxr / yii daemon / quarter 0 * * * * / var / www / twixxr / yii daemon / hourly 15 1 * * * / var / www / twixxr / yii daemon / pendant la nuit 15 3 * * 5 / var / www / twixxr / yii daemon / hebdomadaire # 40 2 * * * / usr / sbin / automysqlbackup 30 2 * * 1 / usr / bin / letsencrypt renew >> /var/log/le-renew.log

C'est assez simple. Le côté gauche de / var / www / twixxr / yii daemon / frequent est le chemin où réside l'interprète yii, et le côté droit est le contrôleur de la console et la méthode à appeler.

Tout a bien fonctionné. Je n'ai pas encore basculé Meeting Planner, car je souhaite effectuer davantage de tests. Lorsque les tâches en arrière-plan sont interrompues, il est difficile de savoir et de les déboguer (bien que la journalisation des erreurs Sentry aide beaucoup).

Problèmes à prendre en compte

L'un des éléments que j'ai rencontrés est que l'espace de nom de la console est distinct de l'espace de nom frontal. Ainsi, par exemple, le composant SiteHelper.php que j'ai configuré dans mon tutoriel, qui décrit l'exécution de plusieurs sites à partir d'une seule base de code, a échoué lorsque j'ai appelé il. Le supprimer fonctionnait, mais je devais exécuter des tests pour vérifier que le code d'arrière-plan sous-jacent fonctionnait toujours. Cependant, la plupart du temps, le passage au numérique s'est bien déroulé.

Comme pour tout autre changement de code, testez et surveillez attentivement.

Et après

À l'avenir, j'explorerai la création d'API REST dans le cadre Yii2, qui repose par hasard sur la création d'un sous-arbre distinct, comme celui de la console, mais pour les API externes. Bien sûr, cela soulève des problèmes complexes d'authentification et de sécurité… il sera donc amusant de les explorer avec vous. Je vais regarder les API sous plusieurs angles. Je suis vraiment très excité à propos de ça. 

Surveillez les prochains tutoriels de ma série Programming With Yii2 pendant que je continue à plonger dans différents aspects du cadre. Veuillez également explorer la série Building Your Startup With PHP, qui décrit le processus de création de Simple Planner et de Meeting Planner..

Si vous souhaitez savoir quand le prochain tutoriel Yii2 arrive, suivez-moi @reifman sur Twitter ou consultez ma page d'instructeur pour les mises à jour.. 

Liens connexes

  • Yii2 Developer Exchange, mon site de ressources Yii2
  • Planification de tâches avec des tâches cron (Envato Tuts +)
  • Comment implémenter cron dans Yii2 (Documentation Yii)
  • Twixxr, l'exemple de service Web mentionné dans