PHP: Event-Driven Programming mit WAMP (WebSockets)

Das WebSocket Application Messaging Protocol ist ein Protokoll welches WebSockets nutzt um Funktionen wie RPC (Remote Procedure Call) und PubSub (Publish & Subscribe) anzubieten. Intern werden die Nutzdaten mit Hilfe von JSON transportiert. Mittlerweile existieren einige Implementierungen um WAMP (http://wamp.ws) einzusetzen. Für PHP gibt es z.B. Ratchet: (http://socketo.me) . Ratchet ist eine lose gekoppelte Bibliothek, die einem Entwickler die Möglichkeit gibt, eine bi-direktionale Echtzeitkommunikation zwischen Client und Server in PHP umzusetzen. Als Gegenstück für den Server kann die JavaScript-Bibliothek Autobahn (http://autobahn.ws/js) verwendet werden.

Vorraussetzungen für die Beispielimplementierung:

  • PHP 5.4 Interpreter (idealerweise XAMPP auf Laufwerk C:)
  • Browser mit WebSocket-Support
  • Features:

  • An Topic anmelden / abmelden
  • Nachricht versenden / empfangen
  • Remote Procedure Call
  • Über WebSockets bewegliches DIV
  • Screenshot Client:
    WAMP Beispielimplementierung Client
    Screenshot Server:
    WAMP Beispielimplementierung Server

    PHP: Event-Driven Programming mit WAMP (WebSockets) weiterlesen

    Ausführungszeit innerhalb eines PHP-Skripts messen

    Leider bietet PHP keine native Möglichkeit um die Ausführungszeit innerhalb eines Skripts zu messen. Um die Performance von Code-Blöcken zu steigern, muss zuerst die leistungsschwache Stelle ausgemacht werden. Hierbei kann die Klasse „StopWatch“ behilflich sein.

    class StopWatch
    {
        private static $fTimeStart = 0.00;
        private static $fTotal = 0.00;
       
        public static function start()
        {
            self::$fTimeStart = microtime(true);
            self::$fTotal      = 0.00;
        }
       
        public static function stop()
        {
            $fTimeEnd = (microtime(true)-self::$fTimeStart);
            echo "Zeit: ".number_format($fTimeEnd, 15)."s\n";
        }
    }

    StopWatch::start();

    for($i = 0; $i < 1000000; $i++)
    {
        //mache irgendetwas...
    }

    StopWatch::stop();

    /*
     * Ausgabe:
     * Zeit: 0.051145076751709s
     */

    Titel einer Webseite mit PHP auslesen

    Die nachfolgende Methode liest den Titel einer beliebigen HTML-Seite mit Hilfe von PHP aus.

    function getPageTitle($sURL)
    {
        if( ($sHTML = file_get_contents($sURL)) &&
            preg_match("/<title>(.+)<\/title>/i", $sHTML, $aTitle))  
        {
            return trim($aTitle[1]);
        }
        return false;
    }

    echo utf8_decode(getPageTitle("http://sklueh.de"));

    /*
     * Ausgabe:
     * Sebastian Klüh | Softwareentwicklung und was mich sonst so beschäftigt.
     */

    PHP: Simple Table Builder

    Simple Table Builder ist eine PHP Klasse, mit der sich HTML-Tabellen auf Grundlage eines mehrdimensionalen Arrays erzeugen lassen. Um die Usability zu verbessern wurde das jQuery-Plugin „Flexigrid“ (http://flexigrid.info) verwendet.

    Features:

  • Titel-Text
  • Definition der Spaltenüberschriften
  • Höhe und Breite der Tabelle festlegen
  • Spaltensortierung
  • Definition der Spaltenbreite
  • Festlegen einer Standard-Spaltenbreite
  • Screenshot:

    Anwendungsbeispiel:

    require_once('SimpleTableBuilder.php');

    $aTableData = array_fill(0, 15, array('Vorname' => 'Max', 'Nachname' => 'Mustermann', 'Straße' => utf8_decode('Musterstraße 10')));
    $oSimpleTableBuilder = new SimpleTableBuilder();
    $oSimpleTableBuilder->setHeader('Vorname', array('Nachname' => '150'), utf8_decode('Straße')); //Die Breite einer Spalte kann über ein Array definiert werden (In diesem Fall: 150 Pixel). Ansonsten wird der Standardwert verwendet.
    $oSimpleTableBuilder->setTitle('Mein Array');       //Festlegen der Tabellen-Überschrift (optional)
    $oSimpleTableBuilder->setTableData($aTableData);    //Hier wird das Array übergeben, aus dem eine Tabelle erzeugt wird.
    $oSimpleTableBuilder->setHeight('300');             //Festlegen der Höhe (optional)
    $oSimpleTableBuilder->setWidth('600');              //Festlegen der Breite (optional)
    echo $oSimpleTableBuilder->buildTable();            //Tabelle erzeugen

    PHP: Simple Table Builder weiterlesen

    Lightweight Validator in PHP

    Ziel war es, mit wenig Zeilen einen möglichst einfach zu verwendenden Validator zu schaffen, der sich zudem einfach erweitern lässt und ohne viele Abhängigkeiten auskommt. Daraus entstanden ist folgendes:

    Anwendungsbeispiel:

    //Anwendungsbeispiel
    $oValidator = new Validator();

    $oValidator->isValid("http://sklueh.de", 'url'); //true
    $oValidator->isValid("http:/%$$^1sklueh.de", 'url');//false
    $oValidator->isValid("http://sklueh.de", 'url|min_length[16]|max_length[20]|required'); //true
    $oValidator->isValid("http://sklueh.de", 'url|min_length[17]|max_length[20]|required'); //false
    $oValidator->isValid("http://sklueh.de", 'url|min_length[10]|max_length[15]|required'); //false
    $oValidator->isValid("39.91", 'greater_than[39.90]'); //true
    $oValidator->isValid("40", 'greater_than[39.90]'); //true
    $oValidator->isValid("39.90", 'greater_than[39.90]'); //false
    $oValidator->isValid('2', 'match[1,2]'); //true
    $oValidator->isValid('3', 'match[1,2,5,7]'); //false
    $oValidator->isValid('o_O?', 'match[lol,rofl,o_O?,lololol,l000000l]'); //true
    $oValidator->isValid(md5('my_password'), 'equals['.md5('my_password').']'); //true
    $oValidator->isValid(md5('my_password'), 'equals['.md5('my_wrong_password').']'); //false
    $oValidator->isValid("1.1.2012", 'date'); //true
    $oValidator->isValid("30.2.2012", 'date'); //false
    $oValidator->isValid("2.2012", 'date'); //false

    Validator
    Diese Klasse kümmert sich um die Interpretation der Suchmuster.

    class Validator
    {
        public function isValid($mValue, $mPattern)
        {
            $aPatterns = explode("|", $mPattern);
           
            foreach( (array) $aPatterns as $sRule) //Alle definierten Regeln durchlaufen
            {
                $aRuleParams = $this->detachParams("[", "]", $sRule); //Zusätzliche Parameter von dem Regel-String lösen
                $oReflectionMethod = new ReflectionMethod($sValidationClass = "ValidatorRules", 'check_'.$sRule);
                if(!$oReflectionMethod->invoke(new $sValidationClass(), $mValue, $aRuleParams)) return false; //Methode für Validierung aufrufen
            } return true;
        }
       
        public function detachParams($cFirstChar, $cSecondChar, &$sRule)
        {
            preg_match_all("/\".$cFirstChar."(.*?)\".$cSecondChar."/", $sRule, $aMatches);
            $sRule = preg_replace("
    /\\[(.*?)\\]/", "", $sRule);
            return $aMatches[1];
        }
    }

    Lightweight Validator in PHP weiterlesen