Hai sa fim practici!
RSS icon Email icon Home icon
  • PHP XML Blogroll sursa: blogspot.com – Suport cache si MYSQL

    Posted on October 18th, 2009 admin No comments

    Am scris acest articol si functie cu scopul de a o implementa intr-un site pentru a afisa ultimele posturi de pe un blog gazduit pe blogspot.com (gen: http://carbonenergy.blogspot.com), cu alte cuvinte: Blogroll

    Este facut in PHP cu suport MYSQL pentru a stoca cache-ul si foloseste simpleXML pentru luare datelor de pe blog.

    Este setat sa actualizeze informatiile la 24 de ore, dar acest interval se poate modifica, regland intervalul de secunde. Prescurteaza textul din titlu si din continut la un numar setat de caractere (acestea pot fi setat in script).

    Folosit scriptul returneaza un array cu informatile despre posturi: date (datetime), link, titlu si continut.

    Singura sa problema e ca nu curata posturile vechi din baza de date.  Poate implementez in urmatoarea versiune.

    Exemplu: http://www.carbonenergy.ro/ : vezi partea de stanga a siteului (Blogroll)

    Version 0.2

    Modificari:

    • adaugate optiuni de listare (numarul de articole de afisat, pozitia de unde sa afiseaza); vezi variabilele functiei: $num = 3, $start = 0
    • scoasa optiunea de formatare a datei din functie
    • modificata structura de stocare a link-urilor (mysql + php)
    • optimizari a structurii bazei de date
    • optimzarea procedurii de stocare a informatiilor (reducerea numarului de query-uri)
    • adaugat tabel de configuratii
    • continutul stocat are in componenta tag-urile html: <p>, <img> si <br> pentru a nu se pierde formatarea
    • au fost reparate cateva bug-uri

    Cerinte:

    • PHP5 sau mai nou
    • MySQL 5.0.3 sau mai nou

    Cod configuratie:

    $query = mysql_query('SELECT `name`, `value` FROM `cms_config`');
    while ($row = mysql_fetch_assoc($query)){
    $config[$row['name']] = $row['value'];
    }

    Functia PHP:

    function get_broll ($num = 3, $start = 0) {
    global $config;
    
    //$cleanup = do_db_cleanup();
    
    $query = mysql_query("SELECT `id`, `date`, `title`, `path`, `link`, `content` FROM `cms_broll` ORDER by `date` DESC LIMIT ".$start.", ".$num) or print(mysql_error());
    
    $brollq = array();
    
    	$i = 0;
    	while ($row = mysql_fetch_assoc($query)) {
    		$brollq[$i] = $row;
    		$i++;
    	}
    
    $update['last'] = strtotime($config['last_broll_update']);
    
    if (!(mysql_num_rows($query) > 0) || ((time() - $update['last']) > $config['broll_update_interval'])) {
    
    	$xml=@simplexml_load_file('http://carbonenergy.blogspot.com/feeds/posts/default');
    	if(!$xml){return false;}
    
    	// the update loop, getting all articles and updating db is necessary
    	for ($i= 0; isset($xml->entry[$i]->title); $i++) {
    
    		preg_match('/^(.*\/)(.*)$/i', $xml->entry[$i]->link[4]->attributes()->href, $matches);
    
    		$broll[$i]['path'] = $matches[1];
    		$broll[$i]['link'] = $matches[2];
    		$broll[$i]['date'] = str_replace('T', ' ', substr($xml->entry[$i]->published, 0, 19));
    		$broll[$i]['title'] = $xml->entry[$i]->title;
    		$broll[$i]['content'] = strip_tags(htmlspecialchars_decode($xml->entry[$i]->content), '
    
    
    ');
    
    		if (!(mysql_num_rows($query) > 0) || (strtotime($brollq[0]['date']) < strtotime($broll[$i]['date']))) {
    
    			if (isset($brollq[$i]['link']) && ($brollq[$i]['link'] == $broll[$i]['link'])) { continue; }
    
    			$up = mysql_query("INSERT IGNORE
    						INTO `cms_broll` (`date`, `title`, `path`, `link`, `content`)
    						VALUES (
    							'".$broll[$i]['date']."',
    							'".$broll[$i]['title']."',
    							'".$broll[$i]['path']."',
    							'".$broll[$i]['link']."',
    							'".mysql_real_escape_string($broll[$i]['content'])."')") or print(mysql_error());
    		}
    	}
    
    	// updating config last blog roll update date
    	$upbconf = mysql_query("UPDATE `cms_config` SET `value`='".date_time_format()."' WHERE `name`='last_broll_update'");
    
    } else { return $brollq; }
    
    return array_slice($broll, $start, $num);
    
    }

    Structura bazei de date:

    -- phpMyAdmin SQL Dump
    
    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
    
    -- --------------------------------------------------------
    
    --
    -- Table structure for table `cms_config`
    --
    
    CREATE TABLE IF NOT EXISTS `cms_config` (
      `id` tinyint(4) NOT NULL auto_increment,
      `name` varchar(100) NOT NULL,
      `value` varchar(255) NOT NULL,
      `descriere` text NOT NULL,
      `extra` text NOT NULL,
      PRIMARY KEY  (`id`,`name`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
    
    --
    -- Dumping data for table `cms_config`
    --
    
    INSERT INTO `cms_config` (`id`, `name`, `value`, `descriere`, `extra`) VALUES
    (3, 'last_broll_update', '2010-11-28 16:22:56', 'Ultimul update al blog-ului', '0'),
    (4, 'broll_update_interval', '7200', 'Intervalul in care se vor face actualizari la catergoria blog roll direct de pe blog.\r\n\r\nValoare in secunde:\r\nEX: 7200 = 2 ore', '');
    
    --
    -- Table structure for table `cms_broll`
    --
    
    CREATE TABLE IF NOT EXISTS `cms_broll` (
      `id` int(11) NOT NULL auto_increment,
      `date` datetime NOT NULL,
      `title` text NOT NULL,
      `path` text NOT NULL,
      `link` varchar(500) NOT NULL,
      `content` text NOT NULL,
      UNIQUE KEY `link` (`link`),
      KEY `id` (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2511 ;
    
    --
    -- Dumping data for table `cms_broll`
    --
    
    INSERT INTO `cms_broll` (`id`, `date`, `title`, `path`, `link`, `content`) VALUES
    (2509, '2010-10-27 00:01:00', 'Industria europeana finanteaza senatorii climato-sceptici din SUA', 'http://carbonenergy.blogspot.com/2010/10/', 'industria-europeana-finanteaza.html', 'Nume grele ale industriei europene, precum companiile germane Bayer si BASF sau cele franceze Lafarge si GDF-Suez, au sustinut financiar campaniile electorale ale mai multor senatori americani care neaga efectele negative ale schimbarilor climatice, dezvaluie un raport al retelei de ONG-uri Climate Action Network Europe, citat de "Le Monde".
    
    Documentul arata ca, in 2010, ”cei mai mari poluatori europeni” au varsat peste 306.000 de dolari in conturile alesilor climato-sceptici care se opun vehement adoptarii pachetului legislativ de lupta impotriva schimbarilor climatice.
    
    Studiul se bazeaza pe cifrele publicate luna aceasta de comisia electorala federala americana, cu ocazia alegerilor pentru Senat de pe 2 noiembrie. Acestea detaliaza sumele primite de fiecare senator si numele donatorilor, conform politicilor americane de transparenta privind finantarea campaniilor electorale.
    
    ”Un grup format din cei mai mari producatori europeni de dioxid de carbon finanteaza campaniile politice ale unora din cei mai ferventi opozanti ai legislatiei impotriva schimbarilor climatice care se negociaza in Senatul american”, afirma autorii raportului. Ei subliniaza faptul ca aceleasi companii europene fac lobby impotriva reducerii drastice a emisiilor de gaze cu efect de sera in Europa aducand ca argument tocmai faptul ca nu trebuie facut nimic pana cand Statele Unite nu actioneaza ferm in acest sens.
    
    Raportul mai arata ca producatorul francez de ciment Lafarge, responsabil de 15 milioane de tone de emisii in 2009, a varsat 34.500 de dolari, iar GDF-Suez – 21.000 de dolari, catre alesii americani care se opun crearii unei piete a carbonului in SUA. Cel mai generos donator, arata raportul, a fost grupul farmaceutic german Bayer, cu 108.000 de dolari, urmat de compania BASF, cu 61.500 de dolari.');
    

    Version 0.1

    Functia PHP:

    function get_broll ($num = 3) {

    $query = mysql_query(“SELECT `id`, `date`, `title`, `link`, `content`, `tstamp` FROM `cms_broll` ORDER by `date` DESC LIMIT 0, 3″);

    $i = 0;
    while ($row = mysql_fetch_assoc($query)) {
    $brollq[$i] = $row;
    $brollq[$i]['date'] = substr($brollq[$i]['date'], 0, 10);
    $i++;
    }

    $tstamp = time();

    if ((mysql_num_rows($query) == 0) || !isset($brollq[0]['tstamp']) || (($tstamp – $brollq[0]['tstamp']) > 86400)) {

    $xml=@simplexml_load_file(‘http://carbonenergy.blogspot.com/feeds/posts/default’);

    if(!$xml){return 0;}

    for ($i = 0; $i < $num ; $i++) {

    $broll[$i]['link'] = $xml->entry[$i]->link[4]->attributes()->href;
    $broll[$i]['date'] = str_replace(‘T’, ‘ ‘, substr($xml->entry[$i]->published, 0, 19));
    $broll[$i]['title'] = substr($xml->entry[$i]->title, 0, 33);
    if (strlen($xml->entry[$i]->title) > 33) {$broll[$i]['title'] .= ‘…’; }
    $broll[$i]['content'] = substr($xml->entry[$i]->content, 0, 137);
    if (strlen($xml->entry[$i]->content) > 132) {$broll[$i]['content'] .= ‘…’; }

    if ((mysql_num_rows($query) == 0) || ($brollq[$i]['link'] != $broll[$i]['link']) ) {
    $up = mysql_query(“INSERT INTO `cms_broll` (`date`, `title`, `link`, `content`, `tstamp`) VALUES(‘”.$broll[$i]['date'].”‘,’”.$broll[$i]['title'].”‘,’”.$broll[$i]['link'].”‘,’”.$broll[$i]['content'].”‘,’”.$tstamp.”‘)”);
    }
    $broll[$i]['date'] = substr($xml->entry[$i]->published, 0, 10);

    }

    } else {
    return $brollq;}

    return $broll;

    }

    Structura tabel de date MYSQL:
    CREATE TABLE IF NOT EXISTS `cms_broll` (
    `id` int(11) NOT NULL auto_increment,
    `date` datetime NOT NULL,
    `title` text NOT NULL,
    `link` text NOT NULL,
    `content` text NOT NULL,
    `tstamp` int(11) NOT NULL,
    UNIQUE KEY `id_2` (`id`),
    UNIQUE KEY `id_3` (`id`),
    KEY `id` (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=34 ;


    – Dumping data for table `cms_broll`

    INSERT INTO `cms_broll` (`id`, `date`, `title`, `link`, `content`, `tstamp`) VALUES
    (33, ’2009-10-16 02:34:00′, ‘Doua miliarde euro din emisiile d…’, ‘http://carbonenergy.blogspot.com/2009/10/doua-miliarde-euro-din-emisiile-de-co2.html’, ‘Ca sa mai faca rost de niste bani la buget pe timp de criza, Guvernul spera sa obtina doua miliarde euro din vanzarea surplusului de drep…’, 1255794474),
    (32, ’2009-10-16 02:36:00′, ‘Primul proiect de captare a CO2 i…’, ‘http://carbonenergy.blogspot.com/2009/10/primul-proiect-de-captare-co2-in.html’, ‘Producatorul de gaze Romgaz, transportatorul national de gaze Transgaz si producatorul de energie electrica Complexul Energetic Craiova v…’, 1255794474),
    (31, ’2009-10-16 02:38:00′, ‘EU: Romania, Bulgaria must cut na…’, ‘http://carbonenergy.blogspot.com/2009/10/eu-romania-bulgaria-must-cut-national.html’, ‘London. The European Commission Friday ruled that Romania and Bulgaria must both reduce their carbon dioxide national allocation plans fo…’, 1255794474);

    Astept comentarii si sugestii.