Форум русской поддержки Joomla!® CMS
08.12.2016, 02:19:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Возможно ли выполнить action Controller в Joomla 3 через cron?

 (Прочитано 317 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Cristoff
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 24


« : 20.06.2016, 00:12:27 »

Добрый день.

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

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

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

Может я не под тем углом смотрю на решение?
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Online Online

Пол: Мужской
Сообщений: 2762



« Ответ #1 : 20.06.2016, 01:21:04 »

Проблема 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
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 24


« Ответ #2 : 20.06.2016, 11:13:28 »

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

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

Сделал не так красиво как хотелось бы, но работает:
создал файл cron.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
Группа развития
*****

Репутация: +431/-0
Offline Offline

Пол: Мужской
Сообщений: 5315


Крепитесь, други.


« Ответ #3 : 20.06.2016, 12:10:45 »

А я крон на фронтальной части всегда делаю, чтобы отрубить левак - дополнительный пароль в строке запроса.
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Online Online

Пол: Мужской
Сообщений: 2762



« Ответ #4 : 20.06.2016, 12:29:55 »

Забыл уточнить, 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, 12:35:51 от Istaan » Записан
Cristoff
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 24


« Ответ #5 : 20.06.2016, 14:23:26 »

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

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

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

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

Репутация: +694/-25
Offline Offline

Пол: Мужской
Сообщений: 5225



« Ответ #6 : 20.06.2016, 14:49:08 »

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

Репутация: +372/-4
Online Online

Пол: Мужской
Сообщений: 2762



« Ответ #7 : 20.06.2016, 15:49:50 »

нормально)
тогда просто делаешь запрос /cron.php и ты авторизован как админ)
Та да отличная идея Grin
Записан
Cristoff
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 24


« Ответ #8 : 20.06.2016, 16:57:53 »

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

Репутация: +694/-25
Offline Offline

Пол: Мужской
Сообщений: 5225



« Ответ #9 : 20.06.2016, 17:06:50 »

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

Репутация: +372/-4
Online Online

Пол: Мужской
Сообщений: 2762



« Ответ #10 : 20.06.2016, 17:21:10 »

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

Репутация: +0/-0
Offline Offline

Сообщений: 24


« Ответ #11 : 20.06.2016, 18:02:37 »

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

Репутация: +372/-4
Online Online

Пол: Мужской
Сообщений: 2762



« Ответ #12 : 20.06.2016, 18:27:28 »

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

Репутация: +0/-0
Offline Offline

Сообщений: 24


« Ответ #13 : 20.06.2016, 18:43:00 »

Разница в том, о чем я уже говорил раньше, что логика крона может работать и из админки, а там могут быть разные пользователи.
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Online Online

Пол: Мужской
Сообщений: 2762



« Ответ #14 : 20.06.2016, 19:31:30 »

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

Репутация: +0/-0
Offline Offline

Сообщений: 24


« Ответ #15 : 20.06.2016, 19:45:20 »

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

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

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

Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Online Online

Пол: Мужской
Сообщений: 2762



« Ответ #16 : 20.06.2016, 22:25:04 »

На тостере ответа не нашел..
Вы бы ещё на микроволновке поискали Grin
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet