PHP & MySQL Engineering

TTF in GDF konvertieren

In letzter Zeit habe ich mich sehr viel mit der dynamischen Erstellung von Schritzügen mittels imageloadfont beschäftigt.

Das ist an sich kein Problem, nur arbeitet imageloadfont mit Schriften im GDF Format und das Angebot solcher Schriften im Internet ist leider sehr begrenzt. TTF-Schriften hingegen findet man im Internet an jeder Ecke und ausserdem auch im Windows-Ordner Windows\Fonts\.

Kompletten Artikel lesen »

 

Prozess mitsamt allen Unterprozessen beenden

Auf einem meiner Server hat vor kurzem ein Script verrückt gespielt, was zu einer sehr grossen Anzahl an Prozessen (mitsamt Unterprozessen) in der Warteschlange geführt hat. Um mir die Aufräumarbeiten etwas zu erleichtern, habe ich mir folgendes Script geschrieben.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/ksh
 
# Löscht einen Prozess mitsamt allen Unterprozessen
# Der PID eines Prozesses muss als erster Parameter angegeben werden
 
ppid=$1
 
if [ -z $ppid ] ; then
   echo "Usage: $0 PID"
   exit;
fi
 
 
function kill_process_recursive
{
        for i in `pgrep -P $1`
        do
                kill_process_recursive $i
        done
 
        echo $1
        #kill $1
}
 
kill_process_recursive $ppid
 
exit;

Beispiel :

1
2
3
4
5
6
7
claude@hades /home/claude # sh kill_process_tree.sh 32461
2364
2363
24324
24334
24323
32461

Im Beispielscript habe ich kill $1 kommentiert und durch echo $1 ersetzt.
Damit die Prozesse auch wirklich beendet werden, muss man diese Änderung natürlich umdrehen Icon Wink in Prozess mitsamt allen Unterprozessen beenden

 

Geschwindigkeit eines PHP Scripts messen

Zur Zeit arbeite ich an einem objekt-orientierten Framework und habe, in diesem Zuge, eine Vielzahl von interessanten Klassen programmiert. Eine kleine Auswahl dieser Klassen werde ich in nächster Zeit in meinem Blog vorstellen.

Der Anfang macht hierbei die Klasse timer, mit welcher man die Geschwindigkeit eines PHP Scriptes messen kann. Hier ein Beispiel welches die Funktionsweise der Klasse verdeutlichen soll:

1
2
3
4
5
6
7
8
$timer = new timer();
 
for ($i = 0; $i < 4; $i++)
{
	sleep (rand(2,3));
	echo "Vergangene Zeit seit der letzten Messung : ".$timer->measure_intermediate()." Sekunden <br />";
	echo "Insgesamt vergangene Zeit: ".$timer->measure_elapsed()." Sekunden<br /><br />";	
}

Kompletten Artikel lesen »

 

Selektives Kopieren von Tabellen

Ich habe vor einigen Tagen folgende Email eines Besuchers erhalten:

Ich möchte von db1 nach db2 ganz bestimmte einzelne Tabellen mit dem kompletten Inhalt kopieren und das per Cronjob zu bestimmten Zeiten. Dabei dürfen in db2 die bestimmten einzelnen Tabellen mit dem kompletten Inhalt überschrieben werden. [...] Dann wäre es toll wenn ich im Skript [...] auch die einzelnen Tabellen konfigurieren kann.

Hier ein Skript welches die beschriebene Aufgabe lösen sollte Icon Wink in Selektives Kopieren von Tabellen

Kompletten Artikel lesen »

 

Testsystem per Cronjob neu aufsetzen

Ich habe vor Ostern von einem meiner Leser folgende Frage erhalten:

Ich möchte ein CMS für Besucher als Testsystem anbieten. Dadurch wird dieses System aber immer von den Besuchern umkonfiguriert und hin und wieder unbrauchbar gemacht.

Bis jetzt habe ich immer einen Dump der Datenbank gemacht und von Hand täglich zurück geschrieben. Ebenso auch eine Kopie von den dazu gehörenden Template-Files. Könnte man dies nicht über ein Script automatisieren?

Ja, diesen Prozess kann man automatisieren, ich habe dieses Problem wie folgt gelöst:

1. Das Script

Über dieses Script werden sowohl die Dateien als auch die Datenbank des Testsystems gesichert und bei Bedarf wiederhergestellt. Ich habe das Script an meinem Blog getestet, die Benutzerdaten sowie die Ordner müsst Ihr natürlich an Eure eigene Umgebung anpassen. Weitere Erklärungen befinden sich unterhalb des Scriptes Icon Wink in Testsystem per Cronjob neu aufsetzen

Kompletten Artikel lesen »

 

MySQL - Datenbank Backup Script

In einem meiner vorigen Beiträge habe ich beschrieben, wie man MySQL-Datenbanken mit mysqldump kopieren kann.

In Verbindung mit einem Cronjob eignet sich mysqldump aber auch hervorragend dazu, Sicherheitskopien von Datenbanken anzulegen. Das folgende Bash Script nutze ich, um täglich ein Backup aller MySQL-Datenbanken eines Servers anzulegen…

Kompletten Artikel lesen »

 

MySQL - Benutzerrechte exportieren

Ich wollte heute Morgen die Benutzerrechte (Privileges) der MySQL-Benutzerkonten eines Servers exportieren, und war recht erstaunt darüber, zu diesem Thema weder einen Eintrag im MySQL-Handbuch, noch eine Beschreibung über Google finden zu können.

Ich habe mich also drangesetzt, und nach einiger Überlegung, folgendes Script geschrieben:

Kompletten Artikel lesen »

 

Cannot delete or update a parent row: a foreign key constraint fails

Beim Importieren von InnoDB-Datenbanken kann es unter Umständen zu folgendem Fehler kommen:

ERROR 1217 (23000) at line 243: Cannot delete or update a parent row: a foreign key constraint fails

Wie kommt es zu diesem Fehler?

Wenn man eine Datenbank mit mysqldump exportiert, wird eine Datei mit SQL - Befehlen erzeugt. Wenn man diese Datei anschliessend importiert, werden diese Befehle nacheinander ausgeführt und erzeugen eine Datenbank, die identisch zu der exportierten Version ist.

Bei InnoDB-Tabellen mit Fremdschlüssel-Beschränkungen wird es aber mit Sicherheit zu dem oben gennanten Fehler kommen. Dies liegt daran, dass die SQL-Befehle ohne logischen Zusammenhang ausgeführt werden.

Das MySQL Handbuch schreibt:

InnoDB weist jede INSERT- oder UPDATE-Operation zurück, die versucht, einen Fremdschlüsselwert in einer Kindtabelle anzulegen, wenn kein passender Schlüsselwert in der Elterntabelle vorhanden ist.

Da die SQL-Befehle, wie gesagt, ohne logischen Zusammenhang (der Reihe nach) abgearbeitet werden, kann es gut sein, dass die Kindtabelle vor der entsprechenden Elterntabelle importiert wird.

Wie umgeht man dieses Problem?

Kompletten Artikel lesen »

 

MySQL - Spalten nach Typ gruppieren

Ich habe mich heute mit einer etwas vernachlässigten Datenbank beschäftigt. Diese enthielt eine bunte Mischung von Spalten in den Formaten utf8_general_ci sowie latin1_swedish_ci.

Ziel der Aktion war es die Struktur erstmal zu analysieren und dann grundlegend zu überarbeiten.

Zuerst ging es also darum einen Überblick darüber zu erhalten, welche Spalten-Typen wie oft vorhanden waren. Zu diesem Zweck habe ich mir folgendes Script geschrieben:

Kompletten Artikel lesen »

 

MySQL - Datenbanken kopieren, duplizieren

In einem meiner vorigen Artikel habe ich beschrieben, wie man mit mysqldump MySQL - Datenbanken von Server zu Server kopieren kann.

Es kommt jedoch auch oft vor, dass man eine MySQL - Datenbank duplizieren, sprich eine Kopie auf dem gleichen Server erstellen möchte.

Dies kann zum Beispiel der Fall sein, wenn man eine Änderung und/oder ein Script testen -dazu aber nicht die Hauptdatenbank verwenden möchte. Es gibt leider keinen direkten Befehl um eine Datenbank zu duplizieren, daher muss man leider den Umweg über, zum Beispiel, ein PHP-Script gehen.

Hier stelle ich ein PHP-Script vor, welches es ermöglicht, eine Kopie einer MySQL - Datenbank zu erstellen…

Kompletten Artikel lesen »