Simpler Blog mit Textdateien (PHP)

Diverse Notizen und Sammlungen aus dem Soft~ und Hardware-Alltag
Antworten
Benutzeravatar
emanuel
Administrator
Beiträge: 47
Registriert: 07.04.2019 10:43
Wohnort: Wien
Kontaktdaten:

Simpler Blog mit Textdateien (PHP)

Beitrag von emanuel » 21.04.2019 10:51

Früher hatte ich ja Blosxom für meinen Blog genutzt (ein altes Perlskript und eine der erste Blog-Engines damalig im Netz), welches ich dann später, so wie die Meisten, mit Wordpress und anderen, großen CMS ersetzt hatte. Vor ca. 2~3 Jahren habe ich dann jedoch neben Anderen, auch meinen letzten, kleinen Alltagsblog geschlossen und es bleiben lassen. Zu mühsam war es mit Updates, Anpassungen und Co. und zugleich ist das Netz eh schon voll mit Millionen von sinnlosen Alltags-Texten rund um das Nichts.

Aber wenn man eine Passion hat, bekommt man die nur schwer wieder weg. In den letzten Wochen und Monaten hat sich nämlich wieder das Bedürfnis nach kleinen Gedankenzeilen geformt und nachdem ich niemanden auf Twitter und anderen Kanälen, die ich heute sowieso auch nicht mehr nutze, bewusst nerven möchte, habe ich mich heute früh hingesetzt und mal eben und schnell mir einen neuen Mini-Textdatei-Blog gebastelt: man könnte auch Flatfile Blog sagen.

Einfachster Aufbau: eine Textdatei für den Inhalt, die Parsedown-Datei für die Markdown-Formatierung der Texte und eine Index-Datei zur Ausgabe. Fertig.

Hier der Link zum Blog und nun nachfolgend der Auszug aus dem Kern:

index.php

Code: Alles auswählen

<?php
include('/full/server/path/here/Parsedown.php');
$inhalt = file_get_contents('/full/server/path/here/blog.txt');
$Parsedown = new Parsedown();
echo $Parsedown->text($inhalt);
?>
Und damit wird schon die Textdatei eingelesen und ausgespuckt. Nicht die beste Variante dafür, auch wenn es um Ressourcen geht, aber zugleich bei der geringen Datenmenge und den niedrigen Seitenaufrufen immer noch leichtgewichtiger und freundlicher, als 20 Datenbank-Abfragen mit 40 Vendor-Abhängigkeiten, Framework & Template-Engines, die bei jedem einzelnen Seitenaufruf bei so manch anderen Blog & CMS-Lösungen ausgeführt werden. Speziell bei modernen Servern heutzutage, wird so eine Textdatei einfach mal eben vernascht und ist kaum messbar in Relation zu den anderen Lösungen.

Geschrieben werden neue Einträge übrigens auch sehr banal:

schreiben.php

Code: Alles auswählen

<form method="post">
<textarea type="text" name="XXX" autofocus></textarea><br><br>
<input type="submit" name="submit" value="Eintrag absenden">
</form>
<?php
if (isset($_POST["XXX"]) && !empty($_POST["XXX"])) {
date_default_timezone_set("Europe/Vienna"); 
$stempel = date('d.m.Y_H:i:s'); // ja, unnötig, dass das auf zwei unterschiedliche Zeitstempel aufteile
$zeit = date('d.m.Y');
$file_data =$_POST['XXX'];
$file_data = "* <a name='".$stempel."' href='#".$stempel."' class='t'># ".$zeit."</a> ".$file_data." \r\n";
$file_data .= file_get_contents('/root/server/path/here/to/textfile.txt');
file_put_contents('/root/server/path/here/to/textfile.txt', $file_data);
    } else {
echo "<br>Noch kein Text.";
}
?>
Soll heißen: Ich füge immer am Anfang der Textdatei einen neuen Eintrag ein, der durch Markdown als Listeneintrag formatiert wird. Damit ist der neueste Eintrag immer oben, der Rest folgt dann somit chronologisch. Der Link bzw. HTML-Anker verweist auf sich selber, damit man quasi wie mit einem Permalink auch Einträge bzw. die Sprungmarken weiterschicken kann. Die werden mittels CSS dann hervorgehoben.

Nachdem ich nur puren Text verblogge und immer nur kurze Gedankenstückchen, landen vermutlich pro Tag ein bis zwei Einträge im Schnitt in diesen Blog. Soll heißen, pro Jahr 365 bis 730~ Einträge. Da nur Text und nur kurz somit eine sehr kleine Datenmenge, da benötigt es auch keine Pagination (Umblättern) - das vereinfacht auch vieles.

Schlicht, einfach und sehr unkompliziert. Was braucht man mehr für einen Blog? :mrgreen:

Benutzeravatar
emanuel
Administrator
Beiträge: 47
Registriert: 07.04.2019 10:43
Wohnort: Wien
Kontaktdaten:

Re: Simpler Blog mit Textdateien

Beitrag von emanuel » 21.04.2019 10:57

Und ja klar, kann man alles besser, sicherer, schöner und was auch immer machen, aber es ist schon mal sehr auf die pure Essenz ausgerichtet. Das Skript zum Schreiben liegt geschützt hinter .htaccess in einem gesonderten Verzeichnis, überall wird der volle Pfad eingesetzt und man kann auch die Codierung noch filtern.

Nachtrag: um auch fehlerhafte Einträge und dergleichen auch nachträglich bearbeiten zu können, habe ich noch ein drittes Skript im Einsatz:

bearbeiten.php

Code: Alles auswählen

<?php
$url = 'url/and/path/bearbeiten.php';
$file = '/root/server/path/here/to/textfile.txt';
if (isset($_POST['XXX']))
{
    file_put_contents($file, $_POST['XXX']);
    header(sprintf('Location: %s', $url));
    printf('<a href="%s">Moved</a>.', htmlspecialchars($url));
    exit();
}
$text = file_get_contents($file);
?>
<!-- HTML form -->
<form action="" method="post">
<textarea name="text"><?php echo htmlspecialchars($text) ?></textarea>
<input type="submit" name="submit" value="Änderungen speichern">
<input type="reset" value="Reset"/>
</form>
Wie man sieht, alles sehr einfach, kurz und schlicht. Eine Ausgabe-Datei index.php, eine Eingabe-Datei schreiben.php und eine zum Bearbeiten der Textdatei bearbeiten.php, falls mal nachträglich Bedarf ist.

Benutzeravatar
emanuel
Administrator
Beiträge: 47
Registriert: 07.04.2019 10:43
Wohnort: Wien
Kontaktdaten:

Re: Simpler Blog mit Textdateien

Beitrag von emanuel » 21.04.2019 11:03

Um auch selber ein Gefühl dafür zu haben, wie sich der Textblog entwickelt, habe ich noch zwei Snippets in die Ausgabe eingefügt. Einmal um die Ladezeit zu messen:

Direkt am Anfang der index.php

Code: Alles auswählen

<?php
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$start = $time;
?>
Und am Ende der selben Datei - zusätzlich auch noch ergänzt mit einer Abfrage für die Dateigröße.

Code: Alles auswählen

<?php
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$finish = $time;
$total_time = round(($finish - $start), 4);
echo $total_time.' Sekunden &middot; ';
echo (filesize("root/server/path/here/to/textfile.txt")/1000000)." Megabyte";
?>
Das war es und sollte eigentlich mal an "Features" reichen. Wer Meinungen, Gedanken und mehr hat, ich freue mich über Feedback - und natürlich auch Kritik. :mrgreen:

Benutzeravatar
emanuel
Administrator
Beiträge: 47
Registriert: 07.04.2019 10:43
Wohnort: Wien
Kontaktdaten:

Re: Simpler Blog mit Textdateien

Beitrag von emanuel » 21.04.2019 15:51

Nimmt man diese Dateien inklusive der Textdatei mit dem bisherigen Content her, dann kommt man auf eine Gesamtgröße von 60,7 KB für den vollständigen Blog. Kleiner als so manche Logo-Grafiken auf anderen Webseiten und kleiner als so manche Config-Datei. Mit ein bisschen Spielerei und Zusammenfassung von z.b. Schreiben und Bearbeiten in einer Datei, würde man das Ganze sicherlich vermutlich auf 50 KB weiter reduzieren können. :idea:

Und theoretisch könnte man bei vielen Einträgen die Startseite begrenzen, so dass zum Beispiel nur eine gewisse Anzahl an Zeilen gelesen wird, wird diese überschritten, folgt ein Link auf das Archiv. Gibt also genug Spielwiese für nette Stunden bei Regenwetter oder an Abenden. :D

Benutzeravatar
emanuel
Administrator
Beiträge: 47
Registriert: 07.04.2019 10:43
Wohnort: Wien
Kontaktdaten:

Re: Simpler Blog mit Textdateien (PHP)

Beitrag von emanuel » 22.04.2019 08:01

Theoretisch könnte man die Ausgabe auf der Startseite begrenzen:

Code: Alles auswählen

$maxlen = 5000;
if(strlen($inhalt) > $maxlen){
  $inhalt = substr($inhalt, 0, $maxlen);
  $inhalt = preg_replace('#[^\s]*$#s', '', $inhalt) . '...';
}
Und damit die Zeichen auf 5000 reduzieren und am Ende die obligatorischen Punkte einblenden oder aber auch einen Link mit dem Text "Alle Einträge lesen" auf eine zweite, vollständige Ausgabe-Datei setzen. Allerdings ändert das nichts an dem Einlesen grundsätzlich, da noch immer die ganze Datei (Menge/Größe) eingelesen wird.

Auf Monate aufsplitten
Eine andere Lösung wäre deshalb eine ganz andere Richtung und nach einer kurzen Einlauf-Zeit leicht möglich - legt man für jedes Monat beispielsweise eine eigene Text-Datei an (leicht beim Schreiben zu erstellen, in dem das PHP-Skript abfragt, welches Monat 2019-04 gerade ist und mit dem Dateinamen 2019-04.txt vergleicht - ist es nicht mehr der idente Name/Zahl, dann wird einfach eine neue Text-Datei 2019-05.txt erstellt) und auf der Startseite des Blogs liest man einfach immer nur zum Beispiel die letzten drei Monate ein.

Das wäre z.B. nach 15 Monaten bloggen oder je nach Schreibumfang sicherlich sinnvoll und reduziert die Datenmenge grundsätzlich bzw. schont die Ressourcen noch weiter. Außerdem kann man dann eine ergänzende Archiv-Seite erstellen, die alle Textdateien - sprich Monate - schlicht auflistet und verlinkt. Dadurch wäre der Blog langfristig sehr schlank und schnell.

archiv.php (grobes, ungeprüftes Beispiel):

Code: Alles auswählen

<h2>Archiv</2>
<ul>
<?php
$fileList = glob('path/to/files/*.txt');
foreach($fileList as $filename){
    if(is_file($filename)){
   echo '<li><a href="domain/'.$filename.'">'.$filename.'</a></li>'; 
   }
}
?>
</ul>
Wobei der Blog das dennoch auch so ist - man vergleiche nur mal diverse CMS-Installationen oder gar auch nur manche Log-Files, die dabei für die Anzeige mancher Inhalte genutzt werden - alleine die sind schwergewichtiger, als dieses "Lies diese Textdatei mit der Handvoll an Einträgen ein".

So gesehen wären solche Spielereien mit dem Aufsplitten eher purer, unnützer Luxus just for fun. :mrgreen:

Benutzeravatar
emanuel
Administrator
Beiträge: 47
Registriert: 07.04.2019 10:43
Wohnort: Wien
Kontaktdaten:

Re: Simpler Blog mit Textdateien (PHP)

Beitrag von emanuel » 22.04.2019 13:01

Eine Möglichkeit... :idea:

Code: Alles auswählen

echo head('/full/path/to/textfile.txt',3);
function head($filepath, $lines = 1, $adaptive = true) {
$f = @fopen($filepath, "rb");
if ($f === false) return false;
if (!$adaptive) $buffer = 4096;
else $buffer = ($lines < 2 ? 64 : ($lines < 10 ? 512 : 4096));
$output = '';
while(($line = fgets($f)) !== false) {
if (feof($f)) break;
if ($lines-- == 0) break;
$output .= "<li>".$line . "</li>";
}
fclose($f);
return trim($output);
}

Antworten