Seite 3 von 4

PHP-Codeschnipsel, die man immer mal wieder braucht

Datumsumwandlung ziwschen MySQL- und deutschem Format

MySQL nach deutsch

Deutsch nach MySQL

Wie kann ich Typo3 6.2 auf einen neuen Server umziehen?

In aller Kürze:

  • DB-Dump auf altem Server erstellen
  • DB-Dump auf neuem Server einspielen
  • Code-Backup auf altem Server stellen
  • Code-Backup auf neuem Server einspielen
  • DB-Konfiguration in /typo3conf/LocalConfiguration.php anpassen
  • Leere Datei “ENABLE_INSTALL_TOOL” in /typo3conf anlegen

Möglicherweise sind die benötigten Symlinks beim Übertragen den Codes verloren gegangen. Die lassen sich durch
ln -s ./typo3_src-6 typo3_src
ln -s typo3_src/typo3 typo3
ln -s typo3_src/index.php index.php

wieder herstellen. Ggfls. ist noch der _ vor .htaccess zu entfernen.

  • das Installtool (http://www.example.com/typo3/install/) aufrufen
  • Cache leeren und prüfen, ob es sonst noch Probleme gibt und diese ggfls. beheben
  • Fenster mit Installtool schließen
  • Leere Datei “ENABLE_INSTALL_TOOL” in /typo3conf löschen
  • Ggfls. Typo3-Backend (http://www.example.com/typo3/) aufrufen und baseURL anpassen
  • Falls nur die Startseite und keine Unterseiten erreichbar sind, die .htaccess aus /typo3_src/ ins Doc-Root-Verzeichnis verschieben

Wie kann ich ein Python-Skript bspw. bei Domain Factory zur Ausgabe von Daten im Browser bewegen?

Während PHP-Skripte ohne Ausgabe von Headern, HTML-Gerüst oder sonstigen Tamm auskommen, verhält sich der Apache offensichtlich bei Python-Skripten etwas zickiger.

Ein Minimal-Skript, wie

läuft zwar wunderbar in der Shell, erzeugt aber, wenn es über die entsprechende URL aufgerufen wird, möglicher Weise einen Fehler 500.

Der Apache weiß also offensichtlich nicht, was er mit der Ausgabe machen soll und wie er sie behandeln soll.

Die Lösung ist relativ simpel:

sorgt dafür, dass auch der Aufruf im Browser klappt.

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.

Im Dashboard dann ein Plugin, z.B. “Better Search and Replace”, installieren und die alten URLs in der Datenbank durch die neuen URLs ersetzen.

WordPress zeigt nach dem Umzug keine Stylesheets oder Bilder an oder beim Versuch auf wp-admin zuzugreifen wirft der Server einen Fehler 403

Insbesondere beim Umzug zu einem neuen Hoster kann es vorkommen, dass beim Kopieren oder Entpacken der Dateien die Verzeichnisrechte nicht korrekt übernommen werden.

Dieses Problem lässt sich relativ leicht beheben, indem in einem FTP-Programm alle Verzeichnisse (rekursiv!) die Rechte 755 und alle Dateien die Rechte 644 zugewiesen bekommen.

Sollte man Zugriff auf die Serverkonsole, bspw. per SSH, haben, kann das Problem deutlich schneller gelöst werden, indem im WP-Stammverzeichnis folgende Befehle ausgeführt werden:
find ./ -type d -exec chmod 755 {} +
find ./ -type f -exec chmod 644 {} +

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:

Update für DSM6

Der PEAR-Pfad muss an zwei Stellen ergänzt werden:

1. Hauptmenü => WebStation => PHP-Einstellungen => Häkchen bei „PHP open_basedir benutzerspezifisch anpassen“ setzen und bei „open_basedir:“ am Ende :/volume1/@appstore/PEAR/ ergänzen

2. auf „Erweiterte Einstellungen“ klicken => Reiter „Kern“ anklicken => den Wert für „include_path“ auf „.:/volume1/@appstore/PEAR/“ anpassen und „OK“ klicken

Ggfls. muss der Webserver noch per SSH neu gestartet werden:
sudo synoservice --restart pkgctl-WebStation

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]


Update ab DSM 7.0

Um crond neu zu starten:
sudo systemctl restart crond[RETURN]
und
sudo systemctl restart synoscheduler[RETURN]