0 Пользователей и 1 Гость просматривают эту тему.
  • 16 Ответов
  • 1613 Просмотров
*

Cristoff

  • Осваиваюсь на форуме
  • 24
  • 0 / 0
Добрый день.

Задача такая, есть Controller компонента в нем есть Action который выполняет какое-то длительное действие.
Это действие нужно выполнять периодически, для этого есть в *nix механизм cron.

Проблема 1: как запустить URL из cron
- тут наверное можно через cURL, но пока не уверен.
И проблема 2, основная: как пройти авторизацию Joomla, чтобы выполнить Action? Или как ее отключить для выполнения из cron.

Action вызывает логику из модели, которая в свою очередь использует другие модели. Перейти от кода Joomla к Native Php проблематично.

Может я не под тем углом смотрю на решение?
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Проблема 1:
ложите файл cron.php в корень, настраиваете на него крон а дальше:
file_get_contents('site.ru?index.php?option=com_you_component&task=action.cron')!
В контроллере controllers/action.php выполнит метод cron

Проблема 2:
1. если вы будете делать запрос ссылкой то у вас там же уже будет подключено ядро, просто сделайте Програмную авторизацию  в методе cron!
*

Cristoff

  • Осваиваюсь на форуме
  • 24
  • 0 / 0
Забыл уточнить, cron нужно использовать к компоненту в приложении administrator не на site.
Я так понял метод контроллера не может выполниться пока не пройдена авторизация. То есть до выполнения метода вообще не дойдет.

Однако, ваши подсказки помогли мне.

Сделал не так красиво как хотелось бы, но работает:
создал файл cron.php
Код: php
//указать логин и пароль для пользователя
//*****************************************************************//
$credentials = array('username' => 'admin', 'password' => 'admin');
//*****************************************************************//

define('_JEXEC', 1);
define('cron', 1);
define('JPATH_BASE', dirname(__FILE__));
define('DS', DIRECTORY_SEPARATOR);
require_once(JPATH_BASE . DS . 'includes' . DS . 'defines.php');
require_once(JPATH_BASE . DS . 'includes' . DS . 'framework.php');
//JFactory::getApplication('administrator')->initialise();
$app = JFactory::getApplication('administrator');

jimport('joomla.user.helper');
//В этом массиве параметры авторизации! в данном случае это установка запоминания пользователя
$options = array('remember' => true);
//выполняем авторизацию
if (JFactory::getApplication()->login($credentials, $options)) {
//    echo 'Вы успешно авторизированны';
//    die();
} else {
    echo "error";
}
require_once 'components/com_catalog/controllers/dump.php';
$d = new CatalogControllerDump();
$d->cron();

в файле dump.php пришлось добавить несколько require_once для моделей, таблиц и тд.

Пока есть проблемы с ограничением памяти, но задача вроде бы решена.


*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
А я крон на фронтальной части всегда делаю, чтобы отрубить левак - дополнительный пароль в строке запроса.
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Забыл уточнить, cron нужно использовать к компоненту в приложении administrator не на site.
Зачем такой бред, делайте на frontend!
Если для безопасности, то это бред! Ибо тот кто узнает строку к крону и запустит так:
site.ru?index.php?option=com_you_component&task=action.cron , то никакого ущерба сайту не нанесет! Ну выполнится один лишний раз крон.. можно дополнительно параметром передать какой то зашифрованный пароль например:
file_get_contents('site.ru?index.php?option=com_you_component&task=action.cron&pwd='.md5(date('d-m-Y'). 'мой пароль') );
и в начале метода cron
if($_GET['pwd'] !== .md5(date('d-m-Y'). 'мой пароль')) exit;

а вот если так:
site.ru/administrator/?index.php?option=com_you_component&task=action.cron
Так же само выполнит задачи крона, только в этом случае ещё и доступ полный к админке получит! ибо вы сделаете процесс авторизации в автомате! и в браузере он будет заполнен, и гуляй душа...
« Последнее редактирование: 20.06.2016, 11:35:51 от Istaan »
*

Cristoff

  • Осваиваюсь на форуме
  • 24
  • 0 / 0
у меня авторизация проходит до
site.ru/administrator/?index.php?option=com_you_component&task=action.cron
в файле cron.php

а всякий "левак" может отсеять .htaccess или (php_sapi_name() == "cli")

Cron пришел после того как на administrator уже была вся необходимая логика и она там и остается: есть интерфейс взаимодействия, который выполняет то же самое что и крон, только дольше из-за временных ограничений выполнения скрипта. 

Но может вы все и правы, буду пробовать разные варианты.
*

SmokerMan

  • Гуру
  • 5293
  • 720 / 26
у меня авторизация проходит до
site.ru/administrator/?index.php?option=com_you_component&task=action.cron
в файле cron.php
нормально)
тогда просто делаешь запрос /cron.php и ты авторизован как админ)
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
нормально)
тогда просто делаешь запрос /cron.php и ты авторизован как админ)
Та да отличная идея ;D
*

Cristoff

  • Осваиваюсь на форуме
  • 24
  • 0 / 0
жжоте ребята)
Встречный вопрос
как обойти проверку через запрос к /cron.php
Код: php
if(php_sapi_name() == "cli") 
echo "pwned";
else die("access denied")
« Последнее редактирование: 20.06.2016, 16:02:21 от Cristoff »
*

SmokerMan

  • Гуру
  • 5293
  • 720 / 26
жжоте ребята)
Встречный вопрос
как обойти проверку через запрос к /cron.php
уже ответили выше, вынести контроллер на фронт и запускать его с каким-нибудь ключем
Цитировать
index.php?option=com_you_component&task=action.cron&pwd='.md5(date('d-m-Y'). 'мой пароль') );
тогда не будет никакого головняка с авторизацией
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Зачем вообще проходить процедуру авторизации! Все данные по базе можно разнести без этого! И не использовать проверок и ACL! Это лишнее при кроне!
*

Cristoff

  • Осваиваюсь на форуме
  • 24
  • 0 / 0
Зачем вообще проходить процедуру авторизации! Все данные по базе можно разнести без этого! И не использовать проверок и ACL! Это лишнее при кроне!
Храню информацию о пользователе совершившем действие.
Вообще задача была простая. Выполнить метод из контроллера, можно даже и не из контроллера (модели), не важно. Подключив ядро Joomla все стало возможным.
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Храню информацию о пользователе совершившем действие.
Вообще задача была простая. Выполнить метод из контроллера, можно даже и не из контроллера (модели), не важно. Подключив ядро Joomla все стало возможным.
У вас в кроне в любом случае будет все от одного пользователя выполняться
и вот какая разница сделаете вы авторизацию по вбитому вручную логину и паролю, или сразу подставите нужный ID юзера в скрипте?!
*

Cristoff

  • Осваиваюсь на форуме
  • 24
  • 0 / 0
Разница в том, о чем я уже говорил раньше, что логика крона может работать и из админки, а там могут быть разные пользователи.
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Разница в том, о чем я уже говорил раньше, что логика крона может работать и из админки, а там могут быть разные пользователи.
И это решается одной строкой..
$userId = JFactory::getUser()->guest ? 555 : JFactory::getUser()->id;
*

Cristoff

  • Осваиваюсь на форуме
  • 24
  • 0 / 0
Ребята о чем речь?)
Успокойтесь. Вопрос решен.
Все бы так помогали в решении вопросов. На тостере ответа не нашел, решил попытать удачи в этом форуме и результат не заставил себя ждать.

Я вроде бы решил все траблы с Joomla во втором посте этого вопроса, за это отдельное спасибо Istaan.

Тему можно закрывать.

*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
На тостере ответа не нашел..
Вы бы ещё на микроволновке поискали ;D
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Условия отображения для конкретной группы пользователей Joomla 3.4.x

Автор dmik

Ответов: 15
Просмотров: 2597
Последний ответ 29.05.2020, 22:42:15
от voland
Подключить Joomla Framework в своем файле

Автор kolhoz

Ответов: 1
Просмотров: 1469
Последний ответ 06.12.2017, 17:15:42
от Aleks.Denezh
Переделать запросы к БД под Joomla

Автор Glog

Ответов: 3
Просмотров: 1156
Последний ответ 03.07.2017, 17:53:28
от Glog
Поддержка Joomla в PhpStorm

Автор b2z

Ответов: 51
Просмотров: 10245
Последний ответ 28.12.2016, 23:31:39
от b2z
Звязь с базой через php

Автор Frulin

Ответов: 18
Просмотров: 1256
Последний ответ 20.12.2016, 15:06:55
от b2z