Magento 1.9.1 cron_schedule non è scelto per sempre


12

Ho trascorso quasi 3 giorni e non riesco a capire e realizzare Magento Cron per elaborare le attività pianificate. Sto eseguendo Magento 1.9.1.0 e recentemente ho notato che le e-mail degli ordini sono ora in coda invece di inviarle istantaneamente. Capisco la necessità ma non riesco a fare in modo che il sistema scelga le code.

Ecco il mio vedere per Cronjob. inserisci qui la descrizione dell'immagine

Ecco la mia riga di comando cronjob. inserisci qui la descrizione dell'immagine

Ecco come vengono create le attività nella tabella cron_schedule. inserisci qui la descrizione dell'immagine

Poiché i record vengono creati nella tabella cron_schedule, penso che Cron sia in esecuzione una volta ogni 5 minuti. Se elimino manualmente questi record tramite PhpMyAdmin, i record vengono creati automaticamente dopo qualche tempo.

Ma lo stato delle attività rimane "in sospeso" e mai completo. Non sono sicuro se qualcosa non va nella mia configurazione o mi manca qualcosa. Qualcuno può aiutarmi per favore come eseguire l'attività pianificata in tempo. Inoltre, perché vengono creati più record per un codice lavoro?

Aggiornare

Ho cancellato l'intera tabella e il cron ha creato i lavori pianificati. Tutti i lavori sono in sospeso e non vengono mai eseguiti nemmeno in attesa di oltre 60 minuti. Qualcosa non va in Magento 1.9.1

Aggiornamento 11/02: oggi ho fatto qualche analisi in più sul processo.

Ho modificato cron.php come di seguito

echo 'iam before mdefault 1';
shell_exec("/bin/sh $baseDir/cron.sh $fileName -mdefault 1 > /dev/null 2>&1 &");
echo 'iam before malways 1';
shell_exec("/bin/sh $baseDir/cron.sh $fileName -malways 1 > /dev/null 2>&1 &");
echo 'i returned success';

Ho modificato la classe Mage_Cron_Model_Observer come di seguito

public function dispatch($observer) {
  echo 'iam inside dispath';

La mia comprensione era quando il cron esegue -mdefault dovrebbe chiamare la funzione dispatch e l'esecuzione avverrà. Ma quello che è successo è stato come sotto nell'output cron.

Content-type: text/html

iam before mdefault 1iam before malways 1i returned success

Significa che la spedizione non si chiama atall ...

Un altro tentativo

Ho cambiato manualmente la variabile $isShellDisabled = true;e ho cambiato il seguito in cron.php.

if ($isShellDisabled) {
  echo 'before always';
  Mage::dispatchEvent('always');
  echo 'after always';
  Mage::dispatchEvent('default');
  echo 'after default';
} else {
  Mage::dispatchEvent($cronMode);
}

L'output cron per quanto sopra è il seguente

Content-type: text/html

before alwaysiam inside dispath alwaysafter always

Ora chiama sempre "dispatch" ma non "dispatch"

Nessuna delle risposte mi aiuta. Non seleziona mai le attività pianificate. Vale a dire quando Cron viene eseguito per la prima volta ha creato correttamente le attività nella tabella. Ma non esegue mai l'attività.


Cosa succede quando si esegue cron.php da un browser Web? Sarà una pagina vuota, ma intendo cosa succede alle tue attività cron?
seanbreeden,

Prova a usare lo script bash: */5 * * * * /bin/sh PATH_TO_PRODUCTION/cron.shse disponibile.
Phil Birnie,

@seanbreeden, quando corro via l'URL sul browser mostra una pagina vuota. Non è successo nulla alle attività .. Ho aggiornato la domanda con la nuova serie di attività create ...
Malaiselvan,

@PhilB, .sh non fa alcuna differenza. È simile che le attività in sospeso siano in sospeso per sempre, ma sono sicuro che il cron è in esecuzione per ogni 5 minuti.
Malaiselvan,

hai provato a svuotare il cron_scheduletavolo? Controlla se si riempie di nuove attività dopo circa un'ora
Sander Mangel

Risposte:


3

Era la versione PHP di Cron Jobs.

La versione di PHP è stata impostata correttamente per il sito, motivo per cui funzionava; tuttavia Cron Jobs era in esecuzione sul server PHP 5.3 nativo, motivo per cui stavo ottenendo gli errori solo quando eseguivo Cron. Ho aggiornato alla versione 5.5.

Comando Cron modificato:

php /home/mydomainname/public_html/cron.php
to
php55 /home/mydomainname/public_html/cron.php

o in hostgator:

/opt/php55/bin/php /home/mydomainname/public_html/cron.php

in cron.php

$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;

Dopo questa riga, aggiungi:

$isShellDisabled = true;

La menzione dell'esecuzione di cron.php in una specifica versione di PHP (ea-php70 nel mio caso) ha risolto i problemi in cui mi trovavo: corri php -vnel terminale per vedere quale versione di PHP sta usando il terminale. Nel mio caso era 5.6. Così ho dovuto forzare l'utilizzo di PHP 7.0, cambiando phpa ea-php70in crontab -e. Grazie!
Daan van den Bergh,

2

hai provato a svuotare il cron_scheduletavolo? Controlla se si riempie di nuove attività dopo circa un'ora.

Inoltre puoi usare Aoe_Scheduler per disabilitare cronjob specifici. Verifica se uno in particolare potrebbe causare un errore che interrompe tutte le altre attività.

Il modo in cui i cronjob Magento sono impostati in un errore fatale in uno script farà fallire l'esecuzione di tutte le attività


Grazie per la risposta. L'errore irreversibile è stato rilevato in qualche registro? Ho aggiornato alcune altre conclusioni sul mio caso e aggiornato lo stesso nella mia domanda.
Malaiselvan,

@seanbreeden: Oggi ho notato che quando lancio Cron.php tramite browser web funziona alla grande selezionando gli orari. Ciò dimostra che non c'è nessun errore fatale in nessuno degli script. Qualche idea sul perché il cron non sia in esecuzione tramite crontab?
Malaiselvan,

2

Come primo passo suggerirei di ripristinare le tue impostazioni alle impostazioni cron predefinite di Magento:

Valori predefiniti di Magento Cron

Si è verificato un problema con le impostazioni correnti: la pianificazione viene generata ogni 15 minuti ma pianificata in anticipo solo per 5 minuti, lasciando un intervallo di 10 minuti.


Grazie. Anche dopo il ripristino delle impostazioni predefinite non funziona. Alla prima esecuzione, ha creato tutti i lavori nella tabella cron_schedule con l'ora pianificata. I lavori non vengono mai scelti e rimangono nella tabella come in sospeso per sempre. Una cosa che ho notato dopo l'impostazione $isShellDisabled = true;e quando lancio Cron.php tramite browser i lavori vengono scelti ma non tramite CronTab.
Malaiselvan,

Questo problema non è stato ancora risolto. Ci sarà un problema con il mio provider di hosting. Vedo lo script attivato a intervalli regolari ma solo i lavori non vengono selezionati. Inoltre sarà un problema da quando sono migrato dalla 1.8?
Malaiselvan,

Il tuo cronjob ha abbastanza memoria? Prova i log degli errori per vedere se c'è qualcosa che potrebbe aiutarti.
Kristof a Fooman il

questo problema non è ancora risolto ... Ogni giorno mi spezzo la testa. Log degli errori? dove posso vederli?
Malaiselvan,

@Malaiselvan per i log degli errori si prega di verificare con l'amministratore di sistema o il webhost in quanto dovrebbero conoscere la posizione e come accedere al log degli errori del server. Inoltre, potrebbe essere utile eseguire manualmente il processo cron dalla riga di comando: provare entrambi php -f cron.phpe ./cron.shvedere se producono qualcosa per indagare ulteriormente.
Kristof a Fooman

1

Lo stesso problema per me.

Errore "Troppo tardi ...".

Dopo aver pulito la cron_scheduletabella, cron.sh ha smesso di funzionare (non è più in programma).

Ha funzionato solo dopo aver ucciso tutti i vecchi processi Cron.


Nel mio caso, quando Cron viene eseguito per la prima volta, le attività nella tabella sono state create correttamente. Ma non esegue mai l'attività. :-(
Malaiselvan,

1

Ho avuto lo stesso problema. Il mio problema era specifico del fuso orario: le colonne created_ate scheduled_atnella cron_scheduletabella dovevano essere UTC + 0, le mie voci erano UTC + 2.

Per verificarlo puoi semplicemente impostare le date da created_ate scheduled_ata ieri e attendere fino alla prossima pianificazione cron.

Spero che aiuti qualcuno!


1

Su Bluehost, in cron.sh cambia

 PHP_BIN=`which php`

per

 PHP_BIN="php54s"

Di default nell'hosting condiviso esegue PHP 5.2.

Ho anche dovuto cambiare cron.php, sostituendo le due $isShellDisabledrighe con $isShellDisabled = true;

Per eliminare gli avvisi di PHP, ho anche aggiunto queste righe prima

$_SERVER['SCRIPT_NAME'] = 

if (empty($_SERVER['SCRIPT_FILENAME'])) $_SERVER['SCRIPT_FILENAME'] = '~/public_html/cron.php';
if (empty($_SERVER['SCRIPT_NAME'])) $_SERVER['SCRIPT_NAME'] = '/cron.php';
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.