Monatsarchiv für Dezember 2011

 
 

PHP und Y2K38: Werden wir alle sterben?

Der 19. Januar 2038 3:14:07 Uhr ist ein besonderer Zeitpunkt. Dann sind nämlich genau 2147483647 Sekunden seit dem 1. Januar 1970 vergangen. PHPs date()-Funktion arbeitet genau auf dieser Grundlage – auch bekannt als der UNIX-Timestamp.

Der Unix-Timestamp ist in PHP sehr populär. Funktionen wie date() oder strtotime() arbeiten mit UNIX Timestamps. Das ist auf den ersten Blick auch unheimlich praktisch, weil sich damit relativ platzsparend Daten (Plural von Datum) speichern lassen. Außerdem lässt es sich mit einem Timestamp leicht rechnen.

Ein PHP signed Integer auf 32bit-Systemen kann Werte zwischen -2147483648 und 2147483647 annehmen. Am 19. Januar 2038 3:14:08 läuft der Int also über und es ist plötzlich der 13. Dezember 1901 20:45:52 Uhr (Freitag der 13.!).

Folgendes Beispiel zeigt das Verhalten auf 32bit-Systemen. Mit einem 64bit-System und 64bit PHP kann PHPs unsinged Int Werte bis 9223372036854775807 annehmen. Dort stellt sich die Y2K38-Frage also garnicht. Hier stellt sich dann die Jahr 292471210689-Frage – aber bis dahin sind 64bit Systeme genau so ausgestorben, wie es 2038 die 32bit-Systeme sein werden.

var_export(strtotime("20 jan 2038")); // false :(

PHP CLI Fortschrittsbalken

Hin und wieder führt man PHP-Skripte direkt auf der Kommandozeile (CLI) aus. Das hat den Vorteil, dass man nicht den Umweg über den Webserver gehen muss, wenn man ihn garnicht braucht. Außerdem lässt sich das Skript leicht mit STRG+C abbrechen, den Webserver hingegen müsste man bei einer Endlosschleife neu starten.

Der aktuelle Fortschritt lässt sich auch ganz einfach mit echo ausgeben – kein (ob_)flush notwendig.

Wenn man mit echo einen Carriage Return ("\r") ausgibt, wird der Cursor auf den Anfang der Zeile zurückgestellt und man kann eine bereits ausgegebene Zeile überschreiben. Perfekt also für einen Fortschrittsbalken!

$total = 10;
$bar_length = 20;
$spinner = '-\\|/';
for ($i = 1; $i <= $total; $i++) {
    usleep(1000000);

    $spin = $spinner[$i%strlen($spinner)];    
    $cur = sprintf('%'.strlen($total).'.d', $i);
    $percent = $i/$total*100;

    $progress_len = floor($bar_length * $percent / 100);
    $progress = str_repeat('=', $progress_len);
    if ($progress_len < $bar_length) {
        $progress .= '>';
        $progress .= str_repeat('-', $bar_length-$progress_len-1);
    }

    echo " $cur/$total $spin [$progress] $percent%\r";
}

Zwei Jahre (und ein bisschen) neunzehn83.de

Party Hard

Wie auch schon letztes Jahr habe ich den Geburtstag (oder sagt man Jahrestag) meines Blogs knapp verpennt. Macht aber nichts, zu bloggen hab ich nämlich auch vergessen. 2011 waren die Anspüche groß, die Resultate blieben aber wie so oft weit hinter den Erwartungen zurück. So habe ich es in einem Jahr auf gerade einmal 16 Beiträge gebracht. Pfui!

2012 wird aber alles besser. Gebloggt wird ab sofort übrigens mit WordPress 3 und markdown (yay). Ideen für neue Beiträge habe ich einige, mitunter sind das echte Kracher, also dranbleiben, denn die kalte Jahreszeit kommt bestimmt.