Estamos intentando configurar una tarea cron para el sitio Magento.
Probamos este trabajo, pero no funcionó para nosotros:
*/5 * * * * php -f /var/www/html/sitename/cron.php
Para depurar probamos este trabajo:
*/5 * * * * /usr/bin/php -q /var/www/html/sitename/cron.php >
/var/www/html/sitename/cron-temp.log 2>&1
Como resultado, encontramos estos errores en cron-temp.log
:
PHP Warning: require(app/bootstrap.php): failed to open stream:
No such file or directory in /var/www/html/sitename/cron.php on line 30
PHP Fatal error: require(): Failed opening required 'app/bootstrap.php'
(include_path='.:/usr/share/php:/usr/share/pear') in /var/www/html/sitename
/cron.php on line 30
cron.php
<?php
// Change current directory to the directory of current script
chdir(dirname(__FILE__));
require 'app/bootstrap.php';
require 'app/Mage.php';
if (!Mage::isInstalled()) {
echo "Application is not installed yet, please complete install wizard first.";
exit;
}
// Only for urls
// Don't remove this
$_SERVER['SCRIPT_NAME'] = str_replace(basename(__FILE__), 'index.php', $_SERVER['SCRIPT_NAME']);
$_SERVER['SCRIPT_FILENAME'] = str_replace(basename(__FILE__), 'index.php', $_SERVER['SCRIPT_FILENAME']);
Mage::app('admin')->setUseSessionInUrl(false);
umask(0);
$disabledFuncs = explode(',', ini_get('disable_functions'));
$isShellDisabled = is_array($disabledFuncs) ? in_array('shell_exec', $disabledFuncs) : true;
$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;
$isShellDisabled = true;
try {
if (stripos(PHP_OS, 'win') === false) {
$options = getopt('m::');
if (isset($options['m'])) {
if ($options['m'] == 'always') {
$cronMode = 'always';
} elseif ($options['m'] == 'default') {
$cronMode = 'default';
} else {
Mage::throwException('Unrecognized cron mode was defined');
}
} else if (!$isShellDisabled) {
$fileName = basename(__FILE__);
$baseDir = dirname(__FILE__);
shell_exec("/bin/sh $baseDir/cron.sh $fileName -mdefault 1 > /dev/null 2>&1 &");
shell_exec("/bin/sh $baseDir/cron.sh $fileName -malways 1 > /dev/null 2>&1 &");
exit;
}
}
Mage::getConfig()->init()->loadEventObservers('crontab');
Mage::app()->addEventArea('crontab');
if ($isShellDisabled) {
Mage::dispatchEvent('always');
Mage::dispatchEvent('default');
} else {
Mage::dispatchEvent($cronMode);
}
} catch (Exception $e) {
Mage::printException($e);
exit(1);
}
Respuesta1
PHP Fatal error: require(): Failed opening required 'app/bootstrap.php'
(include_path='.:/usr/share/php:/usr/share/pear')
Parece que required
no se pueden encontrar sus archivos y por eso arroja el error. Supongo que estos archivos están en /var/www/html/sitename/app/
? En este caso, agregue la siguiente línea al comienzo de su cron.php
:
set_include_path('/var/www/html/sitename/');
Es posible que también deba modificar sus require
declaraciones para incluir una barra diagonal al comienzo de la dirección:
require '/app/bootstrap.php';
require '/app/Mage.php';
Respuesta2
Esta es una suposición realmente descabellada, pero la inclusión podría estar fallando debido a los permisos del directorio/archivo.
Asegúrese de que el usuario para el que está ejecutando el trabajo cron tenga todos los derechos para acceder al directorio donde cron.php
se encuentra el archivo y a todos los archivos que abre.
Es posible que haya modificado los permisos del servidor web que se ejecuta en www-data
, pero está ejecutando el cronjob desde este magento
usuario.
Es posible que desee agregar más información a su pregunta sobre el entorno ( id -u
) y los permisos ( ls -l /var/www/html/sitename/*
) para depurar aún más su problema.
Respuesta3
Como otros han mencionado, su demonio cron está funcionando correctamente, pero PHP tiene problemas para encontrar los archivos necesarios que cron.php requiere para ejecutarse. PHP los busca en las rutas de inclusión especificadas por php.ini y, además, en la raíz del documento para el módulo de Apache, por lo que el sitio en sí funciona; para la versión de línea de comandos de PHP, esta ruta adicional es el directorio de trabajo actual.
Debería funcionar si se asegura de que PHP se ejecute desde la raíz del documento, es decir, cambie cron para ejecutar el comando de la siguiente manera:
*/5 * * * * cd /var/www/html/sitename && php -f /var/www/html/sitename/cron.php