Новости Joomla

Человек на GitHub ускорил Joomla в 600 раз на объёме 150к+ материалов в 1700+ категориях

Человек на GitHub ускорил Joomla в 600 раз на объёме 150к+ материалов в 1700+ категориях

👩‍💻 Человек на GitHub ускорил Joomla в 600 раз на объёме 150к+ материалов в 1700+ категориях. На старте его сайт на Joomla 3 вообще не смог обновиться на Joomla 5. Пришлось делать экспорт/импорт материалов. Проделав всё это он запустил-таки этот объём данных на Joomla 5. Тестовый скрипт грузил 200 материалов из этого объёма всего за 94 секунды ))) А главная страница с категориями грузилась 20 секунд. Добавив индекс для таблицы #__content

CREATE INDEX idx_catid_state ON #__content (catid, state);
он сократил время загрузки категорий до 1 секунды. Затем наш герой решил поковырять SQL-запрос в ArticleModel, который отвечает за выборку материалов. И решил заменить тип JOIN на STRAIGHT_JOIN для категорий.
// ->from($db->quoteName('#__content', 'a'))->from(    $db->quoteName('#__content', 'a')    . ' STRAIGHT_JOIN ' . $db->quoteName('#__categories', 'c')    . ' ON ' . $db->quoteName('c.id') . ' = ' . $db->quoteName('a.catid'))// ->join('LEFT', $db->quoteName('#__categories', 'c'), $db->quoteName('c.id') . ' = ' . $db->quoteName('a.catid'))
Что сократило загрузку 200 материалов из 150к с 94 секунд до 5. К слову сказать, боевой сайт на Joomla 3 крутится на 12CPU 64GB рамы. А все манипуляции с кодом он делает на базовом 1CPU 1GB сервере и замеры скорости даны именно для базового сервера. Но это всё в дискуссии, хотя в идеале должно вылиться в Pull Requests. Мы - Open Source сообщество, где никто никому ничего не должен. Джунгли. Но человек ищет пути оптимизации Joomla и предлагает решения. Если оказать поддержку и предложить помощь хотя бы с тестированием самых разнообразных сценариев, то возможно эти улучшения смогут войти в ядро. Пусть не быстро, пусть через несколько лет, пусть не все, но войдут. Достаточно предложить руку помощи и приложить немного усилий.
Дискуссию на GitHub можно почитать здесь.@joomlafeed#joomla #community #php

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

sesil

  • Захожу иногда
  • 82
  • 0 / 0
  • Учусь!
[Решено] set update в foreach
« : 25.12.2013, 19:08:36 »
Всем привет, php еще изучаю, использую Joomla 3.2, пишу парсер расписаний, как бы он в теории должен работать но почему то не работает, пишет
Код: php
Catchable fatal error: Object of class stdClass could not be converted to string in /home/data/www/components/com_schedule/views/crons/tmpl/default.php on line 45

Собственно сам код
Код: php
foreach ($xml->station->date->train as $value) {

$numb = nl2br($value->train->numb.'');
$type = nl2br($value->train->type.'');
$dep_station = nl2br($value->train->dep_station.'');
$arr_station = nl2br($value->train->arr_station.'');
$arr_time = nl2br($value->train->arr_time.'');
$date_start = date("Y-m-d");

$db->setQuery("INSERT INTO #__schedule (`day`, `month`, `year`, `numb`, `type`, `dep_station`, `arr_station`, `arr_time`, `date_start`) VALUES ('{$day}', '{$month}', '{$year}', '{$numb}', '{$type}', '{$dep_station}', '{$arr_station}', '{$arr_time}', '{$date_start}')");
$db->query();

$query ='SELECT id FROM #__schedule ORDER BY id DESC LIMIT 1';
$db->setQuery($query);
$end_rf = $db->loadObject();

foreach ($xml->station->date as $value2) {
     $day = nl2br($value2->day.'');
    $month = nl2br($value2->month.'');
    $year = nl2br($value2->year.'');

$db->setQuery("UPDATE #__schedule SET day='$day', month='$month', year='$year' WHERE id='$end_rf' LIMIT 1");
$db->query();
 
}
}

Хелп ми, уже хз что делать =( где я туплю? подскажите пожалуйста.
« Последнее редактирование: 10.01.2014, 16:15:11 от b2z »
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: set update в foreach
« Ответ #1 : 25.12.2013, 21:06:34 »
Скажите где хоть 45 строка, а ошибка у вас говорит что вы пытаетесь как строку использовать объект!
тоесть допустим есть класс
class myClass{
public $stringData = '123';
}
$myObject = new myClass();
И если вы сделаете echo $myObject  то увидите такую ошибку! А если сделаете echo $myObject->stringData то будет все ок!

кстати зачем вы делаете так: $value->train->numb.''  :o зачем к переменной добавляете пустую строку?
*

sesil

  • Захожу иногда
  • 82
  • 0 / 0
  • Учусь!
Re: set update в foreach
« Ответ #2 : 26.12.2013, 07:05:02 »
Istaan, спасибо что отозвались, дело в том что да я читал что означает эта ошибка, я так не смог понять как она относится к моему коду. 45 строчка на которую жалуется скрипт, у меня ниже, простой апдейт, который отказывается работать в цикле, хотя если я пытаюсь отправить данные без цикла, все сразу работает нормально. 100% мне не хватает опыта что бы разобраться что я сделал не так, надеюсь на Вашу помощь.

45 строка $db->setQuery("UPDATE #__schedule SET day='$day', month='$month', year='$year' WHERE id='$end_rf' LIMIT 1");

Строка не  пустая, они заполненные.
« Последнее редактирование: 26.12.2013, 07:08:06 от sesil »
*

sesil

  • Захожу иногда
  • 82
  • 0 / 0
  • Учусь!
Re: set update в foreach
« Ответ #3 : 26.12.2013, 10:48:35 »
Вот 2 версия кода, проблема таже самая,
Код: php
foreach($xml->station->date as $keyDate => $valueDate) {

$day = nl2br($valueDate->day);
$month = nl2br($valueDate->month);
$yeat = nl2br($valueDate->year);

$db->setQuery("INSERT INTO #__schedule (`day`, `month`, `year`) VALUES ('{$day}', '{$month}', '{$year}')");
$db->query();


    if(is_object($valueDate->train)) {
        foreach($valueDate->train as $keyTrain => $valueTrain) {

$query ='SELECT id FROM #__schedule ORDER BY id DESC LIMIT 1';
$db->setQuery($query);
$end_rf = $db->loadObject();

$numb = nl2br($valueTrain->numb);
$type = nl2br($valueTrain->type);
$dep_station = nl2br($valueTrain->dep_station);
$arr_station = nl2br($valueTrain->arr_station);
$arr_time = nl2br($valueTrain->arr_time);
$date_start = nl2br($valueTrain->date_start);

$db->setQuery("UPDATE #__schedule SET numb='$numb', type='$type', dep_station='$dep_station', arr_station='$arr_station', arr_time='$arr_time', date_start='$date_start' WHERE id='$end_rf' LIMIT 1");
$db->query();

        }
    }
}
Проблема в
Код: php
$db->setQuery("UPDATE #__schedule SET numb='$numb', type='$type', dep_station='$dep_station', arr_station='$arr_station', arr_time='$arr_time', date_start='$date_start' WHERE id='$end_rf' LIMIT 1");

Пишет Catchable fatal error: Object of class stdClass could not be converted to string in /home/components/com_schedule/views/crons/tmpl/default.php on line 45
*

sesil

  • Захожу иногда
  • 82
  • 0 / 0
  • Учусь!
Re: set update в foreach
« Ответ #4 : 26.12.2013, 10:52:27 »
Ну и 3 версия, убрал все лишние. ошибка та же, на ту же самую строчку с тем же самым текстом.
Код: php
foreach($xml->station->date as $keyDate => $valueDate) {

$day = $valueDate->day;
$month = $valueDate->month;
$yeat = $valueDate->year;

$db->setQuery("INSERT INTO #__schedule (`day`, `month`, `year`) VALUES ('{$day}', '{$month}', '{$year}')");
$db->query();


    if(is_object($valueDate->train)) {
        foreach($valueDate->train as $keyTrain => $valueTrain) {

$query ='SELECT id FROM #__schedule ORDER BY id DESC LIMIT 1';
$db->setQuery($query);
$end_rf = $db->loadObject();

$date_start = date("Y-m-d");

$db->setQuery("UPDATE #__schedule SET numb='{$valueTrain->numb}', type='{$valueTrain->type}', dep_station='{$valueTrain->dep_station}', arr_station='{$valueTrain->arr_station}', arr_time='{$valueTrain->arr_time}', date_start='{$date_start}' WHERE id='$end_rf' LIMIT 1");
$db->query();

        }
    }
}
*

sesil

  • Захожу иногда
  • 82
  • 0 / 0
  • Учусь!
Re: set update в foreach
« Ответ #5 : 26.12.2013, 10:53:25 »
Проблема я так понимаю при обновлении в цикле, может я как то Неправильно использую обновление в цикле?
Вот XML от куда беру данные
$xml=simplexml_load_file("http://train.votpusk.ru/xml_utf/2000000.xml");

Вот бд.
Код: sql
CREATE TABLE IF NOT EXISTS `jos_schedule` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `day` varchar(15) NOT NULL,
  `month` varchar(15) NOT NULL,
  `year` varchar(15) NOT NULL,
  `numb` varchar(15) NOT NULL,
  `type` varchar(15) NOT NULL,
  `dep_station` varchar(15) NOT NULL,
  `arr_station` varchar(15) NOT NULL,
  `arr_time` varchar(15) NOT NULL,
  `date_start` varchar(15) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8_general_ci AUTO_INCREMENT=150 ;
« Последнее редактирование: 26.12.2013, 10:58:22 от sesil »
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: set update в foreach
« Ответ #6 : 26.12.2013, 12:55:28 »
А вы уверены что ошибку там смотрите?)
Я так понимаю у вас же это в модели и контроллере выполняется? а ошибка то в com_schedule/views/crons/tmpl/default.php
*

sesil

  • Захожу иногда
  • 82
  • 0 / 0
  • Учусь!
Re: set update в foreach
« Ответ #7 : 26.12.2013, 13:03:48 »
Данный скрипт весь на находится в default.php. то есть без контроллеров. в контроллере только прописан вид на этот файл.
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: set update в foreach
« Ответ #8 : 26.12.2013, 13:44:30 »
А если закоментировать эту строку то ошибка все равно есть?
*

sesil

  • Захожу иногда
  • 82
  • 0 / 0
  • Учусь!
Re: set update в foreach
« Ответ #9 : 26.12.2013, 13:53:04 »
А если закоментировать эту строку то ошибка все равно есть?
Если закоментировать тогда ошибка сразу пропадает, проблема именно в этой строке. Если интересно могу скинуть компонент в личку.
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: set update в foreach
« Ответ #10 : 26.12.2013, 14:09:46 »
Сделайте в цикле var_dump каждой переменной которую используете в запросе! И покажите что вывело!
*

sesil

  • Захожу иногда
  • 82
  • 0 / 0
  • Учусь!
Re: set update в foreach
« Ответ #11 : 26.12.2013, 14:26:58 »
Сделайте в цикле var_dump каждой переменной которую используете в запросе! И покажите что вывело!
Дело в том что вар дамп надо делать после апдейта, а в апдейте ошибка =( вот

Взял город по меньше.
Код: php
object(stdClass)#249 (1) { ["id"]=> string(3) "168" } object(SimpleXMLElement)#265 (1) { [0]=> string(5) "325Ж" } object(SimpleXMLElement)#264 (1) { [0]=> string(24) "пассажирский" } object(SimpleXMLElement)#263 (1) { [0]=> string(20) "ХАБАРОВСК 1" } object(SimpleXMLElement)#262 (1) { [0]=> string(27) "НЕРЮНГРИ ПАСС.*" } object(SimpleXMLElement)#261 (1) { [0]=> string(7) "0:24:00" } string(10) "2013-12-26" object(stdClass)#250 (1) { ["id"]=> string(3) "168" } object(SimpleXMLElement)#249 (1) { [0]=> string(5) "324Й" } object(SimpleXMLElement)#260 (1) { [0]=> string(24) "пассажирский" } object(SimpleXMLElement)#264 (1) { [0]=> string(27) "НЕРЮНГРИ ПАСС.*" } object(SimpleXMLElement)#259 (1) { [0]=> string(12) "ТОММОТ" } object(SimpleXMLElement)#263 (0) { } string(10) "2013-12-26" object(stdClass)#265 (1) { ["id"]=> string(3) "168" } object(SimpleXMLElement)#250 (1) { [0]=> string(5) "325Э" } object(SimpleXMLElement)#258 (1) { [0]=> string(24) "пассажирский" } object(SimpleXMLElement)#260 (1) { [0]=> string(27) "НЕРЮНГРИ ПАСС.*" } object(SimpleXMLElement)#262 (1) { [0]=> string(20) "ХАБАРОВСК 1" } object(SimpleXMLElement)#264 (0) { } string(10) "2013-12-26" object(stdClass)#249 (1) { ["id"]=> string(3) "168" } object(SimpleXMLElement)#265 (1) { [0]=> string(5) "076Э" } object(SimpleXMLElement)#257 (1) { [0]=> string(12) "скорый" } object(SimpleXMLElement)#258 (1) { [0]=> string(31) "МОСКВА КАЗАНСКАЯ" } object(SimpleXMLElement)#259 (1) { [0]=> string(27) "НЕРЮНГРИ ПАСС.*" } object(SimpleXMLElement)#260 (1) { [0]=> string(8) "18:10:00" } string(10) "2013-12-26" object(stdClass)#250 (1) { ["id"]=> string(3) "168" } object(SimpleXMLElement)#249 (1) { [0]=> string(5) "323Й" } object(SimpleXMLElement)#261 (1) { [0]=> string(24) "пассажирский" } object(SimpleXMLElement)#257 (1) { [0]=> string(12) "ТОММОТ" } object(SimpleXMLElement)#262 (1) { [0]=> string(27) "НЕРЮНГРИ ПАСС.*" } object(SimpleXMLElement)#258 (1) { [0]=> string(8) "21:17:00" } string(10) "2013-12-26" object(stdClass)#265 (1) { ["id"]=> string(3) "169" } object(SimpleXMLElement)#250 (1) { [0]=> string(5) "325Ж" } object(SimpleXMLElement)#263 (1) { [0]=> string(24) "пассажирский" } object(SimpleXMLElement)#261 (1) { [0]=> string(20) "ХАБАРОВСК 1" } object(SimpleXMLElement)#259 (1) { [0]=> string(27) "НЕРЮНГРИ ПАСС.*" } object(SimpleXMLElement)#257 (0) { } string(10) "2013-12-26" object(stdClass)#249 (1) { ["id"]=> string(3) "169" } object(SimpleXMLElement)#265 (1) { [0]=> string(5) "324Й" } object(SimpleXMLElement)#264 (1) { [0]=> string(24) "пассажирский" } object(SimpleXMLElement)#263 (1) { [0]=> string(27) "НЕРЮНГРИ ПАСС.*" } object(SimpleXMLElement)#262 (1) { [0]=> string(12) "ТОММОТ" } object(SimpleXMLElement)#261 (0) { } string(10) "2013-12-26" object(stdClass)#250 (1) { ["id"]=> string(3) "169" } object(SimpleXMLElement)#249 (1) { [0]=> string(5) "077Э" } object(SimpleXMLElement)#260 (1) { [0]=> string(12) "скорый" } object(SimpleXMLElement)#264 (1) { [0]=> string(27) "НЕРЮНГРИ ПАСС.*" } object(SimpleXMLElement)#259 (1) { [0]=> string(37) "НОВОСИБИРСК-ГЛАВНЫЙ" } object(SimpleXMLElement)#263 (0) { } string(10) "2013-12-26" object(stdClass)#265 (1) { ["id"]=> string(3) "169" } object(SimpleXMLElement)#250 (1) { [0]=> string(5) "078Э" } object(SimpleXMLElement)#258 (1) { [0]=> string(12) "скорый" } object(SimpleXMLElement)#260 (1) { [0]=> string(37) "НОВОСИБИРСК-ГЛАВНЫЙ" } object(SimpleXMLElement)#262 (1) { [0]=> string(27) "НЕРЮНГРИ ПАСС.*" } object(SimpleXMLElement)#264 (0) { } string(10) "2013-12-26" object(stdClass)#249 (1) { ["id"]=> string(3) "169" } object(SimpleXMLElement)#265 (1) { [0]=> string(5) "325Э" } object(SimpleXMLElement)#257 (1) { [0]=> string(24) "пассажирский" } object(SimpleXMLElement)#258 (1) { [0]=> string(27) "НЕРЮНГРИ ПАСС.*" } object(SimpleXMLElement)#259 (1) { [0]=> string(20) "ХАБАРОВСК 1" } object(SimpleXMLElement)#260 (0) { } string(10) "2013-12-26" object(stdClass)#250 (1) { ["id"]=> string(3) "169" } object(SimpleXMLElement)#249 (1) { [0]=> string(5) "323Й" } object(SimpleXMLElement)#261 (1) { [0]=> string(24) "пассажирский" } object(SimpleXMLElement)#257 (1) { [0]=> string(12) "ТОММОТ" } object(SimpleXMLElement)#262 (1) { [0]=> string(27) "НЕРЮНГРИ ПАСС.*" } object(SimpleXMLElement)#258 (0) { } string(10) "2013-12-26" object(stdClass)#265 (1) { ["id"]=> string(3) "169" } object(SimpleXMLElement)#250 (1) { [0]=> string(5) "075Э" } object(SimpleXMLElement)#263 (1) { [0]=> string(12) "скорый" } object(SimpleXMLElement)#261 (1) { [0]=> string(27) "НЕРЮНГРИ ПАСС.*" } object(SimpleXMLElement)#259 (1) { [0]=> string(31) "МОСКВА КАЗАНСКАЯ" } object(SimpleXMLElement)#257 (0) { } string(10) "2013-12-26" object(stdClass)#249 (1) { ["id"]=> string(3) "170" } object(SimpleXMLElement)#265 (1) { [0]=> string(5) "325Ж" } object(SimpleXMLElement)#264 (1) { [0]=> string(24) "пассажирский" } object(SimpleXMLElement)#263 (1) { [0]=> string(20) "ХАБАРОВСК 1" } object(SimpleXMLElement)#262 (1) { [0]=> string(27) "НЕРЮНГРИ ПАСС.*" } object(SimpleXMLElement)#261 (0) { } string(10) "2013-12-26" object(stdClass)#250 (1) { ["id"]=> string(3) "170" } object(SimpleXMLElement)#249 (1) { [0]=> string(5) "324Й" } object(SimpleXMLElement)#260 (1) { [0]=> string(24) "пассажирский" } object(SimpleXMLElement)#264 (1) { [0]=> string(27) "НЕРЮНГРИ ПАСС.*" } object(SimpleXMLElement)#259 (1) { [0]=> string(12) "ТОММОТ" } object(SimpleXMLElement)#263 (0) { } string(10) "2013-12-26" object(stdClass)#265 (1) { ["id"]=> string(3) "170" } object(SimpleXMLElement)#250 (1) { [0]=> string(5) "325Э" } object(SimpleXMLElement)#258 (1) { [0]=> string(24) "пассажирский" } object(SimpleXMLElement)#260 (1) { [0]=> string(27) "НЕРЮНГРИ ПАСС.*" } object(SimpleXMLElement)#262 (1) { [0]=> string(20) "ХАБАРОВСК 1" } object(SimpleXMLElement)#264 (0) { } string(10) "2013-12-26" object(stdClass)#249 (1) { ["id"]=> string(3) "170" } object(SimpleXMLElement)#265 (1) { [0]=> string(5) "076Э" } object(SimpleXMLElement)#257 (1) { [0]=> string(12) "скорый" } object(SimpleXMLElement)#258 (1) { [0]=> string(31) "МОСКВА КАЗАНСКАЯ" } object(SimpleXMLElement)#259 (1) { [0]=> string(27) "НЕРЮНГРИ ПАСС.*" } object(SimpleXMLElement)#260 (0) { } string(10) "2013-12-26" object(stdClass)#250 (1) { ["id"]=> string(3) "170" } object(SimpleXMLElement)#249 (1) { [0]=> string(5) "323Й" } object(SimpleXMLElement)#261 (1) { [0]=> string(24) "пассажирский" } object(SimpleXMLElement)#257 (1) { [0]=> string(12) "ТОММОТ" } object(SimpleXMLElement)#262 (1) { [0]=> string(27) "НЕРЮНГРИ ПАСС.*" } object(SimpleXMLElement)#258 (0) { } string(10) "2013-12-26"

Вот как делал распечатку
Код: php
		var_dump($end_rf, $valueTrain->numb, $valueTrain->type, $valueTrain->dep_station, $valueTrain->arr_station, $valueTrain->arr_time, $date_start);
#$db->setQuery("UPDATE #__schedule SET numb='{$valueTrain->numb}', type='{$valueTrain->type}', dep_station='{$valueTrain->dep_station}', arr_station='{$valueTrain->arr_station}', arr_time='{$valueTrain->arr_time}', date_start='{$date_start}' WHERE id='$end_rf' LIMIT 1");
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: set update в foreach
« Ответ #12 : 26.12.2013, 14:49:14 »
Сделайте var_dump по одной переменной и после каждого var_dump приложите вывод, ибо каша!
Хотя даже по этому смотрите если я правильно понимаю то
var_dump($end_rf);
вывел: object(stdClass)#249 (1) { ["id"]=> string(3) "168" }
А это и есть то о чем я вам говорю! Вы пытаетесь объект класса использовать как строку! А должны сделать что то типа  $end_rf->id

И так абсолютно со всеми элементами запроса, там же везде объекты класса!
*

sesil

  • Захожу иногда
  • 82
  • 0 / 0
  • Учусь!
Re: set update в foreach
« Ответ #13 : 26.12.2013, 16:25:52 »
Вы правы, спасибо Вам большое, проблема решена.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

[Решено] Автоматическое размешение модуля после установки

Автор asmuz

Ответов: 15
Просмотров: 7594
Последний ответ 21.07.2014, 21:59:18
от b2z
[Решено] Как вывести строки из бд - удовлетворяющие требование SQL запроса!

Автор artemka

Ответов: 11
Просмотров: 2176
Последний ответ 21.07.2014, 20:58:07
от artemka
[Решено] Доступ к параметру материала из шаблона

Автор olf

Ответов: 5
Просмотров: 1640
Последний ответ 10.07.2014, 18:32:21
от b2z
[Решено] Вопрос для знатоков php. Как правильно записать код?

Автор artemka

Ответов: 7
Просмотров: 1571
Последний ответ 13.06.2014, 18:16:47
от artemka
[Решено] Сохранить файл на удаленном ПК и прочитать 

Автор AlekVolsk

Ответов: 18
Просмотров: 1650
Последний ответ 03.04.2014, 13:55:16
от AlekVolsk