getUser()->setCulture(stLanguage::getOptLanguage());
$config = stConfig::getInstance('stTaskScheluderBackend');
if (!st_task_version_validation($context))
{
exit;
}
$databaseManager = new sfDatabaseManager();
$databaseManager->initialize();
/**
* @var stWebRequest $request
*/
$request = $context->getRequest();
$request->setHostByCulture(stLanguage::getOptLanguage());
$request->setIsSecure(stSecurity::getSSL() == 'shop');
$dispatcher = stEventDispatcher::getInstance();
$dispatcher->connect('task.logger.log', 'st_task_logger_listener');
$config->set(SF_APP . '_cron_error_message', '');
$config->set(SF_APP . '_last_execute_timestamp', time());
$config->save();
stTaskScheluder::initialize();
pake_echo("Rozpoczęcie wykonywania");
stNotification::getInstance()->markAllAsRead('stTaskScheluderPlugin');
// lista tasków do wykonania
$tasks = !isset($options['task']) ? array_keys(stTaskConfiguration::getTasks()) : explode(',', $options['task']);
foreach ($tasks as $taskId)
{
if (!stLock::check(SF_APP, SF_ENVIRONMENT, false))
{
throw new Exception("Aplikacja zablokowana - Wykonywanie harmonogramu zadań zostaje przerwane");
}
$task = stTaskScheluder::getTask($taskId);
if (!$task->getTask()->getTaskConfigurationParameter('frontend') && SF_APP == 'frontend' || SF_APP == 'backend' && $task->getTask()->getTaskConfigurationParameter('frontend'))
{
continue;
}
if (isset($options['reset']) && $options['reset'])
{
$task->getTask()->doFinish();
$task->getLogger()->info("Zakończenie wykonywania");
continue;
}
$offset = 0;
if (!$task->getTask()->getIsActive())
{
if (isset($options['task']))
{
st_task_log($task->getTask(), 'Zadanie **%%task%%** nie jest aktywne', ['%%task%%' => $task->getName()], stTaskLogger::TYPE_WARNING);
}
continue;
}
if (!$task->isReadyToExecute() && !isset($options['force']))
{
if (isset($options['task']))
{
st_task_log($task->getTask(), 'Zadanie **%%task%%** nie wymaga wykonania (użyj parametry --force, aby wymusić wykonanie)', ['%%task%%' => $task->getName()], stTaskLogger::TYPE_WARNING);
}
continue;
}
$task->getTask()->doStart();
$task->setParameter('cli', true);
if ($options)
{
$task->setOptions($options);
}
if (false === $task->doInitialize(true))
{
$task->getTask()->doFinish();
continue;
}
$count = $task->doCount();
$lastOffset = 0;
$suspendedJobCounter = 10;
while ($offset < $count)
{
$offset = $task->doExecute($offset);
if ($offset == $lastOffset)
{
$suspendedJobCounter--;
}
$lastOffset = $offset;
if (!$suspendedJobCounter)
{
$task->getLogger()->warning("Wykryto zapętlenie zadania - Zadanie zostaje automatycznie zakończone");
$task->getTask()->setLastCount(0);
$task->getTask()->setLastOffset(0);
$task->getTask()->setLastProgress(0);
$task->doFinish();
}
if ($task->getStatus() != stTask::STATUS_RUNNING)
{
break 1;
}
}
sleep(1);
}
$databaseManager->shutdown();
pake_echo("Zakończenie wykonywania");
}
if (!function_exists('pake_echo_error'))
{
function pake_echo_error($message)
{
if (pakeApp::get_instance()->get_verbose())
{
echo pakeColor::colorize($message, 'ERR') . "\n";
}
}
}
function st_task_logger_listener(sfEvent $event)
{
st_task_log($event['task'], $event['message'], $event['message_params'], $event['type']);
}
function st_task_log(Task $task, $message, $messageParams = null, $type = stTaskLogger::TYPE_INFO)
{
$i18n = sfContext::getInstance()->getI18N();
if ($type == stTaskLogger::TYPE_ERROR)
{
pake_echo_error($i18n->__($message, $messageParams, get_class($task)));
}
else
{
$message = $i18n->__($message, $messageParams, get_class($task));
$message = preg_replace_callback_array([
'/\*\*([^\s].*?[^\s]|[^\s])\*\*/' => function(array $matches) {
return pakeColor::colorize($matches[1], ['fg' => 'yellow']);
},
'/<(https?:\/\/[^>]+)>/' => function(array $matches) {
return pakeColor::colorize($matches[0], ['fg' => 'yellow']);
},
], $message);
pake_echo_action($task->getName(), $message, 255);
}
}
function st_task_version_validation(sfContext $context)
{
$i18n = $context->getI18N();
$i18n->setCulture(stLanguage::getOptLanguage());
$currentPhpVersion = phpversion();
$config = stConfig::getInstance('stTaskScheluderBackend');
if (floatval($currentPhpVersion) < 7.1 || floatval($currentPhpVersion) >= 7.5)
{
$config->set(SF_APP . '_cron_error_message', array(
'message' => 'Do poprawnego działania moduł wymaga wersji PHP 7.1.x - 7.4.x(aktualnie ustawiona wersja PHP: %version%).
Wykonanie harmonogramu zadań zostało wstrzymane.',
'params' => array('%version%' => $currentPhpVersion),
));
$config->save();
$errorMessage = $i18n->__('Do poprawnego działania moduł wymaga wersji PHP 7.1.x - 7.4.x (aktualnie ustawiona wersja PHP dla zadania cron: %version%).
Wykonanie harmonogramu zadań zostało wstrzymane.', array('%version%' => phpversion()), 'stTaskScheluderBackend');
pake_echo_error(strip_tags($errorMessage));
return false;
}
if (!is_file(sfConfig::get('sf_data_dir') . '/.phpversion'))
{
$config->set(SF_APP . '_cron_error_message', array(
'message' => 'Harmonogram zadań nie był w stanie zidentyfikować wersji PHP sklepu.
Wykonanie harmonogramu zadań zostało wstrzymane.',
'params' => array(),
));
$config->save();
$errorMessage = $i18n->__('Harmonogram zadań nie był w stanie zidentyfikować wersji PHP sklepu.
Wykonanie harmonogramu zadań zostało wstrzymane.');
pake_echo_error(strip_tags($errorMessage));
return false;
}
$shopPhpVersion = file_get_contents(sfConfig::get('sf_data_dir') . '/.phpversion');
$cvc = explode('.', $currentPhpVersion);
$svc = explode('.', $shopPhpVersion);
if (!version_compare($cvc[0] . '.' . $cvc[1], $svc[0] . '.' . $svc[1], '='))
{
$config->set(SF_APP . '_cron_error_message', array(
'message' => 'Do poprawnego działania Harmonogramu zadań wersja PHP dla zadania cron (wersja PHP: %cron_php_version%) musi być taka sama jak wersja PHP sklepu (wersja PHP: %shop_php_version%).
Wykonanie harmonogramu zadań zostało wstrzymane.',
'params' => array('%shop_php_version%' => $shopPhpVersion, '%cron_php_version%' => $currentPhpVersion),
));
$config->save();
$errorMessage = $i18n->__('Do poprawnego działania Harmonogramu zadań wersja PHP dla zadania cron (wersja PHP: %cron_php_version%) musi być taka sama jak wersja PHP sklepu (wersja PHP: %shop_php_version%).
Wykonanie harmonogramu zadań zostało wstrzymane.', array(
'%shop_php_version%' => $shopPhpVersion,
'%cron_php_version%' => $currentPhpVersion
));
pake_echo_error(strip_tags($errorMessage));
return false;
}
return true;
}