Kategorien
PHP Server Administration

Nagios Plugins mit PHP schreiben

Nagios Plugins zum Monitoring von Servern und Funktionalitäten kann man in jeder verfügbaren Sprache schreiben. Die einzige Regel, an die man sich halten muss ist, dass der Return Code des Scriptes und der Response Text (enthält auch die Performance Daten) nach einem bestimmten Schema aufgebaut werden muss.

Als Hilfe kann man die Klasse NagiosPlugin benutzen, um Plugins zu schreiben:

abstract class NagiosPlugin {

    /**
     * @var boolean
     */
    protected $verbose = false;

    /**
     * setVerboseModeFromArgv
     * @see https://nagios-plugins.org/doc/guidelines.html#AEN41
     *
     * @param $argv
     * @return void
     */
    public function setVerboseModeFromArgv($argv) {
        if(in_array('-v', $argv)){
            $this->verbose = true;
        }
    }

    /**
     * addVerboseMessage
     *
     * @param $message
     * @return void
     */
    protected function displayVerboseMessage($message){
        if($this->verbose){
            echo $message.PHP_EOL;
        }
    }

    /**
     * endWithStatusOk
     * @see https://nagios-plugins.org/doc/guidelines.html#AEN200
     *
     * @param string $message
     * @param string $performanceData has format "nameOfData=value"
     * @return void
     */
    protected function endWithStatusOk($message, $performanceData){
        print "OK - $message".$this->addPerformaceData($performanceData);
        exit(0);
    }

    /**
     * endWithStatusWarning
     *
     * @param string $message
     * @param string $performanceData
     * @return void
     */
    protected function endWithStatusWarning($message, $performanceData){
        print "WARNING - $message".$this->addPerformaceData($performanceData);
        exit(1);
    }

    /**
     * endWithStatusCritical
     *
     * @param string $message
     * @param string $performanceData
     * @return void
     */
    protected function endWithStatusCritical($message, $performanceData){
        print "CRITICAL - $message".$this->addPerformaceData($performanceData);
        exit(2);
    }

    /**
     * endWithStatusUnknown
     *
     * @param string $message
     * @param string $performanceData
     * @return void
     */
    protected function endWithStatusUnknown($message, $performanceData){
        print "UNKNOWN - $message".$this->addPerformaceData($performanceData);
        exit(3);
    }

    /**
     * addPerformaceData
     *
     * @param string $performanceData
     * @return string
     */
    private function addPerformaceData($performanceData){
        $result = '';
        if(!empty($performanceData)){
            $result = ' | '.$performanceData;
        }
        return $result;
    }
}

 

Kategorien
PHP PHPUnit Testing

PHPUnit @Depends Variablen im @Dataprovider verwenden

Leider ist es zur Zeit nicht möglich für einen PHPUnit Test sowohl einen anderen Test als Vorraussetzung für einen Test zu markieren, damit die Ausführung des Tests im Fehlerfall nicht stattfindet, und gleichzeitig einen Dataprovider für den Test zu verwenden der auf das Ergebnis einen vorherigen Tests zugreift. Das liegt daran, dass Dataprovider vor dem Durchlaufen der Tests initilisiert werden von PHPunit.

Das Problem

class StackTest extends PHPUnit_Framework_TestCase {
    protected static $foo;

    public function provider() { 
        print_r( self::$foo); //does not work
    }

    /**
     * @dataProvider provider
     */
    public function testOne() {
        self::$foo = array();
    }

    /**
     * @depends testOne
     * @dataProvider provider
     */
    public function testTwo( $data ) { 
    }

Kategorien
PHP 7

PHP7 Soap Server Bug Ticket

I have opened a ticket for the problems caused by the PHP internal Soap Server handling responses with references in class member variables.

The Test Script (works with PHP 5.3, crashes in PHP7)

Kategorien
CodeIgniter Framework

PHPUnit mit Codeigniter 3 installieren

Um PHPUnit mit Codeigniter 3 zu verwenden benötigt man die Erweiterung ci-phpunit-test die mindestens PHP Version 5.4 voraussetzt.

Die neuste Version von PHPunit benötigt PHP 5.6, es sollte also eine möglichst aktuelle PHP Version installiert sein.

Als kann PHPUnit installiert werden.

Dann kann man den application/test Ordner aus dem downloadbaren .zip Archiv von ci-phpunit-test in das Codeigniter Projekt entpackt werden.

Kategorien
PHP

Das Soap Protokoll, XML und PHP – eine Einführung

Das Soap (Simple Object Access Protocol) ist eine Netzwerkprotokoll, mit dessen Hilfe Daten zwischen Systemen ausgetauscht und Remote Procedure Calls durchgeführt werden können (Wikipedia).

Meistens werden Nachrichten im XML Format mittels eines HTTP Post-Request im Body zwischen einem Client und einem Server gesendet. Für das Nachrichtenformat wird kein Format vorgegeben, sondern nur ein Framework zur Verfügung gestellt. Verwandte System sind REST und Cobra. Alle Systeme dienen zur Entkopplung/Abstraktion und Interoperabilität von Applikationen und dienen als Middleware zwischen verschiedenen Applikationen, die unterschiedliche Programmiersprachen oder Technologien verwenden können.

Die Vorteile werden durch leicht erhöhten Rechenaufwand und erhöhtem Datenvolumen erkauft.

Der Aufbau einer XML Soap Nachricht

Kategorien
PHP PHP 7

PHP 7 – die neuen Funktionen im Überblick – Teil 2

Expectations

Mit Expactations lassen sich Stellen im Code markieren, die eigentlich nicht erreicht werden sollen, aber falls doch, eine Nachricht in der Produktionsumgebung hinterlassen könnnen, um anderen Programmierern beim Debuggen und verstehen des Codes zu helfen. Der Parameter expression wird ausgewertet und bei einem false-Wert wird eine AssertionException geworfen.

Definition:

void assert (mixed $expression [, mixed $message]);

Die php.ini Konfigurationsvariable zend.assertions kann 3 Wert annehmen

Kategorien
PHP PHP 7

PHP 7 – die neuen Funktionen im Überblick – Teil 1

PHP 7 ist in aller Munde und kommt mit einer Reihe syntaktischer Verbesserungen und neuen Features herbei. In Zukunft sind PHP-Applikationen nicht nur schneller, sondern nähern sich dem Java-Syntax weiter an. Endlich kann man festlegen, welche Datentypen in Funktionen herein und welche wieder heraus kommen sollen (Parameter Type Declarations und Return Type Declarations), wodurch die Wartbarkeit des Codes verbessert werden kann.

Parameter Type Declarations und Return Type Declarations

In PHP >=5.3. war es schon früher möglich Funktionsparametern, einer Input Variablen einen Objekttyp zuzuweisen, den die Funktion erwartet hat, um anderen Programmierern die Verwendung der Funktion zu erleichtern/zu dokumentieren und eine Exception zu generieren, wenn ein Objekt eines anderen Typs verwendet wird:

Kategorien
Docker PHP PHP 7 Symfony

Docker PHP7 und Symfony3 Image mit MySQL und phpMyAdmin

Für die lokale Entwicklung mit Symfony3 und PHP7 habe ich mir das folgende Docker Image zusammengebaut, welches die folgenden Features beinhaltet:

Kategorien
Yii Framework

Yii Relation über mehrere Tabellen und Models benutzen

Es gibt einen sehr einfachen Syntax, um einfache Relationen, die in verschiedenen Models definiert sind zu bneutzen und so einen Join über mehrere Tabellen zu erzeugen:

$criteria->with[] ='model1.model2.model3';
$criteria->compare('model3.name', $this->attribute_search, true );

Dies wird meistens bei einer Gridview benutzt, die eine Suche auf einem Attribut durchführen soll, dass in einem verbunden Model liegt.

 

Kategorien
Yii Framework

Yii custom CButtonColumn in Gridview

Dieser Button hat ein eigenes Image über Bootstrap mittels der Klasse icon-download und wird in einem neuen Tab geöffnet.

   array(
                'class' => 'zii.widgets.grid.CButtonColumn',
                'template'=>'{pdf}',
                'buttons'=>array(
                    'pdf' => array(
                        'url' => 'Yii::app()->createUrl("/con/action",array("id"=>$data->id))', 
                        'options' => array('target' => '_blank', 'class' => 'icon-download'),
                        'label' => '',
                        'imageUrl' => false,
                    ),