Jahresarchiv für 2010

 
 

PHP-Skript im Hintergrund ausführen

Wenn gleichzeitig mit einem Seitenaufruf eine rechen- oder zeitintensive Aufgabe ausgeführt werden soll, hat das den Nachteil, dass der Benutzer im Browser so lange einen Ladebalken sieht, bis die gesamte Rechenoperation beendet ist. Auch wenn die Berechnung an das Skriptende mit vorherigem ob_flush() gesetzt wird, bleibt der Ladebalken im Browser sichtbar. Das sieht nicht nur unschön aus – auch JavaScript-Events wie onload oder domready werden verzögert gefeuert.

Idealerweise startet man rechenintensive Aufgaben nicht zusammen mit einem Webseitenaufruf, sondern per cron direkt über das PHP CLI ohne Webserver-Overhead. Cron steht aber nicht immer zur Verfügung. Außerdem macht es die Anwendung weniger portabel.

Die Tatsache, dass jeder Browser die Verbindung beendet, sobald er alle mittels HTTP-Header “content-length” angekündigten Bytes empfangen hat, lässt sich ausnutzen. Den Rest regelt PHPs Ausgabepuffer.

Beispiel:

<?php
 ignore_user_abort(true);
 ob_start();
 
 // Webseiten-Content
 echo '<html>...</html>';
 
 header('HTTP/1.1 200 OK');
 header('Content-Length: ' . ob_get_length());
 
 ob_end_flush();
 flush();
 
 // Background-Prozess ab hier
 sleep(10);
?>

Ein ignore_user_abort(true) verhindert den Scriptabbruch durch den Benutzer während der Ladezeit. Nach dem flush() kann das Skript in keinem Fall mehr abgebrochen werden (abgesehen von Runtime-Fehlern, time- oder memory_limit). Sämtlicher Output vom Background-Prozess landet im Nirvana.

Wird das obige Skript aufgerufen, erscheint nur während der Ladezeit des ge-flush-ten Buffers ein Ladebalken (“Webseiten-Content”). Der Background-Prozess (beispielhaftes Sleep(10)) findet statt, nachdem die Verbindung zum Browser bereits beendet wurde.

Die Implementierung ist je nach Browser/Webserver-Umgebung etwas hakelig und bedarf in jedem Einzelfall der genauen Überprüfung. Der Beispielcode oben hat in meinen Tests gut funktioniert.

Wider Erwarten funktioniert das auch ohne die explizite Angabe von header(‘Connection: close’). Im IE6 führt die Angabe sogar dazu, dass der Hintergrundprozess überhaupt nicht mehr funktioniert. Wenn der IE darüber hinaus immer noch Zicken macht, so hilft es vielleicht mindestens 256 Byte zu flushen. Code:

echo '<html>...</html>';
 
if (($diff = 256 - ob_get_length()) > 0) echo str_repeat(' ', $diff);
 
header('HTTP/1.1 200 OK');
header('Content-Length: ' . ob_get_length());

Ade, ‘s war schee!

Augmented reality und OCR

Augmented reality, die erweiterte Realität: Beispiele dafür gibt es mittlerweile einige – fast alle sind total sinnlos. So wohl auch das App “Word Lens“. Aber es ist einfach nett anzusehen. Im Moment gibt’s das nur fürs iPhone. In der Demo-Version, in der erkannte Wörter lediglich umgedreht statt übersetzt werden, ist es kostenlos. Übersetzungspakete (z. Zt. nur EN<->ES) kosten 3,99 Euro.

Das App funktioniert auch ohne Internetverbindung. Die live OCR-Erkennung, und die miese Maschinenübersetzung  sind für mich noch soweit nachvollziehbar. Aber das Ersetzen des Originaltextes unter Berücksichtigung der Schriftart, -farbe und -größe unter den verschiedensten Winkeln: mind = blown.

Ein Jahr neunzehn83.de

Habe ich doch glatt den ersten Geburtstag meines Blogs verpennt. Am 3. Dezember 2009 ging es hier offiziell los. Seither habe ich es auf immerhin 28 mehr oder minder sinnvolle Beiträge geschafft – diesen eingeschlossen :)

Für 2011 nehme ich mir vor, die Frequenz etwas zu erhöhen, auch wenn nach wie vor gilt: Qualität vor Quantität. Zu einem Picdump- oder Linkblog kann ich die Seite ja dann immer noch verkommen lassen.

Für EUCH silent-reader da draußen wird es so langsam höchste Zeit mal einen Kommentar zu hinterlassen. Wenn euch zu meinen sonstigen Posts einfach nichts einfällt, kann ich das gut verstehen. Ist ja stellenweise auch echt kranker Scheiß. Dieser Post hingegen läd selbst den einfachst gestrickten Menschen zum Kommentieren ein. Ich weiß übrigens, dass Ihr mindestens zwei seid, also los!

MySQLs BIGINT .. und PHP

Übrigens: Ein MySQL BIGINT ist 8 Byte lang. Unsigned lassen sich also Ganzzahlen von 0 bis 18446744073709551615 speichern. Eine MySQL-BIGINT-Spalte mit auto_increment läuft bei 1000 Inserts pro Sekunde erst nach über 500 Milliarden Jahren über. An dieser Stelle darf der Vergleich mit dem Alter des Universums natürlich nicht fehlen: lächerliche 13,75 Milliarden Jahre!

Die Länge eines PHP-Integers ist dagegen von der Plattform abhängig.  Der maximale Wert ist in der Konstanten PHP_INT_MAX hinterlegt. PHP-Integers sind immer signed.

echo PHP_INT_MAX; // "2147483647" auf einem 32bit System/32bit PHP
echo PHP_INT_MAX+1; // "2147483648" .. Nanu?
Wird INT_MAX überschritten gibt PHP immer ein float zurück
echo typeof(PHP_INT_MAX+1); // double
echo (int)(PHP_INT_MAX+1); // "-2147483648" Aha!
Wie wir sehen, ist ein PHP-Float eigentlich ein DOUBLE, also doppelte Genauigkeit (double precision) mit 8 Byte Länge.

52 der 64 bits werden für die Mantisse verwendet. Ganzzahlen können also bis 2^53-1 exakt abgespeichert werden. Darüber hinaus wird es ungenau:

ini_set('precision', 17);

// 2^53
echo 9007199254740991; // "9007199254740991"
// 2^54
echo 18014398509481983; // "1801439850948198*4*"

Zugegeben, das Ganze ist etwas sehr theoretisch. Für das Rechnen mit wirklich große Zahlen verwendet man besser BCMath. Ein MySQL BIGINT ist auf 64bit Systemen mit 64bit PHP kein Problem. Auf 32bit Systemen wird’s ab 2^53 haarig. Das sind dann aber immerhin noch ca. 285 Mio. Jahre bei 1000 Inserts/Sekunde ;)

Regworld Domainrobot

Wer eigene (v)Server betreibt kann Domains unabhängig vom Provider direkt bei einem Domainrobot registrieren. Das hat zum einen den Vorteil, dass man Handles (Kontaktdaten) und IP-Adressen selbstständig verwalten kann, zum anderen gibt es die Domains zu unschlagbar günstigen Preisen.

Wie ich bereits erwähnt habe, habe ich alle meine privaten Domains über den Domainrobot vom Regworld registriert. Anfangs war ich skeptisch, da man über diesen Anbieter wenig im Internet findet (Früher war Regworld unter dem Namen “Silverbird Consulting” unterwegs .. warum auch immer). Zudem macht die Webseite auch nicht den seriösesten Eindruck. Bei Regworld gibt es eine .de-Domain aber für schlappe 2,22€/Jahr. Für die Neuregistrierung kommen nochmals einmalig 2,22€ dazu. Auch CNO-Domains sind mit 8,88€ ab der ersten Domain wirklich günstig.

Der Preis?

Denic-Mitglieder bezahlen für eine de-Domain an die Denic 1,92 Euro netto (vermutlich). Das sind 2,28 Euro inkl. MwSt. Somit verkauft Regworld die de-Domains wohl unter dem Einkaufspreis bei der Denic. Eventuell genießt Regworld hier auch Sonderkonditionen bei der Denic – aber mit Kosten für Nameserver, Buchhaltung/Rechnungserstellung und Technik für den Robot dürfte da so oder so nichts hängen bleiben.

Alle anderen Domainendungen (.mobi, .tel und Länderendungen wie .tv) sind dafür bei Regworld im Vergleich zu INWX extrem teuer. Aber irgendwie müssen die ja auch Geld verdienen…

Die Preise für de-Domains scheinen übrigens kein Lockangebot zu sein. Ich kann nicht genau sagen, wie lange dieser Preis schon gilt, mindestens aber 18 Monate. Die Sicherheit, dass das so bleibt hat man natürlich nicht. Aber dank Robot sind Domains dann auch relativ leicht zu einem anderen Robot umgezogen (IP-Adressen bleiben ja die selben).

Die Technik

Regworld verwendet den Domainrobot AutoDNS2. Seit einiger Zeit ist auch ein neues Webinterface mit AutoDNS3 verfügbar. Das Ganze funktioniert relativ fix – auch wenn es hier nicht wirklich auf Geschwindigkeit ankommt.

AutoDNS2 von Regworld

AutoDNS3 von Regworld

Nameserver gibt es für alle über Regworld registrierten Domains gratis. Einen Primary und einen Secondary. Einträge werden auf den Nameservern automatisch angelegt, wenn eine Domain registriert wird. Außerdem hat man selbstverständlich die Möglichkeit eigene Nameserver zu verwenden.

Die technischen Details habe ich bereits in einem früheren Blogbeitrag beschrieben.

DNS-Namen der zwei Nameserver sind (bei mir) ns3.regworld.com und ns4.regworld.com. Alternativ auch ns1.bces.de und ns2.bces.de. Man kann selbstverständlich per GLUE-Record auch seine eigenen Domains als Regworld-Nameserver verwenden.

Support

Für 2,22€ pro de-Domain kann man nicht all zu viel erwarten. Dennoch ist der Support gut erreichbar – sowohl per E-Mail als auch telefonisch. Bei Problemen mit einem Nameserver konnte man mir aber nicht wirklich weiterhelfen. So ist es also offenbar nicht möglich einen eigenen primären Nameserver zu betreiben und den sekundären bei Regworld. Ärgerlich, da es sich so über den Robot konfigurieren lässt, aber einfach nicht funktioniert. Primären und sekundären bei Regworld sowie weitere eigene sekundäre funktioniert aber.

Fazit

Bei Domains finde ich einzig und allein den Preis ausschlaggebend. Die Inklusiv-Nameserver nehme ich gerne mit, weil sie gut funktionieren. Wenn diese nicht zuverlässig wären, würde ich eigene betreiben. Und dann kann von Regworld-Seite eigentlich fast nichts mehr schief gehen.

Wer exotische Endungen benötigt sollte sich die Preisliste genau anschauen – hier ist die ein oder andere Überraschung versteckt. Zu den anderen Services von Regworld (Webspace/Server) kann ich nichts sagen. Da es bei diesen Produkten aber eher auf den Support ankommt würde ich mal spontan davon abraten. Siehe auch die Kommentare bei Webhostlist (hier geht es nicht um den Robot).