Hallo,
Ich hab gerade so ne schöne kleine Klasse geschreieben, mit Hilfe derer man Dateien, die man über das Internet holt zwischenspeichern kann um sie nicht jedes mal von einem anderen Server holen zu müssen. Ich brauche das gerade jetzt für RSS-Feeds von verschiedenen Diensten, die ich auf meiner eigenen Seite anzeigen möchte, aber nicht bei jedem aufruf der Seite diese von allen Seiten zu sammeln. Aber natürlich kann man das auch für andere Sachen nutzen.
Jetzt möchte ich von euch ein paar Meinungen zum guten code Design haben. Wie kann ich das ganze hier irgendwie sinnvoll verbessern/verkürzen/sicherer machen/erweitern, etc.? Es ist ja immer noch ziemlich abhängig von den installierten sachen. Man braucht etweder curl, PEAR:HTTP_Request oder allow_url_fopen, somit ist es nicht wirklich überall benutzbar, ich halte es aber nicht für sinnvoll alles was HTTP_Request macht nachzuprogrammieren.
<?php
class CacheRemoteFile {
var $remote_file_url = "";
var $cache_file = "";
var $cache_lifetime = 0;
var $_error = array();
var $file = "";
function CacheRemoteFile( $remote_file_url, $cache_file = "", $cache_lifetime = 3600) {
$this->remote_file_url = $remote_file_url;
if(empty($cache_file)) $this->cache_file = md5( $this->remote_file_url ).'.cache';
else $this->cache_file = $cache_file;
$this->cache_lifetime = $cache_lifetime;
if(!$this->file = $this->read()) {
if(!$this->file = $this->get_file_from_url()) $this->file = "";
else $this->write();
}
}
function read() {
$mtime = @filemtime($this->cache_file);
if( !$mtime || !is_readable($this->cache_file)) {
$this->_error[] = "File doesn't have mtime, or isn't readable.";
return false;
}
elseif ( $mtime < time() - $this->cache_lifetime ) return false;
return file_get_contents($this->cache_file);
}
function get_file_from_url() {
if(function_exists('curl_init')) {
$ch = curl_init($this->remote_file_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // no output, return into variable
curl_setopt($ch, CURLOPT_HEADER, 0);
$file = curl_exec($ch);
curl_close($ch);
return $file;
}
elseif(class_exists('HTTP_Request')) {
$file =& new HTTP_Request($this->remote_file_url);
if(PEAR::isError($file->sendRequest())) {
$this->_error = 'The source URI does not exist.';
return false;
}
else return $file->getResponseBody();
}
elseif(ini_get('allow_url_fopen')) {
if($file = file_get_contents($this->remote_file_url)) return $file;
else {
$this->_error[] = "Feed URL not reachable.";
return false;
}
}
else {
$this->_error[] = "There is no 'allow_url_fopen' and no 'HTTP_Request' from PEAR and no curl support. I'm not able to get the file";
return false;
}
}
function write() {
if (!$handle = fopen($this->cache_file, "w+")) {
$this->_error[] = "I can't open ".$this->cache_file;
return false;
}
if (!fwrite($handle, $this->file)) {
$this->_error[] = "I can't write to ".$this->cache_file;
return false;
}
fclose($handle);
return true;
}
function get() {
return $this->file;
}
function get_errors() {
return $this->_errors;
}
}
?>
Grüße
Jeena Paradies