MySQL Dump importieren aus Datei über die Konsole

Auch etwas, was man häufiger mal benötigt. Hier der Befehl:

mysql -u [USERNAME] -p -h [HOST] [DATABASE] < [FILENAME]

[USERNAME] Benutzername des DB-Users
[HOST] IP oder Hostname des DB-Servers (z.B. localhost)
[DATABASE] Name der Datenbank, in die der Dump eingelesen werden soll
[FILENAME] Name der Datei, die importiert werden soll

Beispiel:

mysql -u root -p -h localhost meinedatenbank < dump.sql

Weiterlesen

tar.gz entpacken unter Linux

Vergisst du auch immer die Parameter, die man zum Entpacken einer tar.gz Datei unter Linux benötigt?

tar xfvz [ARCHIV].tar.gz

Bedeutung der Parameter

x extract Dateien aus einem Archiv extrahieren
v verbose bearbeitete Dateien ausführlich listen
f file Archivdatei oder Gerät ARCHIV benutzen
z gzip Archiv durch gzip filtern

Weiterlesen

Chitika AdChoices – eine AdSense Alternative?

Viele Webmaster suchen nach Alternativen zu Google Adsense. Das kann mehrere Gründe haben: Man wurde gesperrt oder nicht zugelassen, die Einnahmen sind stark rückläufig (ich kenne auch noch Zeiten, da hatte sich das gelohnt).

Als AdSense Alternative wird sehr häufig Contaxe genannt. Die Qualität der Werbung bei Contaxe lässt aber arg zu wünschen übrig. Ich habe das über die API einbinden wollen und bekomme bei einem Suchbegriff wie Pizza Ergebnisse für Kredite. Das klickt kein Mensch an…

Mein Tipp: Chitika AdChoices

Ich selbst verwende es auf open-search.eu für die Bing-Suche. Damit verdiene ich mehr, als mit AdSense.

In meinen Augen ist das die einzige wirkliche Alternative zu AdSense

Weiterlesen

Tutorial: Anzeige des Upload-Status mit Ajax und PHP (PECL :: uploadprogress)

Lange Zeit galt es als unmöglich, den Status eines Uploads nur mit Hilfe von PHP zu ermitteln. Die PECL Erweiterung uploadprogress ermöglicht diese heiß ersehnte Möglichkeit.

Leider ist es ziemlich schwierig, eine Dokumentation zu finden. Daher möchte ich euch hier kurz erklären, wie man diese Erweiterung nutzen kann. Das Ergebnis sieht dann in etwa so aus:

Screenshot Upload Progress

Installation

Das Kernstück ist natürlich die Erweiterung. Diese kannst du unter http://pecl.php.net/package/uploadprogress herunterladen. Wenn du auf einem Linux-Server php5-dev installiert hast, kannst du die Erweiterung einfach mit folgendem Befehl installieren:

pecl install uploadprogress

Anschließend muss die Erweiterung noch in der php.ini aktiviert werden:

extension=uploadprogress.so

Falls du Windoofs nutzt oder Probleme bei der Installation hast, findest du unter http://freestylesystems.co.uk/blog/installng-pecl-uploadprogress-extension-drupal-filefield-module eine gute Installations-Anleitung.

Upload-Formular

Um die Datei identifizieren zu können, die gerade hochgeladen wird, muss diese eine ID bekommen. Diese wird in einem Hidden-Feld mit dem namen “UPLOAD_IDENTIFIER” definiert. Dieses Hiddenfeld muss zwingend vor dem Upload-Feld kommen, sonst kann nicht darauf zugegriffen werden.

Außerdem benötigen wir ein leeres DIV, wo wir später die Progressbar einbinden.

<form enctype="multipart/form-data" action="" method="post">
    <input type="hidden" name="UPLOAD_IDENTIFIER" id="UPLOAD_IDENTIFIER" value="<?php echo $id; ?>" />
    Select file: <input name="thefile" type="file">
    <input type="submit" value="upload" onclick="setTimeout('updateProgress()', 1000);">
</form>

<div id="progress">
    <b>Dateiupload:</b> <span id="uploadFileName"></span><br />
    <div id='progressbarWrapper'>
        <div id='progressbar' style='width:0%;'> </div>
        <div id='progressbarInfo'>
            <span id="uploadedBytes"></span> / <span id="uploadTotalBytes"></span> <span id="uploadUnit"></span> (<span id="uploadPercent"></span> %)
        </div>
    </div>
    <b>Geschwindigkeit:</b> <span id="uploadSpeed"></span> kB/s<br />
    <b>Geschätzte Dauer:  Sekunden
</div>

Ermittlung des Fortschritts

Der Upload-Status wird durch ein kleines PHP-Script ermittelt. Diesem Script wird die ID des Uploads übermittelt. Mit Hilfe dieser ID kann man mit der Funktion uploadprogress_get_info($id) alle wichtigen Informationen zum laufenden Upload ermitteln. Rückgabewert ist ein Assoziatives Array mit Dateinamen, Gesamtgröße der Datei, bereits hochgeladene Menge, geschätzte Dauer und Durchschnittsgeschwindigkeit.

<?php

header("Content-Type: application/x-json");

$id = $_GET["id"];
$info = uploadprogress_get_info($id);

if (!$info) die("{}");

$name = $info["filename"];
$speed = number_format(($info["speed_average"] / 1024), 1, ",", ".");
$percent = intval(100 * $info["bytes_uploaded"] / $info["bytes_total"]);
$time_left = $info["est_sec"];
$total = $info["bytes_total"];
$uploaded = $info["bytes_uploaded"];

if ($total >= (1024*1024)) {
	$unit = "MB";
	$total = $total / (1024*1024);
	$uploaded = $uploaded / (1024*1024);
} else {
	$unit = "kB";
	$total = $total / 1024;
	$uploaded = $uploaded / 1024;
}

$uploaded = number_format($uploaded, 1, ",", ".");
$total = number_format($total, 1, ",", ".");

echo '{"file":"'.$name.'","percent":'.$percent.',"uploaded":"'.$uploaded.'","total":"'.$total.'","unit":"'.$unit.'","speed":"'.$speed.'","left":"'.$time_left.'"}';
?>

Start der Statusermittlung durch ein Ajax-Request

Die Ermittlung des Upload-Fortschritts wird beim Start des Uploads (etwas zeitverzögert) durch ein Ajax-Request gestartet. Dazu erweitern wir den Absendebutton um den Event-Handler:

<input type="submit" value="senden" onclick="setTimeout("updateProgress()", 1000);">

Mein dazugehöriges Javascript sieht so aus:

<script type="text/javascript">
var xmlHttp = null;
var work = 0;
var stamp;
if (window.ActiveXObject)  {
        try {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
        } catch(e) {
                try {
                        xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
                } catch (e) {
                }
        }
} else if (window.XMLHttpRequest) {
        try {
                xmlHttp = new XMLHttpRequest();
        } catch (e) {
        }
}

var uploadID = '';


function $(obj) {
	return document.getElementById(obj);
}

function updateProgress() {
	stamp = new Date() * getRandom();
	if (work == 0) {
		work = 1;
		xmlHttp.open('GET', './ajax.php?id=' + uploadID + "&" + stamp, true);
		xmlHttp.onreadystatechange = reloadProgress;
		xmlHttp.send(null);
	} else setTimeout("updateProgress()", 100);
}

function reloadProgress() {
	if (xmlHttp.readyState==4) {
		work = 0;
		text = xmlHttp.responseText;
		var upload = eval("("+text+")");
		if (upload["percent"] < 100) {
			$('progress').style.display="block";
			$('progressbar').style.width = upload["percent"] + "%";
			$('uploadFileName').innerHTML = upload["file"];
			$('uploadedBytes').innerHTML = upload["uploaded"];
			$('uploadTotalBytes').innerHTML = upload["total"];
			$('uploadUnit').innerHTML = upload["unit"];
			$('uploadPercent').innerHTML = upload["percent"];
			$('uploadSpeed').innerHTML = upload["speed"];
			$('uploadTimeLeft').innerHTML = upload["left"];

			setTimeout("updateProgress()", 1000);
		} else $('progress').style.display="none";
	}
}

function getRandom() {
        return parseInt(Math.random()*1000000)+1;
}

</script>

Download

Ein funktionierendes Beispiel gibt es natürlich auch zum Download. Du kannst dieses Beispiel und die darin enthaltenen Grafiken (von mir erstellt) gern verwenden. Natürlich wäre ich dir im Gegenzug für eine Verlinkung auf diesen Beitrag dankbar 😉

progress.zip (5,1 kB)
progress.tar.gz (4,4 kB)

Weiterlesen

Windoof – Spaß mit M$

Screenshot Windoof.orgAuftraggeber: Ich selbst 😉
Web: www.windoof.org

Weitere Mitarbeiter:
– Julian Tekook – Javascript (julian.tekook.de)
– Alex Rath – Design und Grafiken (www.allrath.tk)
– Felix Hirt – PHP (fpgames.de)


Besonderheiten:
Nachdem mir mal wieder mitten in der Arbeit mein Windoofs abgestürzt ist, habe ich aus lauter Frust eine kleine Windows-Satire erstellt. Diese Seite existiert nun mittlerweile seit dem Jahr 2000 und erfreut sich großer Besucherzahlen.
Der Aufbau der Seite sollte jedem Windows-User vertraut vorkommen, denn die Seite ist sowohl vom Aussehen, als auch vom Handling aufgebaut wie der Windows-Desktop.
Immer wieder wurde die Seite um Funktionen erweitert und vom Layout an die aktuelle Windows-Version angepasst. Zu den Features gehören ein Blog, in dem jeder Besucher selbst seine kuriosen Fehlermeldungen veröffentlichen kann, ein Twitter-Client, ein Webbrowser, das beliebte Spiel Solitaire, ein Programm zum Pizza bestellen und viele weitere kleine Gimmicks.

Verwendete Techniken
– HTML / CSS
– JavaScript
– PHP
– Ajax
– Drupal als CMS
– PrototypeUI als FensterManager

Weiterlesen

Ferienwohnung am Schloss Rochlitz

Ferienwohnung am Schloss RochlitzAuftraggeber: Familie Lissek
Web: www.ferienwohnung-am-schloss-rochlitz.de

Aufgaben:
– Erstellung des Layouts
– Umsetzung HTML / CSS
– PHP für etwas Dynamik der Seite
– Suchmaschinenoptimierung



Besonderheiten:
Mitten im Herzen von Sachsen gelegen bietet die Ferienwohnung der Familie Lissek ein gehobenes Ambiente zum moderaten Preis. Mit der Maßgabe, dass sich der Gast im Urlaub mindestens so wohl fühlen soll, wie zu Hause, wurde das Feriendomizil detailverliebt eingerichtet.
Eine moderne Einbauküche mit Geschirrspüler, Kühlschrank und Ceran-Kochfeld gehören ebenso zur Ausstattung, wie ein 100cm Plasma-TV und ein Grundstück mit Grillplatz. So bleiben im Urlaub keine Wünsche offen.

Weiterlesen

Tutorial: Datenbank gestütze Vhosts mit Variablen mit Hilfe von mod_perl

Wer einen Webserver mit mehreren Domains betreibt, kennt das Problem:
Wie kann ich mir die Verwaltung der vielen Vhosts vereinfachen? Die einzelnen Config-Dateien beinhalten bis auf kleine Abweichungen (Domainname, Verzeichnis) alle die selben Inhalte. Und was ist, wenn man eine Einstellung ändern will? Alle Config-Dateien ändern?
Genau darauf hatte ich auch keine Lust mehr. Deshalb habe ich mich nach Möglichkeiten umgeschaut, wie man die Config-Dateien mit Variablen bestücken kann. Meine Lösung will ich euch natürlich nicht vorenthalten.

Vorbereitung

Meine Lösung basiert auf mod_perl 2.0. Dies sollte also zuerst auf dem Server installiert werden.
Unter Debian geht das ganz einfach:

sudo apt-get install libapache2-mod-perl2

Wer kein Debian-Server hat, kann sich mod_perl unter http://perl.apache.org/download/index.html downloaden.

Datenbank

Die wenigen Daten, in denen sich die Vhosts unterscheiden, werden in einer MySQL-Datenbank gespeichert. Legt euch dazu einfach folgende Tabelle in einer existierenden Datenbank an:

CREATE TABLE `apacheconfig` (
  `ID` int(11) NOT NULL auto_increment,
  `servername` varchar(100) NOT NULL,
  `alias` varchar(1000) NOT NULL,
  `dir` varchar(100) NOT NULL,
  PRIMARY KEY  (`ID`)
);

Abschließend sollten noch ein paar Testeinträge gemacht werden, damit das am Ende auch getestet werden kann.

Inhalt der Datei “/etc/apache2/sites-available/template”

Die Installation von mod_perl ermöglicht das Einbinden von Perl-Code in die Config-Dateien. Dies nutzen wir, um ein Template mit Variablen zu erstellen. In meinem Beispiel sieht das so aus:

<VirtualHost *:80>
	<Perl>
		$ServerName = $My::servername;
		$ServerAlias = $My::alias;
		$Redirect = "/ http://www.".$My::servername."/";
	</Perl>
</VirtualHost>

<VirtualHost *:80>
	<Perl>
		$ServerName = "www.".$My::servername;
		$DocumentRoot = "/home/".$My::dir."/htdocs";

		$Directory {"/home/".$My::dir."/htdocs/"} = {
			AllowOverride => "All",
			Order => "allow,deny",
			allow => "from all",
			Require => "all granted"
		};
	</Perl>

 	ServerAdmin webmaster@localhost

        <Directory />
        	Options FollowSymLinks
		AllowOverride None
	</Directory>

	Alias /phpmyadmin/ "/usr/share/phpmyadmin/"
	ErrorLog /var/log/apache2/error.log

	# Possible values include: debug, info, notice, warn, error, crit,
	# alert, emerg.
	LogLevel warn
</VirtualHost>

Inhalt der Datei “/etc/apache2/sites-available/vhost.conf”

Die vhost.conf ist das Herzstück der neuen Konfiguration. Hier werden alle Informationen aus der Datenbank geholt und mit Hilfe des Templates zusammengesetzt:

<Perl>
use DBI;
use Apache2::ServerUtil ();

# Die Daten in den folgenden 3 Zeilen bitte anpassen (DB_Name, DB_User, DB_Pass)
my $dsn = "dbi:mysql:DB_Name@localhost";
my $user = "DB_User";
my $pw = "DB_Pass";

my $s = Apache2::ServerUtil->server;

my $db = DBI->connect($dsn, $user, $pw) or die $DBI::errstr;

my $select = qq/SELECT * FROM apacheconfig ORDER BY ID/;
my $sth_select = $db->prepare($select);

$sth_select->execute() or die $DBI::errstr;
my @row;

while( @row = $sth_select->fetchrow_array ) {
	$My::servername = @row[1];
	$My::alias = @row[2];
	$My::dir = @row[3];
	$s->add_config(["Include /etc/apache2/sites-available/template"]);
}

</Perl>

Los geht’s…

Nun, da alles vorbereitet ist, wird die vhost.conf aktiviert:

a2ensite vhost.conf

Wichtig: nur die vhost.conf aktivieren, auf keinen Fall das Template.
Nachdem das erledigt ist, testen wir nochmal:

apache2ctl configtest

Der Server sollte mit “Syntax OK” antworten. Wenn das der Fall ist, dann kann der Server mit

apache2ctl restart

neu gestartet werden.

Häufige Probleme

Es kann passieren, dass nur der erste Eintrag akzeptiert wird. In dem Fall legt noch eine Datei _default.conf an mit folgendem Inhalt:

NameVirtualHost *:80

Aktiviert diese mit

a2ensite _default.conf

Und startet den Server neu:

apache2ctl restart

Weiterlesen