PHP Daten austausch zwischen einem C Programm und einem php-Skript

Mathias09876

Ensign
Registriert
Nov. 2010
Beiträge
235
Hallo zusammen,

ich habe hier folgendes Problem:

Ich habe ein C Programm, welches Daten aus einem System ausliest. Diese Daten würde ich nun gern über einen Webserver abrufbar machen. Dazu habe ich bisher durch das C Programm dynamisch eine HTML Datei generieren lassen und sie durch ein PHP-Skript alle x Sekunden ausgelesen. Wenn die Aktualisierungsrate nicht sehr hoch ist funktioniert das auch soweit, wenn man aber beispielsweise jede Sekunde aktualisiert kracht es irgendwann, da dann ein Moment erwischt wird, an dem sowohl C als auch PHP auf die Datei zugreifen.

Die Idee war jetzt, ob man nicht evtl mit Shared Memory arbeiten könnte, d.h. C schreibt in den Shared Memory und PHP liest die Daten aus.
Jetzt soll das ganze allerdings unter Windows laufen und ich bekomme es leider nicht hin mit PHP grundsätzlich in den Shared Memory zu schreiben bzw. zu lesen.
Ich bekomme immer die Fehlermeldung "Call to undefined function shmop_open()". Offenbar ist die shmop-Extension nicht aktiviert nur wie aktiviere ich diese? Bei einer Google-Suche habe ich mehrfach gelesen, dass es unter Windows garnicht möglich ist shmop zu nutzen. Stimmt das?

Oder hat jemand noch eine bessere Idee, wie ich den Datenaustausch zwischen den beiden Programmen realisieren kann?

Hoffe ihr habt da eine Idee oder einen Tipp!

Danke, Grüße
Mathias
 
Wenn das C Programm eine HTML Datei erzeugt, wozu dann noch PHP? Dann kannst du die fertige HTML Seite doch vom Webserver servieren lassen.

Wenns gar nicht anders geht, würde ich von PHP aus das Programm direkt aufrufen und das Programm sollte seine Ausgabe direkt nach stdout schreiben. So brauchst du keinen Umweg über das Dateisystem.

Von der Shared Memory Geschichte würde ich die Finger lassen. Das bringt nur unnötig Komplexität in ein System, wo es nicht nötig ist.
 
Zuletzt bearbeitet:
Bitte lies http://theserverpages.com/php/manual/en/ref.shmop.php die "Note:"

Einfach nur Shared Memory nutzen bringt dir auch nix: du hast EXAKT das gleiche Problem wie beim Austausch via Datei. Die Race Condition wird nur seltener getriggert weil shared memory viel schneller ist als das Dateisystem. Du musst mittels Semaphoren den Zugriff auf die Datei/Shared Memory begrenzen. D.h. nur wer grade das Semaphore hat darf lesen oder auch schreiben
 
Wie wärs mit Sockets ? Also Client Server Modell ohne jetzt zu wissen was dein Programm bezwecken soll.
 
Troublegum schrieb:
Wenn das C Programm eine HTML Datei erzeugt, wozu dann noch PHP? Dann kannst du die fertige HTML Seite doch vom Webserver servieren lassen.

Ja, das ist leider eine Vorgabe. Das primäre Ziel ist es die Daten an das PHP Programm zu geben, welches dann eine interkative Benutzeroberfläche bietet.

Troublegum schrieb:
Wenns gar nicht anders geht, würde ich von PHP aus das Programm direkt aufrufen und das Programm sollte seine Ausgabe direkt nach stdout schreiben. So brauchst du keinen Umweg über das Dateisystem.

Das klingt vielversprechend, wie würde ich die Daten dann mit PHP einlesen?

Danke für die Hilfe!

Grüße
 
Hallo Mathias,


wenn dein C Programm die Ausgabe in stdout schreibt, kannst du mit PHP das Programm mit passthru () aufrufen und die Ausgabe anzeigen lassen. http://de.php.net/manual/de/function.passthru.php

Das Resultat ist dann natürlich, dass bei jedem Seitenaufruf das C Programm aufgerufen wird. Wenn das nicht zu lange dauert bzw performance-technisch ok ist...
EDIT: Zur Not kannst du das Zwischenspeichern/Cachen in einer .html Datei ja dem PHP Skript überlassen.
 
Zuletzt bearbeitet:
Hallo,

danke für die Hilfe. Werde das gleich mal testen.
Die Performance sollte in diesem Fall kein Problem darstellen.

Grüße
Ergänzung ()

Okay, das mit dem passthru funktioniert soweit, nur ein Problem habe ich noch:

In einem ersten Testprogramm in C gebe ich einfach einen string per printf aus.
Dieser String wird mir durch das PHP skript aber ebenfalls sofort ausgegebn und nicht, wie erwartet, in einer Variablen abgelegt. Woran kann das liegen?

Grüße
 
Zurück
Oben