PHP RSS解析器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP RSS解析器相关的知识,希望对你有一定的参考价值。
<?php
if(!defined('BASEPATH'))
exit('No direct script access allowed');
/*
* This class is written based entirely on the work found below
* www.techbytes.co.in/blogs/2006/01/15/consuming-rss-with-php-the-simple-way/
* All credit should be given to the original author
*/
class RSSParser
{
// ===================//
//Instance vars //
// ===================//
/* Feed URI */
var $feed_uri;
/* Associative array containing all the feed items */
var $data;
/* Store RSS Channel Data in an array */
var $channel_data;
/* Boolean variable which indicates whether an RSS feed was unavailable */
var $feed_unavailable;
/* Cache lifetime */
var $cache_life;
/* Flag to write to cache - defaulted to false */
var $write_cache_flag = false;
/* Code Ignitor cache directory */
var $cache_dir;
// ================ //
// Constructor //
// ================ //
function RSSParser($params)
{
$this->CI = & get_instance();
$this->cache_dir = $this->CI->config->item('rss_cache_path');
//$this->cache_dir = '/system/cache';
$this->cache_life = $params['life'];
$this->feed_uri = $params['url'];
$this->current_feed['title'] = '';
$this->current_feed['description'] = '';
$this->current_feed['link'] = '';
$this->data = array();
$this->channel_data = array();
//Attempt to parse the feed
$this->parse();
}
// =============== //
// Methods //
// =============== //
function parse()
{
//Are we caching?
if($this->cache_life != 0)
{
$filename = $this->cache_dir . 'rss_Parse_' . md5($this->feed_uri);
//is there a cache file ?
if(file_exists($filename))
{
//Has it expired?
$timedif = (time() - filemtime($filename));
if($timedif < ( $this->cache_life * 60))
{
//its ok - so we can skip all the parsing and just return the cached array here
$this->xml_to_object(implode('', file($filename)));
return true;
}
//So raise the falg
$this->write_cache_flag = true;
}
else
{
//Raise the flag to write the cache
$this->write_cache_flag = true;
}
}
//Parse the document
$rawFeed = file_get_contents($this->feed_uri);
$this->xml_to_object($rawFeed);
//Do we need to write the cache file?
if($this->write_cache_flag)
{
if(!$fp = @fopen($filename, 'wb'))
{
echo 'ERROR';
log_message('error', 'Unable to write cache file: ' . $cache_path);
return;
}
flock($fp, LOCK_EX);
fwrite($fp, $rawFeed);
flock($fp, LOCK_UN);
fclose($fp);
}
return true;
}
/* Return the feeds one at a time: when there are no more feeds return false
* @param No of items to return from the feed
* @return Associative array of items
*/
function getFeed($num)
{
$c = 0;
$return = array();
foreach($this->data AS $item)
{
$return[] = $item;
$c++;
if($c == $num)
break;
}
return $return;
}
/* Return channel data for the feed */
function & getChannelData()
{
if(!empty($this->channel_data))
{
return $this->channel_data;
}
else
{
return FALSE;
}
}
/* Were we unable to retreive the feeds ? */
function errorInResponse()
{
return $this->feed_unavailable;
}
function xml_to_object($feed)
{
$xml = new SimpleXmlElement($feed);
//Assign the channel data
$this->channel_data['title'] = $xml->channel->title;
$this->channel_data['description'] = $xml->channel->description;
$this->channel_data['lastBuildDate'] = $xml->channel->lastBuildDate;
//Build the item array
foreach($xml->channel->item as $item)
{
$data = array();
$data['title'] = $item->title;
$data['description'] = $item->description;
$data['pubDate'] = $item->pubDate;
$data['link'] = $item->link;
$this->data[] = $data;
}
//return $this->data;
}
}
以上是关于PHP RSS解析器的主要内容,如果未能解决你的问题,请参考以下文章