Kategorien
PHP PHP 7

PHP How to debug Segmentation Faults

Um Segementation Faults, die gerne in PHP7 zur Zeit auftreten zu bestimmen und zu analysieren, kann man folgender Weise vorgehen

1. Angabe des Speicherortes für die Coredumps

echo '/tmp/coredump_%e_%p' > /proc/sys/kernel/core_pattern

2. aktivieren der Coredumps in PHP-FPM

in der Datei: php-fpm.conf:

rlimit_core = unlimited     ; vorher: 0

3. PHP FPM restarten

service php-fpm restart

4. Analysieren der Coredumps mit gdb

Kategorien
PHP

SSH Verbindung mit PHP

Um eine SSH Verbindung mit PHP zu erstellen, gibt es mehrere Möglichkeiten:

Die saubere Lösung: Verbinden mit PHP-SSH2

Dazu muss die das Package php-ssh2 installiert werden, siehe php.net.

    $connection = ssh2_connect($host, $port);
    if(ssh2_auth_password($connection, $user, $password)){
        $stream = ssh2_exec($connection, $command);
        stream_set_blocking($stream, false);
        $stream_out = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO);
        $result = stream_get_contents($stream_out);
    }

Quick and dirty: Verbinden mit exec()

Einfach über die Console des Betriebsystems (sshpass sollte installiert werden, damit das Passwort mitangegeben werden kann).

$command = 'sshpass -p "'
    . $password
    . '" ssh -p '.$port.' '
    . $user. '@'. $host. ' "'
    . $sshCommand.'" ';
$result = exec($command);

Fingerprint umgehen bei wechselnden Ports

$command = 'sshpass -p "'
    . $password
    . '" ssh -p '.$port.' -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no '    
    . $user. '@'. $host. ' "'
    . $sshCommand.'" ';
$result = exec($command);

In dem Beispiel wird mittels der Parameter

-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no

die Fingerprint-Validierung umgangen, was man im Livebetrieb nicht machen sollten, bzw. man sollte sich den Fingerprint vorher auf der Console der Servers besorgen und dann benötigt man diese Parameter nicht.

 

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: