Druckversion:

Inhalt

  1. Auftrag
  2. Problem
  3. Lösung

Auftrag

Entwicklung einer Typo3 Erweiterung, die ein Formular anzeigt, die Benutzereingabe an ein C Programm weitergibt und die Ausgabe wieder in Typo3 anzeigt.

Auf UNIX/LINUX/BSD Systemen, auf denen die Mehrheit der Webserver laufen, gibt es jede Menge praktische und schnelle Kommandos. Genannt seien grep, sed, awk, sort und zahllose andere.

Es bietet sich daher an, auch in CGI-Skripten auf diese Kommandos zurückzugreifen. Das macht man normalerweise mit
echo exec('whoami');
oder mit
echo passthru('ls -l');
Wichtig ist immer wenn Daten von Benutzern in solchen Aufrufen verbeitet werden, diese Daten erst durch escapeshellarg() beziehungsweise escapeshellcmd() zu filtern.

Das Problem

Das Problem ist, dass manchmal umfangreiche Benutzeringaben erst in einer temporären Datei zwischengespeichert werden müssen. Um den Dateinamen dann dem Unix-Kommando zu übergeben. Das unschöne ist, dass man bei http://de2.php.net/manual/en/function.tmpfile.php den Namen der Datei nicht kennt, und bei http://de2.php.net/manual/en/function.tempnam.php ist man selbst für das Löschen der temporären Datei verantwortlich. Bei unerwartetem Programmabbruch kann es so also zu einer Vermüllung mit temporären Dateien kommen. Abgesehen von eventuellen Problemen mit den Benutzerrechten.

Eine Lösung

Eine hübsche Alternative ist manchmal die Verwendung von Pipes direkt von PHP aus, wie es das Kommando proc_open() erlaubt. Diese Technik setzen wir auch in fast allen selbstentwickelten Typo3-Extentions (die in php programmiert werden) ein.
$descriptorspec = array(  
  0 => array("pipe", "r"),  // stdin
  1 => array("pipe", "w"),  // stdout
);

$process = proc_open("/usr/local/bin/beispiel",
$descriptorspec, $pipes);
if (is_resource($process)) { // Auf stdin schreiben fwrite($pipes[0], "Beispieltext"); // stdin schliessen = Eingabe beenden
fclose($pipes[0]); // Jetzt noch stdout in $result einlesen while(!feof($pipes[1])) { $result.=fgets($pipes[1], 1024); } // stdout schliessen fclose($pipes[1]); // Prozess beenden und Ergebniscode abfragen $return_value = proc_close($process); // Für Typo3 Plugins: Content-Variable schreiben $content = $result; }
In diesem Sinne Ihr Timm Reinisch