Magento Cron, problemen en oplossingen

mrt
18
2011

Cron is een erg krachtige applicatie om allerlei taken op gezette tijden uit te voeren. Denk hierbij aan onderhoudstaken zoals het legen van logs of het ophalen van de meest recente wisselkoersen. Ideaal voor een e-commerce platform als Magento, maar er zijn helaas een aantal valkuilen.

Instellen

Het instellen van cron voor Magento is erg belangrijk, niet alleen maakt Magento veel gebruik van geplande taken, maar ook ontwikkelaars van extensies kunnen zogenaamde cronjobs inplannen. Er zijn verschillende manieren om cron in te stellen (zie de handleiding van uw hostingpaneel), maar over het algemeen ziet het commando er zo uit:

*/5 * * * * /pad/naar/magento/cron.sh

Bovenstaande regel voert elke 5 minuten een shell-script uit dat het aanroepen van cron.php verder afhandelt (we gaan hier uit van UNIX-hosting). Voor het systeempad naar de Magento-installatie zou ik u willen doorverwijzen naar uw hostingpartij.

BELANGRIJK: het bestand cron.sh dient uitvoerrechten te hebben, CHMOD 744 zou voldoende moeten zijn.

TIP: voor meer informatie over het cron-commando, zie ‘cron’ op Wikipedia.

Natuurlijk hoeft niet elke taak om de 5 minuten uitgevoerd te worden. Magento heeft hier rekening mee gehouden door zelf bij te houden welke taak wanneer uitgevoerd moet worden, bovenstaande regel biedt Magento dus de mogelijkheid om te kijken óf er wat uitgevoerd moet worden.

Testen

Hoe kunnen we nu testen of cron werkt? Oliver Higgins, actief op het MagentoCommerce-forum, heeft een ‘Magento Cron Job Monitor’ (download) geschreven. Dit is een simpel maar doeltreffend PHP-script om de geplande, lopende, succesvolle, gemiste en mislukte taken te bekijken. Plaats het script in een submap in uw Magento-installatie en hernoem het .phps bestand naar .php. Na openen van het script in uw browser ziet u alle beschikbare taken, ‘newsletter_send_all’ wordt elke 5 minuten uitgevoerd dus als cron actief is ziet u elke 5 minuten een succesvolle taak verschijnen.

TIP: als u vermoedt dat er iets fout gaat met betrekking tot de geplande taken, is het verstandig om het aantal minuten dat Magento de gelukte en mislukte taken bewaard te verlengen naar 1440 (24 uur). Dit kunt u in het adminpaneel van Magento instellen onder “System -> Configuration -> [Advanced] System -> Cron”, de opties voor gelukte en mislukte taken heten respectievelijk “Success History Lifetime” en “Failure History Lifetime”.

Problemen

De meeste problemen met betrekking tot cron hebben te maken met het aanroepen: cron.sh heeft geen uitvoerrechten, cron.php wordt vanuit de verkeerde map aangeroepen, etc.

Soms gebeurt het echter dat er een fout in Magento zit, zo kan het gebeuren dat u een kortingsactie in uw webwinkel heeft: 20% korting op bepaalde producten, dit gaat prima maar tot uw verbazing ziet u de volgende dag op de productpagina weer de oude prijs. Zeer vervelend voor u en uw klanten. De oplossing zit in het volgende: Magento hoort elke nacht om 1:00 te controleren of er zogenaamde CatalogRules aflopen die dag. Deze taak wordt echter vaak niet uitgevoerd, dus we gaan deze taak alsnog uit laten voeren door in de installatiemap van Magento het bestand cron.php aan te passen (vanaf regel 41):

[php highlight=”5,6″]
try {
Mage::getConfig()->init()->loadEventObservers("crontab");
Mage::app()->addEventArea("crontab");
Mage::dispatchEvent("default");
$obCatalogRule = Mage::getModel("catalogrule/observer");
$obCatalogRule->dailyCatalogUpdate("0 1 * * *");
} catch (Exception $e) {
Mage::printException($e);
}
[/php]

De gemarkeerde regels zijn toegevoegd en zorgen ervoor dat de benodigde taak alsnog wordt uitgevoerd. Deze fout is overigens niet meer aanwezig in de nieuwste versie van Magento, op het moment van schrijven 1.4.1.1.

Standaard cronjobs in Magento 1.4.1.1

Voor ontwikkelaars kan het handig zijn om te weten welke taken Magento standaard ingepland heeft, de verantwoordelijke module staat tussen haakjes:

  • catalog_product_index_price_reindex_all (Catalog)
  • catalogrule_apply_all (CatalogRule)
  • currency_rates_update (Directory)
  • log_clean (Log)
  • newsletter_send_all (Newsletter)
  • paypal_fetch_settlement_reports (Paypal)
  • catalog_product_alert (ProductAlert)
  • sales_clean_quotes (Sales)
  • aggregate_sales_report_order_data (Sales)
  • aggregate_sales_report_shipment_data (Sales)
  • aggregate_sales_report_invoiced_data (Sales)
  • aggregate_sales_report_refunded_data (Sales)
  • aggregate_sales_report_bestsellers_data (Sales)
  • aggregate_sales_report_coupons_data (SalesRule)
  • sitemap_generate (Sitemap)
  • aggregate_sales_report_tax_data (Tax)
Marco de Vries
Marco de Vries is mede-eigenaar van BigBridge en gespecialiseerd in PHP en front-end development. BigBridge bestaat uit een team van Magento e-commerce professionals. Wij geloven in focus en doen waar we goed in zijn: het ontwikkelen en optimaliseren van succesvolle Magento webshops.
Delen van deze site zijn (met toestemming) overgenomen van Magento Inc. en vertaald (meer info).
Home Privacyverklaring Gebruiksvoorwaarden Mage.Town
Schrijf je gratis in als lid van de Magento AssociationInschrijven
+ +