Alles was mit Programmierung zu tun hat.

[PHP] Kommentare in PHP Scripten

Hallo zusammen.

Heute reden wir mal über Kommentare :)
Wenn man ein Script erstellt, dann ist es sinnvoll das Script zu kommentieren. Also eine kleine Dokumentation im Script. Denn solange man gerade damit Arbeitet und das Script in einer relativen Größe bleibt, weiß man noch was genau welche Zeile macht und wozu Sie da ist.

Doch spätestens wenn das Script beachtliche Formen annimmt und/oder man nach Wochen oder Monaten mal wieder reinschaut… ist alles weg. Wie war das noch gleich? Was macht diese Zeile hier? Wo finde ich jetzt das und das?…  Alles weg… der Code besteht nur noch aus Kauderwelsch.
Spätestens jetzt tritt man sich selbst in den Ar*** das man den Code nicht Kommentiert hat.

Natürlich dauert es länger wenn man zum Code auch noch was schreiben muss… aber irgendwann kann es sich auszahlen. Auch (und gerade) wenn man ein Projekt von einem anderen Programmierer übernimmt ist es wichtig Dokumentierten Code vorzufinden.

Und es ist sooo einfach ;) 2 Schrägstriche (//) bei einer Zeile und ein Schrägstrich mit Stern bei mehreren Zeilen (/* am Anfang… und */ am Ende). Das ganze sieht dann so aus.



Und noch ein Mehrzeiliger Kommentar:



Viele Grüße
Gordon

[PHP] Datei löschen

Hallo zusammen,

heute möchte ich mal auf die Frage eingehen ob man mit PHP Datei(en) löschen kann.

Zu erst einmal muss man unterscheiden. Dateien auf dem Webserver und Dateien auf der lokalen Festplatte. Ersteres ja, letzteres nein.
PHP hat natürlich keinen Zugriff auf die Dateien des Besuchers einer Webseite. Das hat keine Serverseitige Programmiersprache. Auch Clientseitige Scripte (wie Javascript) können das nur bedingt. Sonst wäre es ja jeder Webseite ohne weiteres wahllos Dateien zu löschen. Das wäre ein Desaster.

Auf dem Webserver kann PHP jedoch, bedingt, Dateien löschen. Bedingt heißt das man auch hier nicht einfach wahllos irgendwelche Dateien löschen kann. Auch das wäre ein Desaster.

Das PHP-Skript braucht für die entsprechende Datei auch entsprechende Rechte. Unter Linux sogar noch bestimmte Gruppen- und Benutzerzugehörigkeiten.

Doch im Normalfall ist es nicht so Kompliziert wie es sich jetzt anhört. Denn im Normalfall wird ja meist eine Datei gelöscht die auch mit dem gleichen Skript erstellt wurde. Also zum Beispiel eine temporäre Datei oder eine Datei die ein User hochgeladen (ein Bild z.B.). Dann wurde die Datei auch mit dem PHP Skript erstellt und trägt dessen User- und Benutzerrechte. Damit auch das Recht die Datei wieder zu löschen.

Doch wie funktioniert es?
Ganz einfach. Alles was wir brauchen ist der PHP-Befehl zum Datei löschen und der Pfad der Datei selbst. Das passt in eine Codezeile.

$res = unlink("testdatei.hm");

Das war’s schon. In $res ist dann der Rückgabewert enthalten. 1 = erfolgreich gelöscht und 0 = Datei konnte nicht gelöscht werden.

Bei Verzeichnisstrukturen können relative wie auch absolute Pfadangaben gemacht werden.

[vb.net] Grafische Progressbar in Datagridview-Zelle

Hallo zusammen.

Ich bin ein großer Freund des Datagridviews. Man kann Daten sehr einfach, übersichtlich und schön in einer Tabellenform darstellen. Doch manchmal möchte man dort auch gern eine Progressbar im Datagridview anzeigen lassen. Zum Beispiel wenn man sich einen Downloader bastelt und den aktuellen Stand des Downloads grafisch darstellen möchte. Oder auch wenn man statisch einen Prozentsatz grafisch darstellen möchte.

Leider gibt es standartmäßig keine Möglichkeit eine Progressbar in ein Datagridview einzubinden und das Element selbst unterstützt es auch nicht.

Nun führen bekanntlich viele Wege nach Rom. Manche sind lang und mühsam und manche sind recht simpel.
Ich habe auf meiner Suche Seitenlange Quelltexte gefunden, fertige DLL’s und schlussendlich eine sehr simple, aber effektive Möglichkeit. Die meine eigenen Überlegungen aufgegriffen hat. Nämlich die Progressbar einfach mit einem Bild zu imitieren. Das heißt es wird einfach ein Bild erstellt, welches dann in der entsprechenden Zelle eingebunden wird.
Dazu muss ich auch gleich sagen das diese Methode sehr Prozessorlastig werden kann, wenn viele „Progressbars“ im Datagrid existieren und diese oft geupdated werden. Wie viel mehr das im Vergleich zu den anderen Methoden ist, kann ich jedoch nicht sagen. Vielleicht macht es gar keinen großen Unterschied. Also entscheide selbst ob es für dein Programm geeignet ist.

Hier nun erst einmal der Code.


Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim col As New ProgressColumn
        DataGridView1.Columns.Add(col)
        DataGridView1.AllowUserToAddRows = False
        DataGridView1.RowCount = 5
        Dim x As Integer = 1
        For Each row As DataGridViewRow In DataGridView1.Rows
            row.Cells(0).Value = x * 20
            x += 1
        Next
    End Sub
End Class

Public Class ProgressColumn
    Inherits DataGridViewColumn
    Public Sub New()
        MyBase.New(New ProgressCell())
    End Sub

    Public Overrides Property CellTemplate() As DataGridViewCell
        Get
            Return MyBase.CellTemplate
        End Get
        Set(ByVal Value As DataGridViewCell)
            ' Ensure that the cell used for the template is a ProgressCell.
            If Value IsNot Nothing And Not TypeOf (Value) Is ProgressCell Then
                Throw New InvalidCastException("Must be a ProgressCell")
            End If
            MyBase.CellTemplate = Value
        End Set
    End Property
End Class

Public Class ProgressCell
    Inherits DataGridViewImageCell
    Protected Overrides Function GetFormattedValue(ByVal value As Object, ByVal rowIndex As Integer, ByRef cellStyle As System.Windows.Forms.DataGridViewCellStyle, ByVal valueTypeConverter As System.ComponentModel.TypeConverter, ByVal formattedValueTypeConverter As System.ComponentModel.TypeConverter, ByVal context As System.Windows.Forms.DataGridViewDataErrorContexts) As Object
        ' Create bitmap.
        Dim bmp As Bitmap = New Bitmap(Me.Size.Width, Me.Size.Height)

        Using g As Graphics = Graphics.FromImage(bmp)

            ' Percentage.
            Dim percentage As Double = 0
            Double.TryParse(Me.Value.ToString(), percentage)
            Dim text As String = percentage.ToString() + " %"

            ' Get width and height of text.
            Dim f As Font = New Font("Verdana", 10, FontStyle.Regular)
            Dim w As Integer = CType(g.MeasureString(text, f).Width, Integer)
            Dim h As Integer = CType(g.MeasureString(text, f).Height, Integer)

            ' Draw pile.
            g.DrawRectangle(Pens.Black, 2, 2, Me.Size.Width - 6, Me.Size.Height - 6)
            g.FillRectangle(Brushes.Blue, 3, 3, CInt((Me.Size.Width - 6) * percentage / 100), CInt(Me.Size.Height - 7))

            Dim rect As RectangleF = New RectangleF(0, 0, bmp.Width, bmp.Height)
            Dim sf As StringFormat = New StringFormat()
            sf.Alignment = StringAlignment.Center
            g.DrawString(text, f, Brushes.Red, rect, sf)
        End Using

        Return bmp
    End Function


End Class

Was passiert hier nun?

Im Form_Load werden erst einmal die Datagridview-Spalten definiert und gefüllt. Dabei fällt auf das eine Zelle mit einem „ProgressColumn“ definiert wird. Das ist unsere Spezielle Progressbar-Zelle. Diese kann durch die folgende Klasse „ProgressColumn“ definiert werden.
Im Beispiel besteht unser Datagridview auch nur aus der einen Zelle (siehe auch Bild oben).

Dann wird das Datagridview-Element noch mit ein paar Testdaten gefüttert.

Die Klasse „ProgressColumn“ lässt uns, wie gerade schon gesagt, eine spezielle Zelle definieren. Nämlich die für die Progressbar. Es ist ein Handler der erst definiert werden muss, bevor er genutzt werden kann. Verändert sich der Wert der Zelle so wird dieser Handler aufgerufen und er verarbeitet die Änderung. Um genau zu sein ruft er dann die Klasse ProgressCell auf, die wiederum das Bild erstellt.

Alle Änderungen die das Aussehen der Progressbar-Zelle betreffen, werden in der Klasse „ProgressCell“ vorgenommen. Wir Hintergrundfarbe, Vordergrundfarbe, Textformatierung, usw.

Und das war es auch schon. Einfaches Prinzip, einfacher Code.

Ich hoffe das Hilft euch auch weiter… und mir beim nächsten mal auch wieder :)

Viele Grüße
Gordon

[PHP] Zeilenumbruch in PHP erzeugen

Hallo,

heute möchte ich mich mit dem Thema Zeilenumbruch in PHP beschäftigen. Ich denke der Artikel wird nicht sehr lang werden, denn das Thema ist ja mit einem kleinen Codeschnipsel getan :) Weiterlesen

[PHP] NextGEN Gallery – Sortierung der Galerien – Teil 2

Hallo,

ich hatte ja schon mal darüber geschrieben wie man die Bilder einer NextGen Galerie sortieren kann. Damals musste man sich noch durch den Code hangeln und ihn ändern… und beim nächsten Update war alles wieder futsch.

Jetzt habe ich vor ein paar Tagen eine elegantere Lösung gefunden. Die Galerie unterstützt nämlich die Zusammenarbeit mit benutzerdefinierten Feldern. Leider ist diese Information nicht einfach zu finden.

Aber um was geht es überhaupt genau?

Ich habe zum Beispiel meine Alben in den Galerien rückwärts Sortiert. Damit der Besucher immer oben die neusten Bilder sieht. Das macht Sinn, denke ich.
Nun erstellen wir einen Artikel und möchten dort auch ein Album einfügen. Weil man gerade etwas tolles Besucht hat und zig Fotos davon gemacht hat und man ein eigenes Album dafür angelegt hat.
Hier ist die Rückwärtssortierung jedoch Mist. Denn der Besucher soll ja in chronologischer Reihenfolge die Bilder sehen.

Leider kann man nicht für jedes Album die Reihenfolge einstellen. Also muss es anders gelöst werden. Und dafür gibt es eine Hilfe des Herstellers. Die benutzerdefinierten Felder.
Diese findet man unter dem eigentlichen Editor und sie heißen „Benutzerdefinierte Felder“… logisch :)

Dort trägt man Stück für Stück die Sachen ein die man braucht. Hier erst einmal eine Liste mit den möglichen Einstellmöglichkeiten.

Für das Erscheinungsbild der Nextgen-Gallery stehen folgende Befehle zur Verfügung.

Feldbezeichnung mögliche Werte
ngg_gal_ShowOrder gallery : Zeigt zuerst die Gallerie
slide : Zeigt zuerst die Slideshow
ngg_gal_Images 0-xxx : (Nummer) Anzahl von Bildern pro Seite
ngg_gal_Sort “pid” : Sortiert die Vorschaubilder nach ID
“filename” : Sortiert die Vorschaubilder nach Dateiname
“alttext” : Sortiert die Vorschaubilder nach dem ALT oder TITEL Text
ngg_gal_SortDirection “ASC” : Aufsteigende Sortierung
“DESC” : Absteigende Sortierung
ngg_gal_ShowSlide 0 : (Off) Kein Slideshow Link
1 : (On) Zeigt Slideshow Link
ngg_gal_ImgageBrowser 0 : (Off) Zeigt die Bilder direkt
1 : (On) Zeigt den Bildbrowser

Und für das Erscheinungsbild der Nextgen-Slideshow die folgenden:

ngg_ir_Audio “url”: (URL) Spielt eine Musikdatei
ngg_ir_Overstretch none : Behält Original-Dimensionen
fit : Bilder unverhältnismäßig vergrößern
true : Bilder verhältnismäßig vergrößern
ngg_ir_Transition Setzt den Übergangseffekt zwischen den Bildern:
fade, bgfade, blocks, bubbles, circles, flash, fluids, lines, random, slowfade
ngg_ir_Backcolor 0xHXHXHX : (z.B. 000FFF)
Hintergrundfarbe der Steuerung, im HEX Format.
ngg_ir_Frontcolor 0xHXHXHX : (z.B. 000FFF)
Text und Button Farbe der Steuerung, im HEX Format.
ngg_ir_Lightcolor 0xHXHXHX : (z.B. 000FFF)
Überlappende Farbe der Steuerung, im HEX Format.
ngg_ir_Width 0-xxx : (Zahl) Breite der Slideshow
ngg_ir_Height 0-xxx : (Zahl) Höhe der Slideshow
ngg_ir_Rotatetime 0-xxx : (Zahl) Zeit die ein Bild stehen bleibt
ngg_ir_Shuffle 0 : (Off) Anzeige der Bilder in Reihenfolge
1 : (On) Zufälliges Bild anzeigen
ngg_ir_ShowNavigation 0 : (Off) Navigation deaktivieren
1 : (On) Navigation aktivieren
ngg_ir_ShowWatermark 0 : (Off) Kein Wasserzeichen (Logo)
1 : (On) Wasserzeichen (Logo) wird angezeigt
ngg_ir_Kenburns 0 : (Off) Ken burns Effekt aktivieren
1 : (On) Ken burns Effekt deaktivieren

In unserem Fall würden wir nun das benutzerdefinierte Feld „ngg_gal_SortDirection“ mit dem Wert „ASC“ anlegen. Und schon wäre das Album in diesem Post aufsteigend sortiert.

Man könnte auch mehrere Befehle miteinander kombinieren (mehrere benutzerdefinierte Felder ausfüllen). So wie man es braucht.

Ich hoffe das konnte euch (und mir) helfen. :)

Viele Grüße
Gordon

[VB.NET] RegEx Sonderzeichen maskieren

Hallo,

heute mal wieder eine kleine Notiz für mich – und alle die es auch ab und zu brauchen :)

RegEx (Regular Expressions) sagt sicher vielen etwas, die Programmieren. Nun kommt es aber auch mal vor das in der RegEx-Anweisung Zeichen vorkommen die eigentlich als Steuerzeichen reserviert sind. Wie zum Beispiel:

$ ^ { [ ( | ) * + ?

Sieht unsere Anweisung jetzt so aus

pattern = "<a href="(.*?)<strong>?</strong>.*?">.*?</a>"

haben wir schon ein Problem. Den das zweite Fragezeichen ist kein Sonderzeichen, sondern soll wirklich ein Fragezeichen im String sein. RegEx würde es jetzt aber als Teil einer Anweisung interpretieren.
Wie teilen wir jetzt VB.NET mit das es sich beim 2. Fragezeichen um einen ganz normalen Charakter handelt?

Ganz einfach. Wir maskieren es mit einem Backslash ‚/‘. So sieht unser korrekter Pattern wie folgt aus:

pattern = "<a href="(.*?)<strong>/?</strong>.*?">.*?</a>"

Und schon wird das Fragezeichen auch als Fragezeichen interpretiert und nicht als Steuerungszeichen.  ;)

Ich hoffe das konnte dir ein wenig weiterhelfen.

Viele Grüße
Gordon

[PHP] Array sortieren

Hallo,

heute beschäftigen wir uns mal mit einem Array in PHP. Genauer gesagt mit der Frage wie man ein PHP Array sortieren kann.

Arrays sind Variablen in denen mehrere Werte gespeichert werden können. Das ist in vielerlei Hinsicht nützlich. Hat man zum Beispiel ein Array mit Zahlen, die wild in das Array eingegeben werden, und möchte dieses dann Sortiert ausgeben, so muss man es sortieren lassen. Oder auch Namen nach Alphabet sortieren, etc.

Dazu bietet PHP natürlich eine Funktion. Doch Moment. Erst einmal müssen wir wissen was für ein Array vorliegt. Ein einfaches oder ein Multidimensionales. Ein einfaches Array hat nur eine Ebene. Zum Beispiel:

 
$array[0] = "Max"; 
$array[1] = "Ernst"; 
$array[2] = "Sven"; 

… und so weiter.
Ein Multidimensionales Array besitzt mehrere Ebenen. Zum Beispiel:


$array[0]["Vorname"] = "Max"; 
$array[0]["Nachname"] = "Schlüter"; 
$array[1]["Vorname"] = "Ernst"; 
$array[1]["Nachname"] = "Mustermann"; 

Ein einfaches Array lässt sich mit einer Codezeile sortieren.

$array  = asort($array);
Für Aufsteigend und
$array  = asort($array);
Für Absteigende Sortierung.

Komplizierter wird es jetzt bei Multidimensionalen Arrays. Hier brauchen wir eine Hilfsfunktion.


function multisort($value_a, $ value _b) {
	$a = $value _a[1];
	$b = $value _b[1];
	if ($a == $b) {
		return 0;
	}
	return ($a < $b) ? -1 : +1;
}

usort($array, 'multisort');

Damit lässt sich dann auch ein Multidimensionales Array sortieren.

[PHP] Text richtig kürzen. Nach dem Wort, nicht mittendrin.

Hallo,

hier mal wieder ein Codeschnipsel den ich selbst des Öfteren brauche.

Ab und an muss man mit PHP ja mal einen Text kürzen. Zum Beispiel um eine kleine Vorschau des Textes in einer Kategorie anzuzeigen oder auf sonst einer Übersichtsseite.

Nun könnte man mit substr() den Text einfach nach der vorgegebenen Anzahl an Zeichen abschneiden und 3 Punkte dahinter setzen. Leider passiert dann in den meisten Fällen folgendes:

Hallo lieber Mann im Mo…

Der Text wird mitten im Wort abgeschnitten. Das sieht bescheiden aus. :( Und die Lösung ist so einfach. Die folgende Zeile schafft einfach Abhilfe. Hier wird der Text nur nach ganzen Wörtern abgeschnitten.

$string = Der Text der abgeschnitten werden soll.
$length = Nach wie vielen Zeichen soll der Text abgeschnitten werden.

$string = preg_replace("/[^ ]*$/", '', substr($string, 0, $length));

[PHP] Einfacher Cache für Webseiten mit PHP

Hallo zusammen,

heute möchte ich mal ein paar Denkanstöße zum Thema Webseite Cachen geben.

Frei übersetzt heißt „cache“: Zwischenspeicher. Und genau das ist es auch. Es wird etwas Zwischengespeichert um etwas schneller zu machen. In diesem Fall die Webseite.
Doch warum Zwischenspeichern? Was bringt das? Hierzu ein kleines Beispiel, welches ich die letzten Tage erfahren durfte.

Ich habe eine Webseite die sich automatisch Inhalte besorgt und in eine Datenbank schreibt. Dazu generiert es automatisch Keywords. Das hat auch alles immer gut geklappt, bis jetzt mein Server ständig in die Knie gegangen ist. Es hat nicht lange gedauert bis ich diese Webseite als den Übeltäter herausgefischt hatte. Dazu muss ich sagen das ich bei der Programmierung ein wenig geschlampt habe. Aber für unser Beispiel ist es optimal.

Also die Webseite ist eine Art Shop. Mit Kategorien und Artikeln. Über 70.000 Artikeln! Und bei jedem Aufruf durch einen Besucher wird die angeforderte Seite generiert. Die Daten werden aus der Datenbank abgefragt und in das Template eingefügt. Dazu gibt es noch Tag-Clouds und ähnliche Artikel. Das sind pro Seite enorme Belastungen für die Datenbank.

Doch schlussendlich sind die einzelnen Seiten immer gleich. Artikel A ist immer Artikel A und die Seite wird daher immer gleich bleiben. Nur die Tags in der Tag-Cloud ändern sich.
Also ist die beste Lösung ein Caching System. Denn mit einem Cache-System wird die Seite einmal generiert und in einem Cache abgelegt. Ruft der nächste Besucher die gleiche Seite noch einmal auf, dann wird die Seite nicht neu erzeugt, sondern aus dem Cache geladen. Das schon die Datenbank und steigert die Performance enorm.

Doch wie funktioniert solch ein Caching System? Eigentlich ganz einfach. Der logische Ablauf ist ja ganz einfach:

Seite muss ja beim ersten Aufruf definitiv generiert werden. Dabei wird der Inhalt im PHP-Cache gehalten und am Ende in eine (Cache)Datei geschrieben und auch ausgegeben. Wird die selbe Seite noch einmal aufgerufen, wird geprüft ob die Cache-Datei vorhanden ist. Wenn ja, dann die Cache-Datei laden und ausgeben. Wenn nicht dann ist es ein „erster Aufruf“.

Soweit die groben Gedanken. Jetzt etwas Detailierter.

Wie ordnen wir denn eine URL einer Datei zu?
Ich habe das mit einem SHA1-Hash gemacht. Damit kann ich eine URL in einen Hash verwandeln, den ich dann als Dateinamen benutze. Somit kann ich einfach prüfen ob eine URL schon gecached ist.

Wird meine Seite jetzt statisch?
Teilweise ja. Aber ein Cache sollte auch mal erneuert werden. Wie oft, das muss jeder individuell entscheiden. Ich Lösche zwischengespeicherte Seiten nach 6 Stunden in der Regel wieder. Warum? Weil sich immer mal etwas ändern kann.
Wie macht man das? Ganz einfach prüfen wann die Cache-Datei erstellt wurde. Wenn Datum länger her ist als 6 Stunden (z.B.) dann die Datei löschen und neu erstellen.

Was ist wenn ich in meiner Seite dynamische Elemente habe?
Ein Cache schaltet grundsätzlich erst einmal alle dynamischen Teile einer Seite aus, da die Seite statisch in eine Datei geschrieben wird. Deswegen muss der Cache auch ab und zu mal wieder gelöscht werden.
Gibt es nun aber Inhalte auf der Seite die bei jedem Aufruf geändert bzw. dynamisch sein sollen, so muss das System so angepasst werden, das dies möglich ist. Zum Beispiel kann man im Template einen Code einbauen, der jedes mal dann ersetzt wird. Wird die Zwischengespeicherte Seite nun ausgelesen so muss der Code vor der Ausgabe ersetzt werden. Das ist gar nicht so schwer wie es sich anhört ;)

Ich werde es am besten mal an ein wenig Code erklären :)

Am Anfang der PHP-Datei (am besten Auslagern oder eine zentrale PHP-Datei haben):

 //CACHING Function
// ===================================
define(CACHE_TIME, 43200);
$url = sha1($_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
if ((file_exists(ROOT_FOLDER.'cache/'.$url.'.pcae') == true) && (filemtime( ROOT_FOLDER.'cache/'.$url.'.pcae' ) >= ( mktime()-CACHE_TIME ))) {
        //load cache file
        $content = file_get_contents(ROOT_FOLDER.'cache/'.$url.'.pcae');
        include(ROOT_FOLDER.'/funktionen/funktionen/is_chached_functions.php');
        print_r($content);
        exit;
}
elseif ((file_exists(ROOT_FOLDER.'cache/'.$url.'.pcae') == true) && (filemtime( ROOT_FOLDER.'cache/'.$url.'.pcae') < ( mktime()-CACHE_TIME ))) {
        //old cache file, delete
        unlink(ROOT_FOLDER.'cache/'.$url.'.pcae');
}

ob_start();

 

Und am Ende der Datei (vor jeder Ausgabe):

 $content = ob_get_contents();
ob_end_clean();

if (file_exists(ROOT_FOLDER.'cache/'.$url.'.pcae') == true) {
        //delete old cache file
        unlink(ROOT_FOLDER.'cache/'.$url.'.pcae');
}
//Write new cache file
file_put_contents(ROOT_FOLDER.'cache/'.$url.'.pcae', $content);

//functions which shouldn't be cached!
include(ROOT_FOLDER.'/funktionen/funktionen/is_chached_functions.php');
print_r($content);
unset($content);
exit;

 

Gehen wir das noch einmal Zeile für Zeile durch. Fangen wir oben an.
Ich habe mir hier in CACHE_TIME die Zeit gespeichert, wie oft die Zwischengespeicherte Seite erneuert werden soll. Zeit in Sekunden.
Dann erstelle Ich den SHA1-Hash der aktuellen URL mit Parametern (Wichtig!).
Nun wird geprüft ob die Datei schon existiert und wie alt sie ist. ROOT_FOLDER ist mein Stammverzeichnis auf meinem Server.

Existiert die Datei schon und ist noch nicht veraltet, dann wird der Inhalt geladen. In meiner Datei „is_chached_functions.php“ sind Funktionen enthalten die dynamische Inhalte im Template ersetzen. Was ich vorhin kurz angesprochen hatte. Solch ein Inhalt kann im Template mit „<!– UHRZEIT –>“ vermerkt sein. In der Funktion würde nun stehen „$content = str_replace(„“<!– UHRZEIT –>“, date(„H:i:s“), $content);“. Damit hätten wir trotz Cache dynamisch die Uhrzeit in die Seite eingefügt.
Und letztendlich wird die Seite ausgegeben.

Existiert die Datei zwar, ist aber veraltet, dann wird sie einfach gelöscht und das Scipt läuft normal weiter und baut die Seite neu auf. Wichtig ist ob_start(). Damit wird angegeben das keine direkte Ausgabe erfolgt, sondern die Seite im PHP Speicher Zwischengespeichert wird.

Der untere Teil:

Hier schreiben wir nun den PHP Zwischenspeicher in die Variable $content und leeren ihn. Dann prüfen wir noch einmal ob die Datei evtl. existiert und löschen sie einfach, falls ja. (Kann ja mal passieren.)
Dann schreiben wir die erzeugte Seite aus $content in die Cache-Datei.
Nicht vergessen auch hier die dynamischen Inhalte zu ersetzen (in unserem Beispiel die Uhrzeit).
Dann noch die Seite ausgeben und fertig. Nun wurde eine neue Cache-Datei erzeugt, die dann beim nächsten Aufruf ausgegeben wird, anstatt die Seite komplett neu aufzubauen.

Der Server wird es danken ;) Der Hoster übrigens auch :) Und der Besucher auch :) Alle werden sich über mehr Performance, weniger Ressourcenverbrauch und schnellere Ladezeiten freuen ;)

Viele Grüße
Gordon

[WordPress] Kommentarlinks einfach mit external, (no)follow und target=_blank

Hallo,

heute mal wieder einen Tipp zu WordPress.

Es ist hart umstritten… Kommentarlinks mit external oder ohne, follow oder nofollow und welchen target soll der Link haben. Die einen sagen Hü, die anderen Hot. Egal, jeder soll machen wie er mag. Doch wie macht man wie man mag?

Eigentlich ganz einfach. Zumindest wenn man alle Kommentarlinks gleich haben will. Also zum Beispiel sollte rel=“external“ immer drin stehen, denn schließlich sind die Kommentarlinks external, es sei denn man selbst Kommentiert.

Dazu ruft man einfach seine „functions.php“ in einem Editor auf und fügt am Ende, vor „?>“ den folgenden Code ein. Natürlich dabei den Linkcode so bearbeiten wie man es mag.


    // Kommentarlinks in neuem Tab / Fenster
    function comment_author_link_window() {
	    global $comment;
	    $url = get_comment_author_url();
	    $author = get_comment_author();
	
	    if ( empty( $url ) || 'http://' == $url) {
	    	$return = $author;
    	}
    	elseif(stristr($url, get_home_url())) {
	    	$return = "".$author."";
    	} else {
	    	$return = "".$author."";
    	}
	    return $return;
    }
    add_filter('get_comment_author_link', 'comment_author_link_window');

Und schon werden alle Kommentarlinks mit den Attributen versehen die man haben möchte.

Ich persönlich habe alles gesperrt. Also rel=“external nofollow“ und auch target=_blank. Viele werden jetzt denken „Was für nen Arsch.“. Aber externe Links sind nunmal „external“. Bei den Kommentaren die ich hier bekomme weiß ich manchmal nicht mehr ob es nur zum Abgreifen eines Links ist oder nicht. Daher „nofollow“ und gut. Wer einen Kommentar schreibt, der tut es weil er etwas zu meinem Artikel beitragen möchte und nicht damit seine Seite besser rankt. Und external… ich mag meine Leser und möchte bitte auch das Sie auf meiner Seite bleiben! Finish :)