{"id":1670,"date":"2017-12-01T23:58:59","date_gmt":"2017-12-01T21:58:59","guid":{"rendered":"https:\/\/www.h-hennes.fr\/blog\/?p=1670"},"modified":"2020-06-24T09:32:43","modified_gmt":"2020-06-24T07:32:43","slug":"prestashop-gestion-des-taches-cron","status":"publish","type":"post","link":"https:\/\/www.h-hennes.fr\/blog\/2017\/12\/01\/prestashop-gestion-des-taches-cron\/","title":{"rendered":"Prestashop : Gestion des taches cron"},"content":{"rendered":"<p>Contrairement \u00e0 d&rsquo;autres plateformes l&rsquo;ex\u00e9cution et la planification des t\u00e2ches cron sur prestashop n&rsquo;a rien d&rsquo;intuitif pour l&rsquo;utilisateur de l&rsquo;administration ou pour le d\u00e9veloppeur.<br \/>\nC&rsquo;est assez dommage sachant qu&rsquo;elles sont indispensables pour faire tourner correctement une boutique et pour raffraichir entre autre les indexes de recherches ou de la navigation \u00e0 facettes.<\/p>\n<p>Nous allons voir ensemble comment g\u00e9rer les cron ( ou t\u00e2ches planifi\u00e9es ) sur la derni\u00e8re version 1.7 de Prestashop. ( La logique est la m\u00eame pour les anciennes versions )<\/p>\n<p><strong>Installation du module <em>cronjobs<\/em><\/strong><\/p>\n<p>Prestashop propose un module gratuit \u00ab\u00a0<em>cronjobs<\/em>\u00ab\u00a0qui est inclu nativement pour les versions ant\u00e9rieures, mais celui-ci n&rsquo;est plus trouvable sur la version 1.7<br \/>\nSa seule limite, et que la granularit\u00e9 des t\u00e2ches est d&rsquo;une heure, ce qui est amplement suffisant pour l&rsquo;essentiel des sites e-commerce basiques.<\/p>\n<p>Pour l&rsquo;installer il faut r\u00e9cup\u00e9rer le code sur github : <a href=\"https:\/\/github.com\/PrestaShop\/cronjobs\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/PrestaShop\/cronjobs<\/a><\/p>\n<p>Une fois le module install\u00e9 dans sa configuration, il faut choisir le mode \u00ab\u00a0Expert\u00a0\u00bb car le mode basique qui permettait de lancer des crons via un service propos\u00e9 par Prestashop, n&rsquo;est plus fonctionnel c&rsquo;est malheureusement inutile d&rsquo;essayer de l&rsquo;utiliser \ud83d\ude41<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1672\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/12\/crontab-prestashop.jpg\" alt=\"Cronjobs prestashop\" width=\"780\" height=\"339\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/12\/crontab-prestashop.jpg 780w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/12\/crontab-prestashop-300x130.jpg 300w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/12\/crontab-prestashop-768x334.jpg 768w\" sizes=\"auto, (max-width: 780px) 100vw, 780px\" \/><\/p>\n<p>Le mode expert nous donne l&rsquo;url \u00e0 d\u00e9finir dans la crontab de notre serveur ( je reviendrais ult\u00e9rieurement sur la configuration sur un h\u00e9bergement OVH mutualis\u00e9 ) .<br \/>\nCette url se chargera ensuite d&rsquo;ex\u00e9cuter l&rsquo;ensemble des t\u00e2ches planifi\u00e9es que nous allons d\u00e9finir.<\/p>\n<p><strong>Ajout d&rsquo;url basiques<\/strong><\/p>\n<p>Nous pouvons ensuite ajouter les diff\u00e9rentes urls n\u00e9cessaires au bon fonctionnement de notre boutique<\/p>\n<ul>\n<li>mise \u00e0 jour de la navigation \u00e0 facettes<\/li>\n<li>mise \u00e0 jour des sitemaps<\/li>\n<li>&#8230;<\/li>\n<\/ul>\n<p>Via l&rsquo;interface qui est propos\u00e9e nativement par le module<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1673\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/12\/add-new-crontask.jpg\" alt=\"Ajouter t\u00e2che cron\" width=\"780\" height=\"521\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/12\/add-new-crontask.jpg 780w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/12\/add-new-crontask-300x200.jpg 300w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/12\/add-new-crontask-768x513.jpg 768w\" sizes=\"auto, (max-width: 780px) 100vw, 780px\" \/><\/p>\n<p><strong>Ajout des t\u00e2ches cron d&rsquo;un module<\/strong><\/p>\n<p>Jusque la ce module fait aussi bien que l&rsquo;autre module tr\u00e8s utilis\u00e9 pour les t\u00e2ches crons\u00a0 ( <a href=\"http:\/\/www.prestatoolbox.fr\/modules-gratuits\/115-crontab.html\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/www.prestatoolbox.fr\/modules-gratuits\/115-crontab.html<\/a>)<br \/>\nMais pour moi le gros avantage du module natif prestashop et qu&rsquo;il est possible d&rsquo;ajouter automatiquement des t\u00e2ches crons via des modules \ud83d\ude42<\/p>\n<p>Pour faire cela c&rsquo;est tr\u00e8s simple, pour l&rsquo;exemple nous allons r\u00e9aliser un module <strong>hh_cronuser<\/strong> qui souhaite ex\u00e9cuter une t\u00e2che planifi\u00e9e toutes les heures.<\/p>\n<p>Pour cela il suffit de respecter les pr\u00e9-requis suivants :<\/p>\n<ul>\n<li>le module doit impl\u00e9menter le hook <strong>actionCronJob<\/strong><\/li>\n<li>le module doit d\u00e9finir sa p\u00e9riodicit\u00e9 via une fonction <strong>getCronFrequency<\/strong><\/li>\n<\/ul>\n<p>Pour l&rsquo;ensemble du fonctionnement vous pouvez voir les commentaires dans le code complet du module ci-dessous :<\/p>\n<pre lang=\"php\" escaped=\"true\">class Hh_CronUser extends Module {\r\n\r\n    public function __construct() {\r\n        $this-&gt;author = 'hhennes';\r\n        $this-&gt;name = 'hh_cronuser';\r\n        $this-&gt;tab = 'administration';\r\n        $this-&gt;version = '0.1.0';\r\n        $this-&gt;bootstrap = true;\r\n        parent::__construct();\r\n\r\n        $this-&gt;displayName = $this-&gt;l('HH Cron User');\r\n        $this-&gt;description = $this-&gt;l('HH Sample Module with cron possibilities');\r\n        $this-&gt;dependencies = array('cronjobs'); \/\/ D\u00e9pendance \u00e0 mettre en place si obligatoire\r\n    }\r\n\r\n    \/**\r\n     * Installation du module\r\n     * @return boolean\r\n     *\/\r\n    public function install() {\r\n        if (!parent::install() || !$this-&gt;registerHook('actionCronJob') \/\/ Hook \u00e0 impl\u00e9menter \r\n        ) {\r\n            return false;\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n    \/**\r\n     * Hook d'ex\u00e9cution de la crontab\r\n     *\/\r\n    public function hookActionCronJob() {\r\n\r\n        \/\/Exemple basique on va cr\u00e9er un fichier de log et ins\u00e9rer un contenu d\u00e8s que la tache cron est appell\u00e9e\r\n        $fp = fopen(dirname(__FILE__) . '\/cron.log', 'a+');\r\n        fputs($fp, 'CALLED at ' . date('Y-m-d H:i:s'));\r\n        fclose($fp);\r\n\r\n        \/\/Exemple plus avanc\u00e9, on souhaite effectuer des taches diff\u00e9rentes en fonction de l'heure\r\n        $hour = date('H');\r\n\r\n        switch ($hour) {\r\n            case 07:\r\n                \/\/Lancement des actions du matin\r\n                break;\r\n\r\n            case 12:\r\n                \/\/Lancement des actions du midi\r\n                break;\r\n            case 18:\r\n                \/\/Lancement des actions du soir\r\n                break;\r\n            default:\r\n                \/\/Action par d\u00e9faut\r\n                break;\r\n        }\r\n    }\r\n\r\n    \/**\r\n     * Information sur la fr\u00e9quence des taches cron du module\r\n     * Granularit\u00e9 maximume \u00e0 l'heure\r\n     *\/\r\n    public function getCronFrequency() {\r\n        return array(\r\n            'hour' =&gt; -1, \/\/ -1 equivalent \u00e0 * en cron normal\r\n            'day' =&gt; -1, \r\n            'month' =&gt; -1,\r\n            'day_of_week' =&gt; -1\r\n        );\r\n    }\r\n\r\n}\r\n<\/pre>\n<p>Lors de l&rsquo;installation de notre module celui-ci va automatiquement enregistr\u00e9 sa t\u00e2che planifi\u00e9e \u00e0 la fr\u00e9quence souhait\u00e9e, comme vous pouvez le voir sur la capture suivante :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1674\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/12\/crontab-module.jpg\" alt=\"Crontab module\" width=\"780\" height=\"66\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/12\/crontab-module.jpg 780w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/12\/crontab-module-300x25.jpg 300w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2017\/12\/crontab-module-768x65.jpg 768w\" sizes=\"auto, (max-width: 780px) 100vw, 780px\" \/><\/p>\n<p>Vous remarquez qu&rsquo;il n&rsquo;est possible d&rsquo;enregistrer qu&rsquo;une seule t\u00e2che par module, mais en cas de n\u00e9cessit\u00e9 de plusieurs t\u00e2ches \u00e0 des moments diff\u00e9rents vous pouvez toujours lancer le module toutes les heures et g\u00e9rer la logique et les horaires directement dans le module comme dans mon exemple \ud83d\ude42<\/p>\n<p><strong>Cas sp\u00e9cifique h\u00e9bergement mutualis\u00e9 ovh :<\/strong><\/p>\n<p>Chez ovh un certain nombre de restriction s&rsquo;appliquent et il n&rsquo;est pas possible de saisir la commande donn\u00e9es dans le module.<\/p>\n<p>Pour contourner cela nous allons donc cr\u00e9er un fichier \u00ab\u00a0cron.php\u00a0\u00bb que nous allons placer dans la racine du dossier d&rsquo;administration de prestashop avec le contenu suivant :<\/p>\n<p>&nbsp;<\/p>\n<pre lang=\"php\" escaped=\"true\">&lt;?php \/** * Lancement des scripts cron * Utilise le module prestashop cronjobs * Permets de planifier les t\u00e2ches via l'administration * Lancer ce script \u00e0 minima toutes les heures *\/ ini_set('display_errors','on'); include dirname(__FILE__) . '\/..\/config\/config.inc.php'; $link = new Link(); $shop_url = $link-&gt;getBaseLink();\r\n$admin_dir = basename(dirname(__FILE__));\r\n$cron_job_token = Configuration::getGlobalValue('CRONJOBS_EXECUTION_TOKEN');\r\n$cronUrl = $shop_url . $admin_dir . '\/index.php?controller=AdminCronJobs&amp;token=' . $cron_job_token;\r\necho Tools::file_get_contents($cronUrl);\r\n<\/pre>\n<p>Dans le manager OVH il faudra ensuite appeller l&rsquo;url <strong>admin-dir\/cron.php<\/strong> toutes les heures pour que les taches crons s&rsquo;ex\u00e9cutent \ud83d\ude42<br \/>\nPour visualiser les t\u00e2ches planifi\u00e9es cliquer sur le bouton \u00ab\u00a0plus +\u00a0\u00bb<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2162\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2020\/06\/cron_ovh_1-e1592983612600-1024x325.png\" alt=\"\" width=\"780\" height=\"247\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2020\/06\/cron_ovh_1-e1592983612600-1024x325.png 1024w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2020\/06\/cron_ovh_1-e1592983612600-300x95.png 300w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2020\/06\/cron_ovh_1-e1592983612600-768x243.png 768w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2020\/06\/cron_ovh_1-e1592983612600-1536x487.png 1536w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2020\/06\/cron_ovh_1-e1592983612600.png 1612w\" sizes=\"auto, (max-width: 780px) 100vw, 780px\" \/><\/p>\n<p>Saisissez ensuite l&rsquo;adresse du cron et s\u00e9lectionner la version de php de votre h\u00e9bergement<br \/>\nPenser \u00e9galement a bien cocher la case \u00ab\u00a0Activation\u00a0\u00bb ! \ud83d\ude42<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2161\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2020\/06\/cron_ovh_2-1024x964.png\" alt=\"\" width=\"780\" height=\"734\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2020\/06\/cron_ovh_2-1024x964.png 1024w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2020\/06\/cron_ovh_2-300x283.png 300w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2020\/06\/cron_ovh_2-768x723.png 768w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2020\/06\/cron_ovh_2.png 1080w\" sizes=\"auto, (max-width: 780px) 100vw, 780px\" \/><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Contrairement \u00e0 d&rsquo;autres plateformes l&rsquo;ex\u00e9cution et la planification des t\u00e2ches cron sur prestashop n&rsquo;a rien d&rsquo;intuitif pour l&rsquo;utilisateur de l&rsquo;administration ou pour le d\u00e9veloppeur. C&rsquo;est assez dommage sachant qu&rsquo;elles sont indispensables pour faire tourner correctement une boutique et pour raffraichir entre autre les indexes de recherches ou de la navigation \u00e0 facettes. Nous allons voir [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[245],"tags":[509,510,361,369,171,104,483],"class_list":["post-1670","post","type-post","status-publish","format-standard","hentry","category-prestashop-2","tag-cron","tag-crontab","tag-modules","tag-mutualise","tag-ovh","tag-prestashop","tag-prestashop-1-7","prestashop-1-5","prestashop-1-6","prestashop-1-7","prestashop-1-7-4","prestashop-1-7-5","prestashop-1-7-6","prestashop-1-7-7","prestashop-1-7-8","prestashop-8-0","prestashop-8-1"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1670","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/comments?post=1670"}],"version-history":[{"count":7,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1670\/revisions"}],"predecessor-version":[{"id":2164,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1670\/revisions\/2164"}],"wp:attachment":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/media?parent=1670"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/categories?post=1670"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/tags?post=1670"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}