lebhaft diskutieren
  • Offene Seminare
  • Artikel
    • Cum grano salis
    • Hintergrund
    • Analyse
    • Dossier
    • Technik
 

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
 
KontaktImpressumJobs


11 Mai 08

Der taiwanesische Konzern BenQ

Interkulturelle Kompetenz, oder: Anglizismus mal anders.


18 September 07

Trainertypologie

Verschiedene Arten der Personalentwicklung. Mit einer Prise Salz zu geniessen!


25 Februar 07

PotemkiPoint

Zahlenspiele mit PowerPoint


14 Februar 07

Unternehmer im Unternehmen.

Oder: Zu welchem Typ gehören Ihre Mitarbeiter?


28 Dezember 06

Manchmal kann man gar nicht anders...

als laut aufzustöhnen. Ein Schrottargument.


zum Archiv ->
.