Wie kann ich eine WordPress-Installation möglichst schnell und elegant umziehen?

Neben der „klassischen“ Methode (Dateien einzeln per FTP herunterladen, DB-Backup per PHPMyAdmin erstellen) gibt es auch noch den etwas eleganteren Umweg über die Kommandozeile.

Oftmals hat man jedoch in einfacheren Hostingpaketen keinen Zugriff per Telnet oder SSH. Allerdings lassen sich fast immer trotzdem Systembefehle absetzen.

Diesen Umstand kann man sich für eine schnelle Erstellung von Backups von Code und DB zu nutze machen.

Backup DB:
system("mysqldump --opt -Q -h DB-ALT-HOST -u DB-ALT-USER -p DB-ALT-NAME --password=\"DB-ALT-PASSWORT\" > ./dbdump.sql",$ret);

Backup Code:
system("tar -zcf ./backup.tar.gz ./*",$ret);

Anschließend werden die beiden erzeugten Dateien per (S)FTP heruntergeladen und auf den neuen Server hochgeladen.

DB einspielen:
system("mysql -h DB-NEU-HOST -u DB-NEU-USER --password=\"DB-NEU-PASSWORT\" DB-NEU-NAME < ./dbdump.sql");

Code entpacken:
system("tar -xvzf ./backup.tar.gz ",$ret);

Anschließend müssen in der Datei "wp-config.php" noch die neuen DB-Daten eingetragen werden.

Hinter den DB-Daten müssen dann noch die beiden Zeilen für die neue Domain eingetragen werden:
define('WP_SITEURL', 'http://www.neue-adresse.de');
define('WP_HOME', 'http://www.neue-adresse.de');

Weiterhin sollte noch folgende Zeile eigefügt werden:
define('RELOCATE', true);

Anschließend muss die Login-Seite aufgerufen werden:
http://www.neue-adresse.de/wp-login.php

Diese Zeile wird noch vor dem Ausfüllen des Login-Formulars wieder entfernt.

MYSQL Visualizer – Ein schlankes Tool, um Datenbankstrukturen zu visualisieren

Wer jemals versucht hat, eine fremde Datenbankstruktur zu verstehen – oder, noch schlimmer – ein altes Projekt revisionieren sollte, der kennt das Problem: Wie zum Teufel hängen diese verd… Tabellen zusammen?

Natürlich gibt es professionelle Lösungen, die wahlweise vieles können, aber nicht das, was man will, oder die ein Schweinegeld kosten.

Aber eigentlich will man doch nur kurz visualisieren, welche Tabellen es gibt und wie sie zusammenhängen.

Das kleine Tool MYSQL Visualizer tut genau das. Man kopiert es in ein Verzeichnis auf dem passenden Webspace, legt einen Verzeichnisschutz drauf und ruft es auf. Nach Eingabe der DB-Konnektivitätsdaten zieht das Tool die Daten der Tabellen und Felder und stellt diese grafisch dar.

Anschließend lassen sich unbedeutende Tabellen ausblenden, die vorhandenen Tabellen neu auf dem Workspace positionieren und zwischen den Felder Abhängigkeiten mittels Linien herstellen. Beim Verschieben der Tabellen auf dem Workspace werden selbstverständlich auch die Verknüpfungen aktualisiert.

Neue Tabellen und Felder lassen sich problemlos einlesen, ohne dass vorhandene Verknüpfungen verloren gehen.

In der aktuellen Beta-Version werden die Tabellenpositionen zwar noch nicht an geänderte Workspacegrößen angepasst, aber ansonsten läuft das Tool angenehm stabil und speichert alle Eingaben zuverlässig ab.

Mails per PHP von einer Synology Diskstation verschicken

mail() funktionert ja bekanntlich unter Synology DSM auf einer Diskstation nicht.

Relativ komfortabel kann man jedoch Mails mit dem PEAR-Mail-Paket via SMTP versenden.
Dazu sind folgende Schritte nötig:

  1. Über den Paketmanager PEAR installieren
  2. Per telnet oder ssh auf der Diskstation eine Konsole öffnen und abschicken
  3. Eine Mail per Mail verschicken:

WordPress per PHP direkt von wordpress.org als Zip-Datei auf Server herunterladen und entpacken

Um Prototypen für Kunden zu bauen oder auch für eigene Bastelprojekte muss ich immer mal wieder WordPress neu aufsetzen.

Bei vielen Hostern geht das heute auch als App oder Service relativ vollautomatisch, aber oftmals hat man dann nicht volle Schreibrechte in den WordPress-Verzeichnissen. Also installiere ich lieber selbst.

Da das Herunterladen auf den eigenen Rechner, das lokale Entpacken der Zip-Datei und der anschließende Upload der Daten relativ unspannend und zumindest im FTP-Transfer auch zeitaufwändig ist, lässt sich dieser Vorgang mit einem kleinen Skript weitestgehend automatisieren.

  1. aktuelle deutsche Version von WordPress als Zip-Datei mit cURL direkt auf den Server ziehen
  2. Zip-Datei entpacken
  3. Verzeichnisse und Dateien aus dem Unterordner „wordpress“ auf die aktuelle Verzeichnisebene verschieben
  4. WordPress-Installation anstoßen

Als Skript sieht das dann so aus:

Noch ein paar Worte zur Erläuterung:

  • Die Klasse ZipArchive sollte ab PHP 5.2 zur Verfügung stehen.
  • Das exec-Kommando kann bei anderen Hostern anders heißen, bspw. system etc.

 

Einfache Suchmuster mit RegExp für width und height

In älteren HTML-Dateien findet man gern noch fixe Angaben zu Höhen (height) und Breiten (width).

Um diese mit einem RegExp-fähigen Editor (bspw. Notepad++) zu suchen und ggfls. zu löschen oder zu ändern, helfen diese Suchbegriffe:

height=\"[0-9/. \-]*\"
width=\"[0-9/. \-]*\"
style=\"width\:[0-9/. \-]*px\;\"
style=\"height\:[0-9/. \-]*px\;\"

Pear Mail_Mime und das Encoding der Empfängeradresse (to) mit Umlauten – natürlich auch für weitere Header-Parameter

Gleichwohl man annehmen könnte, dass das Encoding von Umlauten heutzutage – zumindest, sofern man UTF-8 benutzt – selbstverständlich sein sollte, stößt man immer wieder mal Probleme.

Aktuell hatte ich ein kleines Skript, dass per PHP über Mail-Mime Multipart-Mails verschickt. Alles lief rund vier Wochen glatt, bis auf einmal eine Mail partout nicht rausgehen wollte. Stattdessen hat mir der Server freundlicher Weise einen 500er geworfen.

Wie sich nach eingehender Recherche herausstellte, lag es an der Empfängeradresse, welche ich in der Form „Vorname Nachname <email@domain.tld>“ übergab. Der Nachname enthielt nun leider ein ß. Soll ja vorkommen…

Google hin, google her, das Problem war zwar erkannt, wollte sich aber gar nicht so einfach lösen lassen. Ein Encoding über imap_8bit() brachte nicht den erwünschten Erfolg.

Im Endeffekt tat es dann folgende kleine Funktion:
function mb_mime_header($string, $encoding=null, $linefeed="\r\n") {
if(!$encoding) $encoding = mb_internal_encoding();
$encoded = '';
while($length = mb_strlen($string)) {
$encoded .= "=?$encoding?B?"
. base64_encode(mb_substr($string,0,24,$encoding))
. "?=$linefeed";
$string = mb_substr($string,24,$length,$encoding);
}
return $encoded;
}

welche ich folgendermaßen nutze

$to=mb_mime_header("Name der Empfängers","UTF-8")." <email@domain.tld>";

Wie kann ich in Corel Draw die Werkseinstellungen insbesondere auch das Monitorprofil zurücksetzen

Corel Draw zeigt gelegentlich Farben flasch an. Insbesondere erscheint das Weiß viel zu gelblich. Schuld daran scheint ein falsches Monitorprofil zu sein, welches sich aber einzeln nicht löschen lässen.

Die Lösung ist relativ simpel: Corel Draw schließen und neu starten und wenn der Splashscreen erscheint, die F8-Taste gedrückt halten, bis die Frage nach der Rückstellung auf die Werkseinstellungen aufpoppt.

Aber Achtung: Alle sonstigen Einstellungen an der Arbeitsumgebung gehen dabei ebenfalls verloren.

Dieser Tipp sollte mindestens bis Version X5 funktionieren.

Ein PHP-Skript unter Synology DSM per Cronjob regelmäßig ausführen lassen

In aller Kürze:

  1. Auf der Diskstation den SSH-Dienst aktivieren:
    Systemsteuerung => Terminal & SNMP => Häkchen bei „SSH-Dienst aktivieren“ setzen => „Übernehmen“ klicken
  2. Per Putty oder anderem SSH-Cilent mit der Diskstation verbinden:
    Host: diskstation (oder welchen Namen Ihr vergeben habt oder die IP-Adresse)
    User: root
    Password: Das Admin-Password
  3. Crontab bearbeiten:
    cd /etc[RETURN]
    vi crontab[RETURN]
    mit den Cursortasten an das Ende der untersten Zeile gehen
    [i] drücken, um in den Editiermodus zu gelangen
    Daten eintragen, bspw.
    0 6 * * * root curl http://127.0.0.1/ein_verzeichnis/eine_php_datei.php
    für das tägliche Aufrufen des Sripts morgens um 6 Uhr
    Die einzelnen Werte müssen mit Tabstopps getrennt werden!
    [ESC] drücken, um den Editiermodus zu verlassen
    [:][w][q] drücken, um die crontab zu speichern und den vi zu verlassen
  4. Cron neu starten:
    restart crond[RETURN]
    exit[RETURN]

Update ab DSM 6.0

Synology lässt nunmehr keinen Login auf das root-Konto zu. Stattdessen muss man sich als admin einloggen und dann vor das vi crontab[RETURN] noch ein sudo setzen. Komplett lautet der Aufruf dann
sudo vi crontab[RETURN]

Google Chrome lädt Seiten nicht oder nur unvollständig und zeigt Net::ERR_INCOMPLETE_CHUNKED_ENCODING oder net::ERR_CONTENT_LENGTH_MISMATCH in der Console an

Wenn Eure PHP-Skripte unter Google Chrome nur unvollständige oder auch gar keine Ausgaben erzeugen, liegt dies mittlerweile immer häufiger an den diversen Echtzeitschutzmodulen der Anti-Viren-Softwarepakete.

Diese scheinen erhebliche Probleme zu haben, wenn im Header keine oder eine falsche Content-Length übertragen wird. Sobald man den Echtzeitschutz temporär ausschaltet, tritt das Problem nicht mehr auf.

Dieses Problem tritt – allerdings ohne brauchbare Fehlermeldung – auch in Firefox auf.

Insbesondere wenn Inhalte dynamisch erzeugt werden und Teile bspw. per Include nachgeladen werden, ist jedoch die Content-Length vorher nicht bekannt.

Abhilfe ist relativ einfach, indem  die Ausgabepufferung aktiviert wird.

Startet ggfls. nach dem öffnenden PHP-Tag noch Eure Session und aktiviert dann die Ausgabepufferung mit ob_start(). Am Ende Eures Skripts gebt Ihr dann durch header(„Content-Length: „.ob_get_length()); die korrekte Content-Length an und gebt den Ausgabepuffer mit ob_flush(); aus.

PHP-Skript bricht ohne Fehlermeldungen ab

Ich habe kürzlich im Rahmen eines Projektes ein Skript gebaut, welches ein dynamisches HTML-Formular erzeugt. Das Formular besteht aus ca. 15.000 Zeichen und wird je nach gesetzten Werten erneut über Ajax nachgeladen.

Leider funktionierte das Nachladen nur sporadisch und ohne erkennbares Muster. Die Logfiles wiesen auf keinerlei Fehler hin und auch der Support des Hosters für das Projekt hatte keine rechte Idee, woran es liegen könnte.

Meinem Kunden kann ich aber schlecht erklären, dass seine Anwendung nur gelegentlich funktionert.

Firebug zeigte über die Konsole zwar brav, dass das Skript über Ajax aufgerufen wurde, jedoch war die Übertragung in 4 von 5 Fällen unvollständig, obwohl ein HTTP-Return-Code 200 zurückgegeben wurde. Mit 0.9 Sekunden Laufzeit war auch das Überschreiten etwaiger maximaler Skriptlaufzeiten unwahrscheinlich.

Vorsichtshalber habe ich auch den Speicherbedarf während der Verarbeitung des Skripts mitgeloggt und bei ca. 16 MB Speicherbedarf gabe es auch keine Probleme.

Schließlich habe ich mir über „Live HTTP headers“ die übertragenen Werte des Headers angeschaut und siehe da, für „Content-Length“ wurde nur der Wert 32 übertragen.

Also habe ich vor der Ausgabe des Wertes den entsprechenden Header mit

die korrekte Länge des Contents übergeben und siehe da, die Übertragung funktioniert reibungslos.

© 2016 StableWeb / CMS-EDV

Theme von Anders Norén↑ ↑