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分鐘,而且我在專用服務器上,所以我想到的解決方案是緩存這個副本,任何人都可以幫助我?
非常感謝你,我試圖實現你的建議,但我不是程序員,所以對我來說有點困難。例如,我應該把你的代碼放入一個Jumi模塊中,以便將它作爲模塊使用嗎?此外,我正在學習MySQL和PHP,但我是新來的,我不知道如何檢查表是否有索引,我該怎麼做?最後,當你談論放棄$大型機時,你的意思是我應該簡單地刪除「global $ mainframe;」這一行。 ?非常感謝... –
我不知道Jumi,你的意思是Joomla?我粘貼的代碼來自一個模塊,但你的代碼似乎是一個組件。 com_content等有很多例子,請花點時間閱讀代碼。你肯定需要一些Joomla的背景知識,然後才能解決這個問題,從http://docs.joomla.org/Developers開始,在misc框中有兩篇關於緩存的文章,但是在網站上閱讀並試圖弄清楚基本知識。 $ mainframe是一個1.0或1.5的遺產,並沒有用在你的代碼中(從我看到的),所以它應該是安全的刪除。請不要在評論中提問只是澄清 –