124 lines
4.5 KiB
PHP
124 lines
4.5 KiB
PHP
|
<?php
|
|||
|
/* vim: set expandtab tabstop=4 shiftwidth=4: */
|
|||
|
// +----------------------------------------------------------------------+
|
|||
|
// | PHP version 4 |
|
|||
|
// +----------------------------------------------------------------------+
|
|||
|
// | Copyright (c) 1997-2003 The PHP Group |
|
|||
|
// +----------------------------------------------------------------------+
|
|||
|
// | This source file is subject to version 2.0 of the PHP license, |
|
|||
|
// | that is bundled with this package in the file LICENSE, and is |
|
|||
|
// | available through the world-wide-web at |
|
|||
|
// | http://www.php.net/license/2_02.txt. |
|
|||
|
// | If you did not receive a copy of the PHP license and are unable to |
|
|||
|
// | obtain it through the world-wide-web, please send a note to |
|
|||
|
// | license@php.net so we can mail you a copy immediately. |
|
|||
|
// +----------------------------------------------------------------------+
|
|||
|
// | Author: Marshall Roch <marshall@exclupen.com> |
|
|||
|
// +----------------------------------------------------------------------+
|
|||
|
//
|
|||
|
// $Id: Common.php,v 1.1.1.1 2003/09/13 15:03:53 mroch Exp $
|
|||
|
|
|||
|
/**
|
|||
|
* @author Marshall Roch <marshall@exclupen.com>
|
|||
|
* @copyright Copyright 2003 Marshall Roch
|
|||
|
* @license http://www.php.net/license/2_02.txt PHP License 2.0
|
|||
|
* @package Services_ExchangeRates
|
|||
|
*/
|
|||
|
|
|||
|
/**
|
|||
|
* Cache_Lite is needed to cache the feeds
|
|||
|
*/
|
|||
|
if ( !class_exists('Cache_Lite') ) {
|
|||
|
require_once 'Cache/Lite.php';
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Common functions for data retrieval
|
|||
|
*
|
|||
|
* Provides base functions to retrieve and cache data feeds in different
|
|||
|
* formats.
|
|||
|
*
|
|||
|
* @package Services_ExchangeRates
|
|||
|
*/
|
|||
|
class Services_ExchangeRates_Common {
|
|||
|
|
|||
|
/**
|
|||
|
* Retrieves data from cache, if it's there. If it is, but it's expired,
|
|||
|
* it performs a conditional GET to see if the data is updated. If it
|
|||
|
* isn't, it down updates the modification time of the cache file and
|
|||
|
* returns the data. If the cache is not there, or the remote file has been
|
|||
|
* modified, it is downloaded and cached.
|
|||
|
*
|
|||
|
* @param string URL of remote file to retrieve
|
|||
|
* @param int Length of time to cache file locally before asking the server
|
|||
|
* if it changed.
|
|||
|
* @return string File contents
|
|||
|
*/
|
|||
|
function retrieveFile($url, $cacheLength, $cacheDir) {
|
|||
|
|
|||
|
$cacheID = md5($url);
|
|||
|
|
|||
|
$cache = new Cache_Lite(array("cacheDir" => $cacheDir,
|
|||
|
"lifeTime" => $cacheLength));
|
|||
|
|
|||
|
if ($data = $cache->get($cacheID)) {
|
|||
|
return $data;
|
|||
|
} else {
|
|||
|
// we need to perform a request, so include HTTP_Request
|
|||
|
include_once 'HTTP/Request.php';
|
|||
|
|
|||
|
// HTTP_Request has moronic redirect "handling", turn that off (Alexey Borzov)
|
|||
|
$req = new HTTP_Request($url, array('allowRedirects' => false));
|
|||
|
|
|||
|
// if $cache->get($cacheID) found the file, but it was expired,
|
|||
|
// $cache->_file will exist
|
|||
|
if (isset($cache->_file) && file_exists($cache->_file)) {
|
|||
|
$req->addHeader('If-Modified-Since', gmdate("D, d M Y H:i:s", filemtime($cache->_file)) ." GMT");
|
|||
|
}
|
|||
|
$req->addHeader('User-Agent', 'Firefox (WindowsXP) – Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6');
|
|||
|
|
|||
|
$req->sendRequest();
|
|||
|
|
|||
|
if (!($req->getResponseCode() == 304)) {
|
|||
|
// data is changed, so save it to cache
|
|||
|
$data = $req->getResponseBody();
|
|||
|
$cache->save($data, $cacheID);
|
|||
|
return $data;
|
|||
|
} else {
|
|||
|
// retrieve the data, since the first time we did this failed
|
|||
|
if ($data = $cache->get($cacheID, 'default', true)) {
|
|||
|
return $data;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Services_ExchangeRates::raiseError("Unable to retrieve file ${url} (unknown reason)", SERVICES_EXCHANGERATES_ERROR_RETRIEVAL_FAILED);
|
|||
|
return false;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Downloads XML file or returns it from cache
|
|||
|
*
|
|||
|
* @param string URL of XML file
|
|||
|
* @param int Length of time to cache
|
|||
|
* @return object XML_Tree object
|
|||
|
*/
|
|||
|
function retrieveXML($url, $cacheLength, $cacheDir) {
|
|||
|
include_once 'XML/Tree.php';
|
|||
|
|
|||
|
if ($data = $this->retrieveFile($url, $cacheLength, $cacheDir)) {
|
|||
|
|
|||
|
$tree = new XML_Tree();
|
|||
|
$root = $tree->getTreeFromString($data);
|
|||
|
|
|||
|
return $root;
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
?>
|