hiPHoP

Kurze Notiz: Muss mir wenn HipHop für PHP veröffentlicht ist das ganze mal ansehen. Vor allem interessiert mich wie der Code nach dem Transformieren aussieht. Mehr Zeilen, weniger lesbar, …? Bin mal gespannt.
Netter Nebeneffekt ist auch, dass die Software danach gleich closed-source wird. Obwohl es dafür schon ein paar Lösungen gibt (etwa Zend-Guard, bcompiler, PHPEncoder, …).

Zeit ist Geld oder PHP Profiling mit XHProf

Eben habe ich wieder einen sehr interessanten Artikel von Jan gelesen. Dieses mal geht es um PHP Profiling. Er berichtet über den Einsatz von XHProf von Facebook bei ihnen.

Bei Gelegenheit werde ich das Teil unbedingt mal versuchen. Für Software, bei der mehr gleichzeitig zugreifen, ist Profiling eigentlich schon immer ein Muss. Viel zu viele „Softwareentwickler“ kennen leider solche Tools gar nicht. Ich schreibe mir jedenfalls den Link zu dem Tool unbedingt mal auf.

PHP – aber sicher

PHP Skripts sind schnell gezimmert. Allerdings bleibt da oft die Sicherheit außen vor. Mir geht es da auch nicht anders. Aus dem Grund suche ich immer wieder nach Lösungen, die mir die Sache ein wenig abnehmen. Heute bin ich auf PHPIDS gestoßen. Es fängt alle XSS, SQL Injection, header injection, directory traversal, RFE/LFI, DoS und LDAP Angriffe ab. Die Integration in bestehende PHP Anwendungen läuft über ein paar wenige Zeilen Code. Genau dafür übrigens liebe ich die Interpretersprachen.

PHPIDS muss ich mir unbedingt mal installieren!

PHP Notizen

Hab mal wieder eben was mit PHP zu tun gehabt. Daher 2 Notizen:

  1. Fehlermeldungen in PHP einschalten:
    Statt immer den Webserver oder die PHP.ini umzustellen reicht natürlich auch folgender Code im Skript:

    error_reporting(E_ALL);
    ini_set('display_errors', '1');
    
  2. Zeilenumbrüche unabhängig vom Betriebssystem:
    Warum Windows das anders macht als Linux/Unix nervt mich schon immer. Jedenfalls werde ich ab sofort statt „\r\n“ bzw. „\n“ in Zukunft die PHP Konstante PHP_EOL nehmen! Also sowas wie:

    $msg .=  PHP_EOL;
    

Spiderman is having me for dinner tonight…. Teil 4

Ich hab mir heute morgen mal die Statistik vom Cache angesehen. 99.7% der Hits werden durch mit gecachten PHP-Seiten bedient. Nur bei 0.3% muss die PHP Seite neu in Bytecode übersetzt werden. Nicht schlecht!

Bei den Seiten, die ich per Hand (s.o.) cache, ist das Verhältnis beeindruckend:

  • 1. Aufruf: Page Load Time: 0.330711126328 seconds.
  • Jeder weitere Aufruf: Page Load Time: 0.000527143478394 seconds.

Das lohnt sich wohl!

Spiderman is having me for dinner tonight… Teil 3

Ich hab ja schon in Teil 1 geschrieben, dass ich apc einsetze. Das Teil bringt ohne irgend welche Programmierung schon einiges. Es hält den Bytecode der PHP-Skripts im Speicher. Den Erfolg kann man ganz einfach so abrufen:

print_r(apc_cache_info());

Mit ein bisschen Programmieraufwand kann man Dank apc noch viel mehr rausholen. Auf rothsee-triathlon.de ist nicht alles neu und in php. Manche Teile laufen auch als alte Perl Skripts im Hintergrund. Die Hole ich mir dann per http zur Laufzeit rein. Nachdem das aber immer wieder die gleichen Files sind lässt sich der Content prima cachen. Also hab ich eine Funktion für diesen Zweck definiert:

function request_cache($url) {
        if (function_exists('apc_fetch')) {
           $md5=md5($url);
           $doc = apc_fetch($md5,&$success);
	   if(!$success) {
		$doc = file_get_contents($url);
		if ($doc === false) return "";
		apc_store($md5, $doc);
                $doc .= "\n";
           } else {
                $doc .= "\n";
           }
	} else {
		$doc = file_get_contents($url);
                $doc .= "\n";
        }

	return $doc;
}

und rufe sie wie folgt auf:

$value = request_cache($request);

Die gecachte Seite ist „nur“ ca. um den Faktor 100 schneller. Kleiner Aufwand hoher Nutzen. Sehr geil.

Spiderman is having me for dinner tonight… Teil 2

Gestern Abend (gegen 22:00 Uhr) habe ich noch ein paar Ding optimiert. Am wichtigsten scheint mir, dass ich nur noch die PHP- und Apache Module lade, die ich wirklich benötige. Das hat meinen Speicher ordentlich entlastet und der Server hat seitdem wirklich massiv weniger Last!

Ich schreib das hier auf, weil es vielleicht jemand anderen auch erinnert mal auf zu räumen und damit ich nicht wieder anfange irgendwelche unnötigen Dinge zu installieren. Der Server hat mittlerweile soviel Traffic, dass er etwas Aufmerksamkeit und Sorgfalt verdient hat.

rrd2-system1

Achja noch was. Damit die Apache internal dummy connections nicht immer auf dem aufwendigsten Server aufschlagen habe ich mir einen localhost definiert. Das hilft

ServerName localhost
ServerAlias 127.0.0.1
ServerAlias 172.16.1.1
ServerAlias 212.114.250.32
DocumentRoot /var/www/localhost/htdocs
CustomLog /var/www/localhost/log/access.log combined
ErrorLog /var/www/localhost/log/error.log

AllowOverride None


GnuTLSEnable on
GnuTLSCertificateFile /etc/ssl/CA/private/it4sport.de.crt
GnuTLSKeyFile /etc/ssl/CA/private/it4sport.de.key
GnuTLSPriorities NORMAL
ServerName localhost
ServerAlias 127.0.0.1
ServerAlias 172.16.1.1
ServerAlias 212.114.250.32
DocumentRoot /var/www/localhost/htdocs
CustomLog /var/www/localhost/log/access.log combined
ErrorLog /var/www/localhost/log/error.log

AllowOverride None

In der index.html steht einzig und allein „no content“ drin.

Wenn ich noch mehr Stellschrauben finde und einstelle, dann schreibe ich hier mir das auf.

Apache/PHP Paranoia

Manchmal will man aus diversen Gründen nicht verraten welche Version von PHP und Apache bei einem so läuft. Und sei es nur, dass man die paar Bytes spart. Dann muss man es eben ausschalten. Bei Apache mit

#
# ServerTokens
# This directive configures what you return as the Server HTTP response
# Header. The default is 'Full' which sends information about the OS-Type
# and compiled in modules.
# Set to one of:  Full | OS | Minor | Minimal | Major | Prod
# where Full conveys the most information, and Prod the least.
#
ServerTokens Prod
#
# Optionally add a line containing the server version and virtual host
# name to server-generated pages (internal error documents, FTP directory 
# listings, mod_status and mod_info output etc., but not CGI generated 
# documents or custom error documents).
# Set to "EMail" to also include a mailto: link to the ServerAdmin.
# Set to one of:  On | Off | EMail
#
ServerSignature Off

und bei php mit

; Decides whether PHP may expose the fact that it is installed on the server
; (e.g. by adding its signature to the Web server header).  It is no security
; threat in any way, but it makes it possible to determine whether you use PHP
; on your server or not.
expose_php = Off

From www-data@localhost …

Eben habe ich mal wieder danach gesucht, warum meine eMails, die ich mit PHP erzeuge, nicht ankommen. Wieder mal wurde der „Absender“ www-data@localhost geblockt, obwohl ich brav Sender und From im Mail-Header angegeben hatte. Nachdem ich das schon zig mal hatte schreibe ich mir jetzt endlich mal auf was da falsch läuft!

Das Problem ist zweigeteilt, nämlich in User „www-data“ und Host „localhost“ Teil. Wenn ich PHP richtig verstanden habe, dann führt der www-data User unter dem der Apache läuft durch PHP das sendmail Programm zu versenden aus. Damit erklärt sich der User Teil. Ist nun der MTA nicht richtig konfiguriert, so wird halt einfach der Default „localhost“ angehängt.

Die Lösung besteht daher auch aus 2 Schritten. Erstens sollte für den www-data User eine vernünftige eMail-Adresse hinterlegt werden. D.h. immer wenn dieser eine eMail verfasst sollte seine Adresse durch eine andere ersetzt werden. Das geht einfach über die canonical Tabelle von Postfix. Dazu muss in der main.cf folgendes eingetragen werden:

canonical_maps = hash:/etc/postfix/canonical

Und in dieser Datei dann etwas wie:

www-data                postmaster@it4sport.de

Anschließend noch die Tabelle postfix bekanntmachen:

postfix reload
postmap /etc/postfix/canonical

Fertig ist der erste Teil.
Der Hostteil liegt einfach daran, dass weder myhostname noch mydomain innerhalb der main.cf ordentlich konfiguriert sind.

Hoffentlich merk ich mir das jetzt endlich mal.

Ajax eMail Validation

In meiner Freizeit betreue ich die Website der Triathlon Abteilung vom TSG 08 Roth. Dort sind einige Formulare vorhanden. Alle in dieser Formulare sind in der einen oder anderen Form Formmails. Die Formulare werden zwar bereits jetzt auf Spam abgeklopft und nur spamfreie Einträge werden veröffentlicht, aber allzu häufig muss ich mittlerweile eMails mit ungültigen Absendern bearbeiten. Das nervt wirklich! Daher habe ich nun mein erstes vernünftiges Ajax Projekt. In den Formularen soll eine Prüfung eingebaut werden, die über einfache reguläre Ausdrücke hinausgeht.
„Ajax eMail Validation“ weiterlesen