fortune class
obdoba linuxového fortune
před pár dny byla na server phpclasses.org přidána třída php5 fortune class. tato třída generuje ze souborů používaných linuxovým programem fortune náhodně vybrané citáty. jak je zřejmé už z názvu třídy, je tato napsána pro php5. jelikož jsem chtěl tuto třídu použít na svých stránkách, ale bohužel na stroji, kde je můj web umístěn, běží php v nižší verzi. proto jsem tuto třídu upravil tak aby fungovala i na nižších verzích php.
soubor fortune.class.php:
<?PHP
class fortune{
// adresar, kde jsou ulozene soubory s citaty
var $datadir;
// overi zda soubor ma priponu .fortune
function IsFortuneFile($file){
if (ereg('\.fortune$',$file)){
return true;
}else{
return false;
}
}
// ulozeni ukazatelu na zacatky citatu do pole
function IndexFile($file){
$index = array();
$soubor = fopen($file,'r');
while (!feof($soubor)) {
$line = fgets($soubor,4096);
if ($line == "%\n" or $line == "%\r\n") {
$index[] = ftell($soubor);
}
}
fclose($soubor);
return $index;
}
// vrati nahodnou hodnotu do zadane $max hodnoty
function RandPick($max){
list($usec, $sec) = explode(' ', microtime());
$seed = (float) $sec + ((float) $usec * 100000);
srand($seed);
$num = rand(0,$max);
return $num;
}
// ze souboru $file vybere citat urceny ukazatelem ulozenem v poli $pole na pozici $num
function FetchQuoteInFile ($file , $pole , $num){
$soubor = fopen($file,'r');
if ($num > 0) {
fseek($soubor,$pole[$num-1]);
}
$quote = '';
while ($line = fgets($soubor, 4096)) {
if ($line == "%\n" or $line == "%\r\n") {
break;
}
$quote .= $line;
}
fclose($soubor);
return $quote;
}
// hlavni funkce
function Get_Quote(){
$soubory = array();
$files = array();
if ($soubor = dir($this->datadir)){
$i=0;
while ($file = $soubor->read()){
if($this->isFortuneFile($file)){
$soubory[] = $this->indexFile($this->datadir.'/'.$file);
$files[] = $this->datadir."/".$file;
$i++;
}
}
$soubor->close();
}
for($i=0; $i<Count($soubory); $i++){
$tot_quotes += count($soubory[$i])+1;
}
$pick = $this->RandPick($tot_quotes-1);
$q=0;
for($i=0; $i<Count($soubory); $i++){
$in_file = count($soubory[$i])+1;
$max = $in_file + $q;
if ($pick >= $i and $pick < $max) {
$quote = $this->FetchQuoteInFile($files[$i],$soubory[$i],$pick-$q);
break;
}
$q += $in_file;
}
return $quote;
}
// vola hlavni funkci dokud neni vracen citat
function Quote(){
while(!$quote){
$quote=$this->Get_Quote();
}
return $quote;
}
}
?>
soubor index.php:
<?PHP
// natazeni knihovny obsahujici tridu
include ("class.fortune.php");
// vytvoreni instance tridy
$fortune=new fortune;
// nastaveni adresare se soubory obsahujici citaty
$fortune->datadir="fortunes";
// vypis citatu
echo NL2BR($fortune->quote());
?>
jak třída funguje, se můžeš podívat tady: furtune demo
tento příklad si můžeš stáhnou a vyzkoušet na svém serveru drsny.zip
na třídu php5 forune class se můžeš podívat tady