We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 897
    • 1,620 Posts
    от вас: описание задач, скрин дерева документов, вызовы сниппетов
    от нас: предложения по оптимизации.
      "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

      Не используйте Revo для "просто сайтов". Используйте Evo

      Who can defeat the Russian bear?
      • 26574
      • 4 Posts
      С нетерпением жду продолжения. Надеюсь почерпнуть много полезного.
        • 785
        • 2,113 Posts
        Quote from: max at Aug 10, 2010, 08:08 PM

        А что подразумевается под словами "полностью переделать кэширование" ?
        Переписать систему кэширования MODx (такие проекты в принципе можно найти), но пока об этом рано говорить. Сначала надо получить объективную статистику.

        Для получения более полной статистики можно внести небольшое исправление в систему. В файле manager/includes/document.parser.class.inc.php найти строку:
        $source= $this->documentGenerated == 1 ? "database" : "cache";
        и ниже добавить:
        $phpMemory = (memory_get_peak_usage(true) / 1024 / 1024) . " MB";
        $out= str_replace("[^m^]", $phpMemory, $out);

        После этого во все шаблоны в нижнюю часть, перед </body> добавите строку:
        <!-- MySQL: [^qt^], запросов: [^q^], PHP: [^p^], всего: [^t^], памяти [^m^], документ взят из [^s^] -->
        В результате в коде страниц будет выводится примерно такой комментарий:
        <!-- MySQL: 0.1646 s, запросов: 24, PHP: 0.1785 s, всего: 0.3430 s, памяти 3.25 MB, документ взят из base -->
        Это поможет в объективной оценке нагрузки.

        То, что надо сделать однозначно (если еще не делалось ранее) – внести изменения в Wayfinder. Они описаны на форуме, например, тут:
        http://modxcms.com/forums/index.php/topic,49216.msg287476.html#msg287476

        После этого можно будет посмотреть, как работает сайт…
          Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
          Статьи о MODx, регулярно новые публикации
          • 18740
          • 9 Posts
          $phpMemory = (memory_get_peak_usage(true) / 1024 / 1024) . " MB";
          $out= str_replace("[^m^]", $phpMemory, $out);

          я добавил после:

          $source= $this->documentGenerated == 1 ? "database" : "cache";
          $queries= isset ($this->executedQueries) ? $this->executedQueries : 0;

          $out =& $this->documentOutput;
          if ($this->dumpSQL) {
          $out .= $this->queryCode;
          }

          вывод сделал во всех футерах. А на счет изменений в Wayfinder, то там ничего менять не надо, так как я все снипеты писал сам ради экономии ресурсов. Постараюсь как можно раньше выставить скрины и вызовы снипетов, но судя по всему мне и сами снипеты надо выложить если они самописные.
          Кстати добавил я на VPS еще 128м и в результате apache снова кушает 99%, а в top я увидел около 60 процессов apache вместо 25, и это только то что поместилось в монитор, т.е. их явно больше.
            • 74
            • 74 Posts
            И как развиваются события?
            Из ~30 попыток, только один раз удалось увидеть сайт.
              • 1788
              • 1,103 Posts
              Открылся со 2 раза.
              Стрекоза нашла ошибки:
              Line 112:
              #row1 {bottom left repeat-x;}
              Line 114:
              #row2 {bottom left repeat-x;}
              Картинки: не найдено footer_bg.gif и favicon.ico
              Основные тормоза на счетчиках. Сайт грузится нормально.
                • 18740
                • 9 Posts
                Ошибки вроде все исправил, которые были указаны выше. Вот только не могу сделать так, что бы favicon.ico отображалась во всех шаблонах, в половине шаблонов иконка отображается а в другой полови нет, header одинаковый, разве что ключевые слова разные, на данном форуме я не нашел решения, может кто знает в чем может быть причина?
                Также я убрал все счетчики и Google Analytics, вот только это никак не повлияло на скорость отображения страниц в моем случаи. И может кто то сказать каким должен быть средний результат строки:
                <!-- MySQL: [^qt^], запросов: [^q^], PHP: [^p^], всего: [^t^], памяти [^m^], документ взят из [^s^] -->

                А то я не знаю, на сколько плох результат:

                "MySQL: 0.0619 s, запросов: 12, PHP: 1.1311 s, всего: 1.1930 s, памяти 36 MB, документ взят из cache" - "MySQL: 0.0058 s, запросов: 12, PHP: 0.1886 s, всего: 0.1944 s, памяти 36 MB, документ взят из cache "

                Это результат загрузки главной страницы, где происходит выборка из всеx документов ModX(7600шт.), и диапазон достаточно большой.
                  • 785
                  • 2,113 Posts
                  Сайт посмотреть так ни разу и не удалось…
                  По поводу статистики – MySQL работает быстро и практически не создает нагрузки, но PHP работает не так быстро, хотя в принципе в районе секунды – это не так страшно (но при достаточно большом потоке пользователей – уже страшно). А вот памяти 36 МБ – это уже большая проблема. И решить ее сложно, если в MODx 7600 документов.
                  Возможно, следует подумать о перераспределении нагрузки между MySQL и PHP, то есть больше хранить в базе и использовать более сложные запросы, зато меньше обрабатывать после получения данных их базы.
                  Также в некоторых случаях полезно некоторые трудоемкие операции выполнять заранее – например, на одном сайте я заранее (по крону) нахожу в базе выборки по нескольким тысячам возможных запросов, и сохраняю номера записей с результатами, а при запросе посетителя сайта ему быстро выдается нужная информация.
                  Лично я стараюсь, если планируется использовать достаточно много каких-то описаний, хранить их в отдельной таблице, не увеличивая количество документов MODx – плохо, если их более нескольких тысяч.
                  То есть надо полностью переделывать сайт, а пока в разы увеличивать память на хостинге.
                    Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                    Статьи о MODx, регулярно новые публикации
                    • 18740
                    • 9 Posts
                    Дерево сайта: jurnalu.ru/assets/images/tree.jpg

                    Опишу два шаблона, которые используются на 99% страницах сайта.
                    В первом шаблоне (www.jurnalu.ru/online-reading/comicsonline/) выводятся документы из раздела манги или комиксов по порядку поступления, выводится 50 последних опубликованных номеров на страницу. Справа строится меню, в котором перечислены все комиксы(манга), опубликованные на сайте. В шаблоне всего два вызова сниппетов, все остальное статический текст и 2 чанка.
                    Снипет, который отвечает за вывод 50 документов:

                    <?php
                    // proverayem nomer stranicu
                    $page = $_GET['p'];
                    $pattern = '/[^0-9]+/';
                    if ($page == "" || preg_match($pattern, $page) || $page == 0)$page = 1;
                    
                    // opredilyayem roditeley, po kotorum budem delat vuborky
                    $sql = "SELECT id 
                    		FROM `jurnalu_site_content`
                    		WHERE parent = 210 AND deleted = 0 AND published = 1
                    		ORDER BY id";
                    
                    $result = $modx->db->query($sql);
                    $string = "";
                    
                    while ($row = $modx->db->getRow($result))
                    {
                        $string .= "'".$row['id']."',";
                    }
                    
                    $len = strlen($string);
                    $string = substr($string, 0, $len-1);
                    
                    
                    // delayem vuborky vseh opublikovanuh dokymentov, roditeley kotoruh mu opredelili v predudyschem zaprose
                    $sql = "SELECT id 
                    		FROM `jurnalu_site_content`
                    		WHERE parent in (".$string.") AND deleted = 0 AND published = 1
                    		ORDER BY id";
                    
                    $result = $modx->db->query($sql);
                    $r = mysql_num_rows($result);
                    $pagelimit = 50; // kolichestvo nomerov na stranicy
                    $max = ceil($r/$pagelimit);
                    
                    if ($page > $max)
                        $page = $max;
                    	
                    	
                    // Padginaciya ----------------------------------------------------------------
                    $linkPage = '<div id="pageNumber"><div id="InPageNumber">';
                    
                    $Pplus1 = $page+1;
                    $Pplus2 = $page+2;
                    $Pplus3 = $page+3;
                    $Pminus1 = $page-1;
                    $Pminus2 = $page-2;
                    $Pminus3 = $page-3;
                    
                    //start
                    if ($page == 1 && $max != 1){
                        if ($max < 8){
                            $linkPage .= '<b>1</b> <a href="/online-reading/comicsonline/2"><img src="/assets/templates/first/images/s2.gif" /></a>    ';
                        	for ($i = 2; $i <= $max; $i++){
                            	$linkPage .= '<a href="/online-reading/comicsonline/'.$i.'">'.$i.'</a> ';
                    		}
                    	}else{
                        	$linkPage .= '<b>1</b> <a href="/online-reading/comicsonline/2"><img src="/assets/templates/first/images/s2.gif" /></a>    
                    			<a href="/online-reading/comicsonline/2">2</a> <a href="/online-reading/comicsonline/3">3</a> <a href="/online-reading/comicsonline/4">4</a> . . . <a href="/online-reading/comicsonline/'.$max.'">'.$max.'</a>';
                    	}
                    
                    // end
                    } elseif ($page == $max && $max != 1){
                        if ($max < 8){
                            for ($i = 1; $i < $page; $i++){
                                $linkPage .= '<a href="/online-reading/comicsonline/'.$i.'">'.$i.'</a>';
                        	}
                        	$linkPage .= '    <a href="/online-reading/comicsonline/'.$Pminus1.'"><img src="/assets/templates/first/images/s1.gif" /></a> <b>'.$page.'</b>';
                    	}else{
                        $linkPage .= '<a href="/online-reading/comicsonline/1">1</a> . . . <a href="/online-reading/comicsonline/'.$Pminus3.'">'.$Pminus3.'</a> <a href="/online-reading/comicsonline/'.$Pminus2.'">'.$Pminus2.'</a>
                    			<a href="/online-reading/comicsonline/'.$Pminus1.'">'.$Pminus1.'</a>     <a href="/online-reading/comicsonline/'.$Pminus1.'">
                    			<img src="/assets/templates/first/images/s1.gif" /></a> <b>'.$page.'</b>';
                    	}
                    
                    // in center
                    } elseif ($page != 1 && $page != $max){
                        if ($page > 7){
                            $linkPage .= '<a href="/online-reading/comicsonline/1">1</a> . . . <a href="/online-reading/comicsonline/'.$Pminus3.'">'.$Pminus3.'</a> <a href="/online-reading/comicsonline/'.$Pminus2.'">'.$Pminus2.'</a>
                    			<a href="/online-reading/comicsonline/'.$Pminus1.'">'.$Pminus1.'</a>';
                    	}else{
                        	for ($i = 1; $i < $page; $i++){
                          	  $linkPage .= '<a href="/online-reading/comicsonline/'.$i.'">'.$i.'</a> ';
                    		}
                    	}
                    	
                    	$linkPage .= '    <a href="/online-reading/comicsonline/'.$Pminus1.'"><img src="/assets/templates/first/images/s1.gif" /></a> <b>'.$page.'</b>
                    		 <a href="/online-reading/comicsonline/'.$Pplus1.'"><img src="/assets/templates/first/images/s2.gif" /></a>    ';
                    
                    	if (($max-$page) > 7){
                        	$linkPage .= '<a href="/online-reading/comicsonline/'.$Pplus1.'">'.$Pplus1.'</a> <a href="/online-reading/comicsonline/'.$Pplus2.'">'.$Pplus2.'</a>
                    			 <a href="/online-reading/comicsonline/'.$Pplus3.'">'.$Pplus3.'</a> . . . <a href="/online-reading/comicsonline'.$max.'">'.$max.'</a>';
                    	}else{
                        	for ($i = $page+1; $i <= $max; $i++){
                            	$linkPage .= '<a href="/online-reading/comicsonline/'.$i.'">'.$i.'</a>';
                    		}
                    	}
                    }
                    
                    $linkPage .= '</div></div>';
                    if ($max == 1)
                        $linkPage = "";
                    
                    // vuvodim navigaciyu
                    echo $linkPage;
                    echo '<div id="blockOnline">';
                    
                    // ------ delayem vuborky nomerov, ishodya is nomera stranici ---------
                    
                    $page = ($page-1)*$pagelimit;
                    
                    $sql = "SELECT site.id, site.alias, site.pagetitle, site.publishedon, parent.alias as parentAlias, parent.pagetitle as parentPagetitle
                    		FROM `jurnalu_site_content` site
                    		LEFT OUTER JOIN jurnalu_site_content parent ON site.parent = parent.id
                    		WHERE site.parent IN (".$string.") AND site.deleted = 0 AND site.published = 1
                    		GROUP BY site.id
                    		ORDER BY site.createdon DESC
                    		LIMIT ".$page.",".$pagelimit.";";
                    
                    $result = $modx->db->query($sql);
                    while ($row = $modx->db->getRow($result))
                    {
                    
                        echo "
                    			    <div id=\"OneInputOR\">
                    			        <div id=\"OneInputORpro\">
                    			            <div id=\"ORPictureManga\">
                    			                <a href=\"/online-reading/comicsonline/".$row['parentAlias']."/".$row['alias']."\"><img src=\"/assets/images/ForManga/".$row['parentAlias'].".jpg\" /></a>
                    			            </div>
                    			            <div id=\"OneInputORtext\">
                    			                <div id=\"OneInputORname\">
                    			                    <h1><a href=\"/online-reading/comicsonline/".$row['parentAlias']."\">".$row['parentPagetitle']."</a></h1>
                    			                </div>
                    			                <div id=\"OneInputORdetail\">
                    			                    <div id=\"OneInputORdetailPro\">
                    			                        <div id=\"left\">
                    			                            <b><a href=\"/online-reading/comicsonline/".$row['parentAlias']."/".$row['alias']."\">".$row['pagetitle']."</a></b>
                    			                        </div>
                    			                        <div id=\"right\">
                    			                            <b>".date("d.m.Y", $row['publishedon'])."</b>
                    			                        </div>
                    			                    </div>
                    			                </div>
                    			            </div>
                    			        </div>
                    			    </div>
                    			
                    			";
                    
                    }
                    
                    // vuvodim navigaciyu
                    echo $linkPage;
                    echo '</div><div id="clear10"></div>';
                    
                    ?>


                    Снипет, который выводит правое мню:

                    <?php
                    echo '<div class="menuGeneral"><ul>';
                    	
                    	$sql = "SELECT id, pagetitle, alias 
                    		FROM `jurnalu_site_content`
                    		WHERE parent = 210 AND deleted = 0 AND published = 1
                    		ORDER BY pagetitle";
                    	
                    	$result = $modx->db->query($sql);
                    
                    	while($row = $modx->db->getRow( $result ) ){
                    		if($row['id']==$id){
                    			echo '<li><a class="active" href="/online-reading/comicsonline/'.$row['alias'].'">'.$row['pagetitle'].'</a></li>';
                    		}else
                    			echo '<li><a href="/online-reading/comicsonline/'.$row['alias'].'">'.$row['pagetitle'].'</a></li>';
                    	}
                    	echo '</ul></div>';
                    ?>



                    Во втором шаблоне (http://www.jurnalu.ru/online-reading/comicsonline/newultimates/newultimates002) выводится список всех глав через select, а ниже отображается одна из страниц номера. Рисунки берутся из другого сайта, поэтому адрес сайта, расширение рисунков и количество страниц я вытягиваю через TV параметры. В этом шаблоне вызываются 3 сниппета:
                    Первый сниппет генерирует header
                    <?php
                    $sql = 'SELECT site.pagetitle, parent.pagetitle as parenttitle
                    		FROM `jurnalu_site_content` site
                    		LEFT OUTER JOIN `jurnalu_site_content` parent ON site.parent = parent.id
                    		WHERE site.id = '. $id;
                    
                    $result = $modx->db->query($sql);
                    $row = $modx->db->getRow( $result );
                    
                    echo '<title>Comics Online | '.$row['parenttitle'].' | '.$row['pagetitle'].' | read comics online  </title>
                    		<meta content="Read comics '.$row['parenttitle'].' - '.$row['pagetitle'].' online." name="description"/>
                    		<meta content="Comics,online,read,'.$row['parenttitle'].','.$row['pagetitle']." name="keywords"/>';
                    ?>


                    Второй сниппет выводит хлебные крошки:
                    <?php
                    $sql = "SELECT site.pagetitle, parent.pagetitle as parenttitle, parent.alias as parentalias
                    		FROM `jurnalu_site_content` site
                    		LEFT OUTER JOIN `jurnalu_site_content` parent ON site.parent = parent.id
                    		WHERE site.id = ".$id;
                    $result = $modx->db->query($sql);
                    $row = $modx->db->getRow( $result );
                    
                    echo '<a href="/">General</a> -> 
                    	<a href="/online-reading/">Online</a> -> 
                    	<a href="/online-reading/comicsonline/">Comics</a> -> 
                    	<a href="/online-reading/comicsonline/'.$row['parentalias'].'">'.$row['parenttitle'].'</a> -> 
                    	'.$row['pagetitle'];
                    ?>


                    И третий сниппет выводит одну страницу номера:
                    <?php
                    $page = $_GET['p'];
                    $parent = $_GET['pr'];
                    $nexttom = '';
                    $nextlink = '';
                    
                    // polychaem vse neobhodimue dannue po nomery
                    	$sql = "SELECT general.pagetitle as pagetitle, general.alias as alias, general.longtitle as longtitle, parent.id as parent,
                    	 parent.pagetitle as parentName, parent.alias as parentAlias, lastpage.value as lastpage, mySiteForFile.value as mysite,
                    	 SiteForFile.value as site, extension.value as extension
                    	FROM `jurnalu_site_content` general
                    	INNER JOIN `jurnalu_site_content` parent ON parent.id = general.parent
                    	LEFT OUTER JOIN `jurnalu_site_tmplvar_contentvalues` lastpage ON lastpage.contentid = $id AND lastpage.tmplvarid = 17
                    	LEFT OUTER JOIN `jurnalu_site_tmplvar_contentvalues` mySiteForFile ON mySiteForFile.contentid = $id AND mySiteForFile.tmplvarid = 22
                    	LEFT OUTER JOIN `jurnalu_site_tmplvar_contentvalues` SiteForFile ON SiteForFile.contentid = general.parent AND SiteForFile.tmplvarid = 22
                    	LEFT OUTER JOIN `jurnalu_site_tmplvar_contentvalues` extension ON extension.contentid = $id AND extension.tmplvarid = 18
                    	WHERE general.id = $id";
                    	
                    	$result = $modx->db->query($sql);
                    	$row = $modx->db->getRow( $result ) ;
                    	
                    	if($page > $row['lastpage']) $page = $row['lastpage'];
                    	if($page < 1) $page = 1;
                    
                    	if($row['mysite'] == '') {
                    		$site = $row['site'];
                    	}else $site = $row['mysite']; 
                    
                    	
                    $text = '
                    <div id="ORGeneral">
                        <div id="ORgeneralPro">
                            <div id="ORstartFon">
                            </div>
                            <div id="ORhead">
                                <div id="ORtopText">
                                    <div id="ORleftText">
                                        <b>Comics online</b>
                                    </div>';
                                    
                      $text .= '</div>
                                <div id="ORname">
                                    <h2>'.$row['parentName'].'</h2>
                                </div>
                                <div id="ORglada">
                                    '.$row['pagetitle'].'
                                </div>
                                <div id="ORchoise">
                                    <select onchange="window.location=\'http://www.jurnalu.ru/online-reading/comicsonline/'.$row['parentAlias'].'/\'+this.value+\'/1\'">';
                    
                    // delaem SQL zapros, v kotorom polychaem vse nomera dannogo komiksa i vstavlaem v select
                    	$sql = "SELECT id, pagetitle, alias
                    			FROM `jurnalu_site_content`
                    			WHERE parent = ".$row['parent']." AND deleted = 0 AND published = 1
                    			ORDER BY publishedon DESC";
                    	
                    	$result = $modx->db->query($sql);
                    	while($row2 = $modx->db->getRow( $result ) ){
                    			
                    		if ($row2['id'] == $id){
                    			$text .= '<option selected="" value="'.$row2['alias'].'">'.$row2['pagetitle'].'</option>';
                    			$nexttom = $prew;
                    		}else{
                    			$text .= '<option value="'.$row2['alias'].'">'.$row2['pagetitle'].'</option>';
                    		}
                    		$prew = $row2['alias'];
                    		
                    	}
                                        
                    // insert in html code our variables                
                    	$text .= '</select>
                                </div>
                                <div id="ORspace">
                                </div>
                            </div>
                            <div id="ORpereplet">
                            </div>
                            <div id="ORpage">
                                <div id="ORspace"></div>
                                <div id="right" style="margin:0 20px 0 0; width:100%; text-align:right;">';
                                $text .= '<a href="http://'.$site.'/'.$row['parentAlias'].'/'.$row['longtitle'].'/'.$page.'.'.$row['extension'].'" rel="shadowbox">';
                                $text .= '<img src="/assets/templates/first/images/zoom.jpg" alt="" /></a>
                                </div>';
                    	
                    	
                                $textPage = '<div id="left" style="text-align:center; width:750px;">';
                    	
                                   if($page != 1) $textPage .= '<a href="http://www.jurnalu.ru/online-reading/comicsonline/'.$row['parentAlias'].'/'.$row['alias'].'/'.($page - 1).'">
                                   <img src="/assets/templates/first/images/prew.jpg" alt="" /></a>';
                                   
                                   $textPage .= ' <select onchange="window.location=\'http://www.jurnalu.ru/online-reading/comicsonline/'.$row['parentAlias'].'/'.$row['alias'].'/\'+this.value+\'\'">';
                    
                                   for($i=1;$i<=$row['lastpage'];$i++){
                                   	if($i == $page){
                                   		$textPage .='  <option selected="" value="'.$i.'">- '.$i.' -</option>';
                                   	}else $textPage .='  <option value="'.$i.'">- '.$i.' -</option>';
                                   }
                                   
                                   $textPage .='</select>';
                                   
                                    if($page != $row['lastpage']){ 
                                    	$textPage .= $nextlink = '<a href="http://www.jurnalu.ru/online-reading/comicsonline/'.$row['parentAlias'].'/'.$row['alias'].'/'.($page + 1).'">';
                                    $textPage .= '<img src="/assets/templates/first/images/next.jpg" alt="" /></a>';
                                    }elseif($nexttom != ''){
                                    	$textPage .= $nextlink = '<a href="http://www.jurnalu.ru/online-reading/comicsonline/'.$row['parentAlias'].'/'.$nexttom.'/1" >';
                                    $textPage .= '<img src="/assets/templates/first/images/next.jpg" alt="" /></a>';}
                                    
                                $textPage .= '</div>';
                                
                                
                                $text .= $textPage;
                                
                                $text .= '<div id="ORspace"></div><center>'.$nextlink.'
                                    
                                    <img width="650" src="http://'.$site.'/'.$row['parentAlias'].'/'.$row['longtitle'].'/'.$page.'.'.$row['extension'].'" alt="" />'; 
                                if($nextlink !='') $text .= '</a>';
                                $text .= '</center><div id="ORspace"></div>';
                            $text .= $textPage;
                            $text .= '</div>
                            <div id="ORpagedown">
                            </div>
                        </div>
                    </div>';
                    
                     
                    echo $text;
                    ?>


                    Буду рад любой критике или советам по оптимизации.
                      • 26085
                      • 494 Posts
                      а акселераторы не пробобовли использовать eAccelerator, APC, winCache, xCache...
                      у меня winCache ускоряет модх evo рез в 10.