Apache, MySQL und PHP

Unter Ubuntu (hier: 18.04) einen Webserver mit Apache, MySQL und PHP zu installieren ist nicht weiter schwierig. Es sollte reichen, folgendes zu tun:

Dabei natürlich eventuell die passende PHP-Version einsetzen und ggf. weitere Module installieren (Tip: php7.2-mbstring nicht vergessen, das wird gern übersehen und führt dann zu wunderlichen Fehlern!).

sudo apt install apache2 mysql php7.2 php7.2-cli

Kontrollieren kann ich das durch die Anzeige der Versionen mittels “php -v” und “mysql -v”. Den Webserver starte ich mit

sudo systemctl enable apache2
sudo systemctl restart apache2
sudo update-rc.d apache2 defaults    # immer beim Booten starten

Üblicherweise mache ich dann eine kleine Testdatei i.php mit dem Inhalt

<?php phpinfo()

die ich im Browser aufrufe

localhost/i,php

und die mir alle relevanten Parameter des Webservers und von PHP selbst anzeigt. Anzeigen soll – denn meist geht es trotzdem nicht!? Was ist der Grund dafür?

Es hat sich herausgestellt, dass das Fehlen des gestarteten “FastCGI Process Manager (FPM)” von PHP die Ursache ist. Also eines Werkzeuges, das eigentlich nur zum Beschleunigen der Abarbeitung von PHP dienen sollte, aber offenbar grundsätzlich für dessen Funktion in einem Webserver verantwortlich ist (wer näheres dazu weiß, kann das bitte gern unten kommentieren!). Also bitte noch zusätzlich PHP-FPM installieren und starten:

sudo apt install php7.2-fpm
sudo systemctl enable php7.2-fpm
sudo systemctl start php7.2-fpm
sudo update-rc.d php7.2-fpm defaults    # immer beim Booten starten

Jetzt sollte auch der Test im Browser klappen und das auch nach dem nächsten Reboot. Hinweis: Natürlich kann man Dienste auch meist über

sudo service <dienstname> start|stop|restart
sudo /etc/init.d/<dienstname> start|stop|restart

steuern.

Weitere Informationen:
www.webhostinghero.com/ubuntu-apache-php-fpm/

PHP: Ein erweiterter SOAP-Server

Ich möchte einen Lösungsweg beschreiben, der aus meiner praktischen Arbeit entstanden ist und so nicht im Internet in einer geschlossenen Dokumentation zu finden war. Da es kein Betriebsgeheimnis ist, hoffe ich ein gutes Werk zu tun.

Normalerweise besteht ein SOAP-Server in PHP im Kern aus drei Zeilen:

<?php
try {
     $server = new SoapServer($meine_wsdl_url);
     $server->setClass('meine_klasse_mit_funktionen');
     $server->handle();
} catch(SoapFault $e) {
     echo "Fehler SOAP-Server: $e";
}

class meine_klasse_mit_funktionen {

    public function f1($object1) {
        return $object1->wert1;
        // wert1 wird vom Client der Gegenstelle empfangen
    }
}
?>

Zum eigentlichen Server, der mit handle() endet, kommt eine Klasse ‘meine_klasse_mit_funktionen’, die die benötigten Funktionen enthält, wie sie auch im ggf. vorhandenen WSDL-File definiert sind und die nicht instantiiert wird. Die Funktionen wie f1($object1) werden vom Client der Gegenstelle aufgerufen, was hier nicht behandelt werden soll.

Mein Problem war nun, dass ich noch nie was mit SOAP zu tun hatte und außerdem der Auftraggeber seine diesbezüglichen Schnittstellen nicht für den Anfänger dokumentiert hat. Besonders einige Eigenheiten des verlangten XML-Headers machten mir Probleme. Also musste ich nach einer Lösung dafür suchen, wie ich die gesamte Nachricht vom Client des Auftraggebers zunächst mal sichtbar machen konnte. Ich sah immer nur das Ergebnis (oder besser gesagt keins, denn es funktionierte lange nichts…), aber “dazwischen” konnte ich nichts sehen.

Die Lösung ist recht einfach, war aber für mich eher ein Zufallsfund. Mittels

$xmlstring = file_get_contents('php://input');

hat man die gesamte empfangene Zeichenkette in der Variable $xmlstring. Diese kann ich in eine Date test.xml schreiben und vom Opera-Browser aufrufen. Nebenbei: Firefox ist dafür ungeeignet, denn der interpretiert die vorkommenden Namespaces als nicht erkennbar und schreibt sie nicht hin! Jetzt konnte ich zumindest schon mal sehen, was bei mir ankommt.

Nun war es noch nötig, einzelne Attribute und deren Werte  auszulesen. Eine Hürde dabei war, dass alle Attribute an verschiedene Namespaces geknüpft sind. Das verhindert nämlich das einfache Auslesen als einfaches XML-Element, wie es zum Beispiel hier gemacht wird. Meine Lösung sieht schematisch wie folgt aus:

$xml = new SimpleXMLElement($xmlstring);
$xml->registerXPathNamespace('wsse', $mein_security_namespace);
$attribut_wert = $xml->xpath('//wsse:username');

Damit kann ich auf jedes Element samt Namespace zugreifen und vielleicht eine Abfrage der Anmeldedaten realisieren.

Insgesamt kommt dabei folgendes als grobe Vorlage heraus:

<?php

$xmlstring = file_get_contents('php://input');

$xml = new SimpleXMLElement($xmlstring);
$xml->registerXPathNamespace('wsse', $mein_security_namespace);
$attribut_wert = $xml->xpath('//wsse:username');

if('MaxMustermann' == $attribut_wert) {

  try {
    $server = new SoapServer($meine_wsdl_url);
    $server->setClass('meine_klasse_mit_funktionen');
    $server->handle();
  } catch(SoapFault $e) {
    echo "Fehler SOAP-Server: $e";
  }
} // if

class meine_klasse_mit_funktionen {
  public function f1($object1) {
    return $object1->wert1;
    // wert1 wird vom Client der Gegenstelle empfangen    
  }
}
?>

Ich hoffe, es kann dem einen oder anderen helfen. Kommentare sind ausdrücklich erwünscht 🙂 !

2008

  • Dr. Höher Innovationsmanagement, Altlandsberg
  • Intranet-Projekt kommunale Software, Berlin,
    Umstellung von ursprünglich in Clipper erzeugtem Code
  • *** Browseranwendung für Messdaten- und Produktverwaltung, BGF Berlin
    (ständige Pflege und Weiterentwicklung)
    starke Anwendung von Ajax mit dem xajax-Framework

2001 – 2006

Mehrere kleinere Web-Projekte:

  • Diskussionsforum für die Hochschule Mittweida, erstmalig mit PHP und Textfile-Datenbank
  • * Anhänger Schuhknecht, Leipzig (inzwischen fremd verändert)
  • Hochzeitsausstatter Bachmann, Leipzig (inzwischen durch S. Wentzlau weiter gepflegt)
  • V-Net4you, Salzmünde, inzwischen fremd verändert
  • Eurotouring Ltd. & Co. KG, Leipzig
    Angebotserstellung und Buchung von Busreisen online mithilfe JavaScript
  • Thomas Schlecht Baumaschinen, Leipzig