HTTP-Requests mit PHP loggen

Dienstag, April 3, 2012 13:17
Veröffentlicht in der Kategorie Netzwerke, PHP von Markus

Ich musste grade zu Logging-Zwecken alle eingehenden HTTP Requests loggen. Dabei brauchte ich vor allem die Header des Requests inkl. des Body, wenn es ein POST Request ist.

Also kurz folgenden Schnipsel verfasst und das Logging konnte beginnen :-)

<?php

$headers = apache_request_headers();

$header = $_SERVER['REQUEST_METHOD'] . ' ' . $_SERVER['REQUEST_URI'] . " HTTP/1.1\n";
foreach($headers as $name => $value)
        $header .= "{$name}: {$value}\n";

if($_SERVER['REQUEST_METHOD'] == 'POST')
{
        $header .= "\n" . http_build_query($_POST);
}

$log = $_SERVER['REMOTE_ADDR'] . ' - - ' . date('[d/M/y:H:i:s O]') . "\n-\n" . $header . "\n==========================================================\n";

$handle = fopen(__DIR__ . '/access_log', 'a');
fwrite($handle, $log);
fclose($handle);

Dieser Schnipsel funktioniert aktuell nur, wenn man den Apache verwendet.

Sortieralgorithmen in PHP

Montag, Mai 2, 2011 21:35
Veröffentlicht in der Kategorie Algorithmen, PHP, Softwareentwicklung von Markus

Sortieralgorithmen werden in der Programmierung häufig benötigt, von daher kann ein wenig Kentniss über die gängisten Sortieralgorithmen nicht schaden. Man benötigt zwar häufig gar keine Sortieralgorithmen selber programmieren, weil die verwendete Programmiersprache oder Datenbank einem die Arbeit abnimmt, kann sie aber hin und wieder doch benötigen.

PHP und MySQL verwenden von Haus aus den Quick-Sort Algorithmus, da er eine sehr kurze Laufzeit hat und auch einer der effektivsten Algorithmen ist.

In PHP kann man z.B. durch ein einfaches sort($array) seinen Array sortieren lassen. PHP übernimmt dann im Hintergrund die Sortierarbeit mit dem Quick-Sort-Algorithmus. In MySQL kann man seine Daten über ORDER BY sortieren lassen, die dann ebenfalls automatisch von MySQL sortiert werden.
Wenn man aber nun selber komplexere Dinge sortieren möchte, z.B. Objekte nach bestimmten Kriterien, muss man selber einen Sortier-Algorithmus entwickeln, der die Arbeit übernimmt.

Um einen Überblick über die gängigsten Sortieralgorithmen zu erhalten, habe ich diese vier Algorithmen einmal in PHP übersetzt: Selection Sort, Insert Sort, Bubble Sort, Quick Sort

Über die Laufzeit und alles weitere kann man sich dann bei Wikipedia informieren, das möchte ich gerade nicht zusammenfassen :-)
Ich möchte nur kurz sagen, dass Selection, Insert und Bubble Sort bei einer größeren Anzahl Elemente schnell eine lange Rechenzeit benötigen und man daher überlegen sollte, ob der Quick Sort nicht sinnvoller ist.

<?php

function selectionSort(array $zahlen)
{
	for($i = 0; $i < count($zahlen); $i++)
	{
		$min = $i;
		for($j = $i; $j < count($zahlen); $j++)
		{
			if($zahlen[$j] < $zahlen[$min])
			{
				$min = $j;
			}
		}

		$tmp = $zahlen[$min];
		$zahlen[$min] = $zahlen[$i];
		$zahlen[$i] = $tmp;
	}

	return $zahlen;
}

function insertSort(array $zahlen)
{
	for($i = 1; $i < count($zahlen); $i++)
	{
		$tmp = $zahlen[$i];
		$j = $i;
		while($j > 0 AND $zahlen[$j-1] > $tmp)
		{
			$zahlen[$j] = $zahlen[$j - 1];
			$j--;
		}
		$zahlen[$j] = $tmp;
	}

	return $zahlen;
}

function bubbleSort(array $zahlen)
{
	for($i = 0; $i < count($zahlen); $i++)
	{
		for($j = 1; $j < count($zahlen) - $i; $j++)
		{
			if($zahlen[$j] < $zahlen[$j-1])
			{
				$tmp = $zahlen[$j-1];
				$zahlen[$j-1] = $zahlen[$j];
				$zahlen[$j] = $tmp;
			}
		}
	}

	return $zahlen;
}

function quickSort(array $zahlen, $l = null, $r = null)
{
	if(is_null($l) AND is_null($r))
	{
		return quickSort($zahlen, 0, count($zahlen) - 1);
	}

	$mitte = $zahlen[(int) (($l + $r) / 2)];
	$i = $l;
	$j = $r;

	while($i <= $j)
	{
		while($zahlen[$i] < $mitte) $i++;
		while($zahlen[$j] > $mitte) $j--;

		if($i <= $j)
		{
			$tmp = $zahlen[$i];
			$zahlen[$i] = $zahlen[$j];
			$zahlen[$j] = $tmp;
			$i++;
			$j--;
		}
	}

	if($l < $j)
		$zahlen = quickSort($zahlen, $l, $j);
	if($i < $r)
		$zahlen = quickSort($zahlen, $i, $r);

	return $zahlen;
}

$unsortierteZahlen = range(0, 10);
shuffle($unsortierteZahlen);

var_dump(implode(', ', $unsortierteZahlen));
var_dump(implode(', ', selectionSort($unsortierteZahlen)));
var_dump(implode(', ', insertSort($unsortierteZahlen)));
var_dump(implode(', ', bubbleSort($unsortierteZahlen)));
var_dump(implode(', ', quickSort($unsortierteZahlen)));

?>

Cli-Anwendungen mit dem Zend Framework

Donnerstag, Januar 20, 2011 23:23
Veröffentlicht in der Kategorie PHP von Markus

Oft kann es nützlich sein, wenn man bestimmte Teile seiner Anwendung über das Command-Line-Interface (kurz Cli) aufrufen kann. Dies kann man z.B. dazu nutzen, um einen bestimmten Task anzustoßen oder um eine Aufgabe als Cronjob bzw. Daemon laufen zu lassen.

Ich werde im folgenden Erklären, wie man das Zend Framework über Cli nutzbar macht. Ich gehe dabei nur auf die grundlegenden Schritte ein, um einen umfassenden Überblick über die Möglichkeiten zu geben. Ich habe diese Variante seit längerer Zeit im Einsatz und komme damit sehr gut zurecht, da es kaum einen Unterschied zu Http-Requests gibt. Trotzdem bin ich mir über die einzelnen Schritte meiner Implementierung nicht mehr 100%ig bewusst, versuche aber alles zu bedenken. Sollte ich dennoch etwas vergessen und etwas fehlen bzw. nicht funktionieren, sagt mir doch bitte Bescheid.

Wie man das Zend Framework dazu bringen kann, auf Requests über Cli zu reagieren, muss man dem Zend Framework diese Art des Requests zu erst einmal beibringen. Grundsätzlich erwartet das ZF Requests per HTTP und versucht somit auch Informationen wie z.B. HTTP_HOST oder Parameter aus der URL anzufordern. Da es diese Informationen bei einem Cli-Request allerdings nicht gibt, müssen wir unsere eigene Request-Klasse programmieren, die den Request annimmt und bearbeitet, wenn die Anfrage über Cli kommt. Weiterlesen »

svn: Dateien standardmäßig ignorieren

Dienstag, Januar 11, 2011 14:46
Veröffentlicht in der Kategorie Linux, Software, Softwareentwicklung von Markus

Oftmals werden während der Entwicklung temporäre Dateien angelegt (Eclipse legt z.B. .project, .buildpath und .settings an), die man nicht in das SVN-Repository hinzufügen möchte. Damit diese Dateien nicht immer in der Status-Liste (svn st) stehen, kann man diese Dateien über die Subversion Konfigurationsdatei ignorieren lassen.

Dazu muss man einfach die Datei ~/.subversion/config (im Home-Verzeichnis) bearbeiten. Dort findet sich folgende Zeile:

# global-ignores = *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo

Diese Zeile muss man einfach auskommentieren und, je nach Bedarf, mit eigenen Dateinamen (bzw. Wildcards) ergänzen oder vorhandene entfernen.

Für die Eclipse-Projekt-Dateien kann man z.B. folgende Zeile verwenden:

global-ignores = .project .settings .buildpath

Diese Einstellung in der Config-Datei ist aber nur lokal und für den aktuellen Nutzer. Möchte man bestimmte Dateien vollständig für das Repository verbieten, kann man dazu folgenden Befehl nutzen:

svn propedit svn:ignore /path/to/repo

Dort trägt man dann die zu ignorierenden Dateinamen relativ zum angegebenen Verzeichnis ein. Fertig.

Tags: ,

IPv4-Adressen neigen sich dem Ende

Sonntag, Januar 2, 2011 17:49
Veröffentlicht in der Kategorie Netzwerke von Markus

Es war schon lange absehbar, dass irgendwann alle IPv4-Adressen aufgebraucht sein werden. Dieser Zeitpunkt liegt aber mittlerweile nicht mehr in weiter ferne. Es ist schon in wenigen Wochen so weit. Folgende Grafik verdeutlicht das sehr gut:
Weiterlesen »

Apache: alle aktivierten vHosts anzeigen

Sonntag, Januar 2, 2011 2:30
Veröffentlicht in der Kategorie Server von Markus

Ich hatte gerade das Problem, dass ich wissen musste, welche vHosts momentan auf meinem Server aktiviert sind.

Dies kann man nun herausfinden, indem man in den /etc/apache2/sites-enabled Ordner guckt. Hat man seine Dateien sinnvoll benannt, kann man so evtl. schon auf den ersten Blick sehen, was alles aktiviert ist. Ansonsten muss man sich jede Datei einzeln ansehen.

Es geht aber auch wesentlich elleganter. Der Apache gibt über folgenden Befehl alle aktivierten vHosts aus:

apache2 -S

und man erhält eine Ausgabe ähnlich der folgenden:

wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server example.de (/etc/apache2/sites-enabled/000-default:1)
         port 80 namevhost example.de (/etc/apache2/sites-enabled/000-default:1)
         port 80 namevhost asdf.org (/etc/apache2/sites-enabled/000-default:20)
         port 80 namevhost foobar.org (/etc/apache2/sites-enabled/foobar:1)
         port 80 namevhost www.foobar.org (/etc/apache2/sites-enabled/foobar:8)
Syntax OK
Tags: ,

Anonymität im Internet, Proxys and Proxy Anbieter

Donnerstag, Dezember 30, 2010 3:50
Veröffentlicht in der Kategorie Software von Neytiri

Das hier ist mein erster Post in diesem noch recht frischen Blog. Mein Name ist Lilly und meinen ersten Beitrag widme ich der Anonymität durch Proxys, deren Technik und den Anbietern von Proxylösungen.

Warum einen Proxy verwenden?

Wer sich etwas für Politik interessiert und dabei nicht nur auf die Meinung von Zeitungen und TV vertraut, dürfte möglicherweise schon einen Eindruck haben, wohin uns die Zukunft führt: Eine unentbehrlich Vorratsdatenspeicherung muss her, um die Aktivität der vielen Terroristen aus Deutschland zu überwachen, eine Internetzensur ist ebenso unabdingbar, um Kinderpornografie aus dem deutschen Internet zu verbannen und man brauche ebenfalls einen Jugendschutz, der alle nicht-jugendfreien Inhalte sperrt und uns 16+ Material nur Nachts zugänglich macht, um die Entwicklung von Kindern und Jugendlichen nicht zu beeinflussen.
Es ist unschwer zu erkennen wohin dieser Trend geht: Überwachung, Kontrolle und Zensur und es bleibt sicher nicht nur bei den bereits angekündigten Einschränkungen.

Nicht jeder möchte, dass die eigenen Spuren im Internet bis aufs kleinste Detail gespeichert und analysiert werden, und um dies zu Umgehen eignet sich eine Proxysoftware. Unterschiedliche Proxy-Softwarelösungen und die technischen Hintergründe habe ich in diesem Artikel kurz und knapp zusammengefasst. Weiterlesen »

Daemons in PHP?

Donnerstag, Dezember 30, 2010 1:03
Veröffentlicht in der Kategorie PHP von Markus

Ich frage mich momentan, ob es möglich ist, Daemons in PHP zu programmieren. Ich nutze momentan Cronjobs für bestimmte Background Tasks, bin damit aber nicht mehr sonderlich zufrieden. Zum einen liegt es daran, dass die Aufgaben immer verzögert durchgeführt werden und ich mich nicht mehr um Überschneidungen und Race-Conditions sorgen möchte, weil ein neuer Cronjob bereits ausgeführt wird, obwohl der alte noch nicht einmal beendet ist.

Ich habe erst überlegt, meine Cronjobs nach Java zu portieren und dort das ganze dann als Daemon laufen zu lassen. Da das ganze aber mit einer PHP-Webanwendung zusammenlaufen müsste, habe ich mich dagegen entschieden, weil ich den Programmcode nicht in zwei Sprachen aufgeteilt haben möchte.
Aber fangen wir ganz von vorne an. Weiterlesen »

“Don’t fuck with a hackers maschine!” Oder: Wieso man den PC eines Hackers besser nicht klaut

Mittwoch, Dezember 29, 2010 23:22
Veröffentlicht in der Kategorie Hacking von Markus

In folgendem Video beschreibt ein Hacker, dessen Computer gestohlen wurde, wie er ihn nach rund 2 Jahren zurückerhalten konnte. Sehr witziges Video, bei dem der Hacker den neuen Benutzer / Dieb sehr gründlich auseinandernimmt. Er beschafft sich nach und nach Informationen über die Person, angefangen beim Namen und Adresse bis hin zu Browserverlauf, Nacktbildern und Paypal- und Kreditkartenzugangsdaten, welche er auch alle öffentlich zur Schau stellt :-)

svn: Branch erstellen

Mittwoch, Dezember 29, 2010 14:54
Veröffentlicht in der Kategorie Software, Softwareentwicklung von Markus

Möchte man in SVN einen Branch erstellen, kann man dazu folgenden Befehl nutzen:

svn copy http://svn.example.com/trunk http://svn.example.com/branches/branch1 -m "branching trunk into branch1"

Wie man den Branch wieder in den Trunk zurück führt schreibe ich demnächst.

Tags: ,