2013-08-26 102 views
0

我正在生成一个xml文件,其生成时间太长,这对我来说是个大问题,因为一些xml集成由于延迟时间而不工作。如何在JOOMLA中缓存PHP生成的XML文件?

我想缓存此XML文件的XML副本,但我不知道如何做到这一点,下面是生成XML的代码:

<?php 
defined('_JEXEC') or die('Restricted access'); 

jimport('joomla.application.component.view'); 

class PropertiesViewProperties extends JView 
{ 
function display($tpl = null) 
{ 
    global $mainframe; 
    $db   =& JFactory::getDBO(); 

$query = 'SELECT p.*,c.name as name_category,t.name as name_type,cy.name as name_country,s.name as name_state,l.name as name_locality,l.alias as locality_alias,pf.name as name_profile, ' 
. ' CASE WHEN CHAR_LENGTH(p.alias) THEN CONCAT_WS(":", p.id, p.alias) ELSE p.id END as Pslug,' 
. ' CASE WHEN CHAR_LENGTH(c.alias) THEN CONCAT_WS(":", c.id, c.alias) ELSE c.id END as Cslug,' 
. ' CASE WHEN CHAR_LENGTH(cy.alias) THEN CONCAT_WS(":", cy.id, cy.alias) ELSE cy.id END as CYslug,' 
. ' CASE WHEN CHAR_LENGTH(s.alias) THEN CONCAT_WS(":", s.id, s.alias) ELSE s.id END as Sslug,'  
. ' CASE WHEN CHAR_LENGTH(l.alias) THEN CONCAT_WS(":", l.id, l.alias) ELSE l.id END as Lslug, ' 
. ' CASE WHEN CHAR_LENGTH(t.alias) THEN CONCAT_WS(":", t.id, t.alias) ELSE t.id END as Tslug '   
    . ' FROM #__products AS p '    
    . ' LEFT JOIN #__country AS cy ON cy.id = p.cyid '    
    . ' LEFT JOIN #__state AS s ON s.id = p.sid ' 
    . ' LEFT JOIN #__locality AS l ON l.id = p.lid ' 
    . ' LEFT JOIN #__profiles AS pf ON pf.mid = p.agent_id '    
    . ' LEFT JOIN #__category AS c ON c.id = p.cid ' 
    . ' LEFT JOIN #__type AS t ON t.id = p.type ' 
    . ' WHERE p.published = 1 ' 
    . ' AND p.available <> 2 ' 
    .' ORDER BY p.id desc limit 10, 999999' 
    ; 


      $db->setQuery($query);     
      $this->products = $db->loadObjectList(); 

$document = &JFactory::getDocument(); 
$document->setMimeEncoding('text/xml');  
//header ("content-type: text/xml"); 

switch(JRequest::getVar('feed')) 
    { 
    case 'todobrasilimobiliaria' : 
    $this->todobrasilimobiliaria(); 
    break; 

    } 

} 




function Images($id) 
{  
$db  =& JFactory::getDBO(); 
$query = ' SELECT i.* '   
     . ' FROM #__images as i '     
     . ' WHERE i.published = 1 AND i.parent = '.$id   
     . ' order by i.ordering ';  
    $db->setQuery($query); 
    $Images = $db->loadObjectList(); 
return $Images; 
} 

function todobrasilimobiliaria() 
{ 

$todobrasilimobiliaria_cat_id = array(); 
$todobrasilimobiliaria_cat_id[17]='apartamento padrão'; 
$todobrasilimobiliaria_cat_id[18]='casa'; 
$todobrasilimobiliaria_cat_id[19]='casa em condomínio'; 
$todobrasilimobiliaria_cat_id[20]='cobertura'; 
$todobrasilimobiliaria_cat_id[21]='área'; 
$todobrasilimobiliaria_cat_id[22]='comercial'; 
$todobrasilimobiliaria_cat_id[25]='apartamento padrão'; 
$todobrasilimobiliaria_cat_id[26]='terreno em condomínio'; 
$todobrasilimobiliaria_cat_id[27]='pousada'; 
$todobrasilimobiliaria_cat_id[28]='sítio'; 
$todobrasilimobiliaria_cat_id[29]='terreno'; 


$crlf="\n"; 
$line = '<?xml version="1.0" encoding="utf-8"?>' . $crlf; 
$line .= '<root>'. $crlf; 
$line .= '<todobrasil>'. $crlf; 
$line .= '<feed_version>2_1</feed_version>'. $crlf; 
$line .= '</todobrasil>'. $crlf; 


    foreach ($this->products as $row) 
    {    
     $url = substr(JURI::base(), 0, -1);  
     $link = $url.LinkHelper::getLink('properties','showproperty','',$row->CYslug,$row->Sslug,$row->Lslug,$row->Cslug,$row->Tslug,$row->Pslug); 

     $title = $this->escape($row->name);   
     $category = 'vender'; 
     $tipo = $todobrasilimobiliaria_cat_id[$row->cid];   
     $data_entrega = '00/00/0000'; 
     $estado_superachei = 'SC'; 
     $type = $row->name_type; 
     $desc = $row->text;   
     $imageBaseUrl = JURI::root().'images/';  
     $imageUrl = $imageBaseUrl.$row->id.'/'; 
     $images=$this->Images($row->id);  
     $listdate = JFactory::getDate($row->refresh_time)->toFormat('%d/%m/%Y'); 
     $chamada = trim($row->name_category, 's').' tipo '.$row->name_type.' - '.$row->name_locality; 
$line .= '<property>'. $crlf; 
$line .=' <id><![CDATA['.$row->id.']]></id>' . $crlf;  
$line .=' <date><![CDATA['.$row->refresh_time.']]></date>' . $crlf;  
$line .=' <ref><![CDATA['.$row->ref.']]></ref>' . $crlf;  
$line .=' <price><![CDATA['.(int)$row->price.']]></price>' . $crlf; 
$line .=' <price_freq>venda</price_freq>' . $crlf;  
$line .= '<type>'. $crlf; 
$line .=' <en><![CDATA['.$tipo.']]></en>' . $crlf;   
$line .= '</type>'. $crlf; 
$line .=' <country>Brasil</country>' . $crlf; 
$line .=' <currency>BRL</currency>' . $crlf; 
$line .=' <town><![CDATA['.$row->name_state.']]></town>' . $crlf;  
$line .=' <province><![CDATA['.$row->name_country.']]></province>' . $crlf;  
$line .=' <location_detail><![CDATA['.$row->name_locality.']]></location_detail>' . $crlf;   

if($row->bedrooms>0){ 
$line .=' <beds><![CDATA['.$row->bedrooms.']]></beds>' . $crlf; 
} 
if($row->bathrooms>0){ 
$line .=' <baths><![CDATA['.$row->bathrooms.']]></baths>' . $crlf;  
} 

$line .=' <url><![CDATA['.$link.']]></url>' . $crlf; 

$line .= '<surface_area>'. $crlf; 
$line .=' <built><![CDATA['.$row->covered_area.']]></built>' . $crlf; 
$line .=' <plot><![CDATA['.$row->area.']]></plot>' . $crlf; 
    $line .= '</surface_area>'. $crlf; 
$line .= '<desc>'. $crlf; 
$line .=' <en><![CDATA['.strip_tags($row->text).']]></en>' . $crlf; 
$line .= '</desc>'. $crlf; 


$line .='<images>' . $crlf; 
$i=0; 
foreach($images as $img) { 
if ($i < 10) 
{ 
    $i +=1; 
    $line .= ' <image id="'.$i.'">' . $crlf; 
    $line .=' <url><![CDATA['.$imageUrl.$img->name.']]></url>' . $crlf; 
    $line .= ' </image>' . $crlf; 
} 
} 
$line .='</images>' . $crlf; 

$line .= '</property>'. $crlf; 
    } 
$line .= '</root>'. $crlf; 
echo $line;  
} 

我想加快XML生成因为生成时间超过2分钟,而且我在专用服务器上,所以我想到的解决方案是缓存这个副本,任何人都可以帮助我?

回答

0

的Joomla可以缓存任何内容: 你应该用静态方法的GetList()的一个辅助检索查询结果,然后使用适当的JCache后裔:这是一个模块:

$cacheparams = new stdClass; 
$cacheparams->cachemode = 'safeuri'; 
$cacheparams->class = 'yourclassHelper'; 
$cacheparams->method = 'getList'; 
$cacheparams->methodparams = $params; 
$cacheparams->modeparams = array('someparam'=>'int'); 

$list = JModuleHelper::moduleCache ($module, $params, $cacheparams); 

化妆肯定modeparams只包含会使您的查询更改的参数,以确保查询不会经常运行。

此外,放弃$大型机,我想它是从组件的旧版本。

最后,你是否正确地索引了你加入的表格?即您是否为您加入的每个列创建索引?索引使db查询飞行。

+0

非常感谢你,我试图实现你的建议,但我不是程序员,所以对我来说有点困难。例如,我应该把你的代码放入一个Jumi模块中,以便将它作为模块使用吗?此外,我正在学习MySQL和PHP,但我是新来的,我不知道如何检查表是否有索引,我该怎么做?最后,当你谈论放弃$大型机时,你的意思是我应该简单地删除“global $ mainframe;”这一行。 ?非常感谢... –

+0

我不知道Jumi,你的意思是Joomla?我粘贴的代码来自一个模块,但你的代码似乎是一个组件。 com_content等有很多例子,请花点时间阅读代码。你肯定需要一些Joomla的背景知识,然后才能解决这个问题,从http://docs.joomla.org/Developers开始,在misc框中有两篇关于缓存的文章,但是在网站上阅读并试图弄清楚基本知识。 $ mainframe是一个1.0或1.5的遗产,并没有用在你的代码中(从我看到的),所以它应该是安全的删除。请不要在评论中提问只是澄清 –