Kommunikation zwischen C++ und PHP



  • Hallo,

    ich habe das folgende kleine Problem. Auf einer Webseite von mir soll der Benutzer per Klick eine C++ Datei starten können. Diese erwartet irgendwann einen Input(eigentlich eine Reihe von Inputs, die man aber komplett in einem Rutsch abhandeln kann) vom Benutzer. Das Ergebnis muss dann wieder zurück zum C++ Programm geschickt werden, welches solange nicht weiterarbeiten soll. Prinzipiell soll einfach nur ein Array mit Informationen an PHP geschickt werden und nach Auswertung des Inputs wird ein Array zurückgeschickt.

    Ich habe jetzt schon ein bisschen recherchiert und denke, dass ich das mit libcurl realisieren muss. Allerdings ist das Tutorial auf der offiziellen Seite ein bisschen dürftig und ich habe noch nicht so ganz verstanden, wie ich das Problem jetzt letztendlich lösen kann.

    Wenn mir da jemand weiterhelfen könnte, evtl. sogar mit einem Beispiel(!)Code, der ähnliches leistet, dann wäre mir sehr geholfen.

    Vielen Dank!



  • Takhlahr schrieb:

    Auf einer Webseite von mir soll der Benutzer per Klick eine C++ Datei starten können.

    Wo? Doch nicht etwa auf dem Rechner des Benutzers? Denn das wird niemand machen.
    Wenn du vom Server redest, kannst du das mit CGI machen.

    Diese erwartet irgendwann einen Input(eigentlich eine Reihe von Inputs, die man aber komplett in einem Rutsch abhandeln kann) vom Benutzer. Das Ergebnis muss dann wieder zurück zum C++ Programm geschickt werden, welches solange nicht weiterarbeiten soll.

    Das kannst du mit Forms und FastCGI machen. Im Unterschied zu CGI wird das Modul nach Fertigstellung des "Auftrags" nicht beendet, Sessions sind so also leicht zu verwirklichen.

    Prinzipiell soll einfach nur ein Array mit Informationen an PHP geschickt werden und nach Auswertung des Inputs wird ein Array zurückgeschickt.

    Wie kommt jetzt aus heiterem Himmel PHP ins Spiel?



  • Wenn's eine Website ist, die PHP benutzt und eine executable ausführen will vielleicht?
    Das hat nichts mit C++ zu tun. Sieh dir in PHP mal:
    system(), passthru(), exec() und shell_exec() an.



  • Hallo,

    mal der Reihe nach:

    Ja, die Datei wird natürlich auf dem Webserver mittels exec() ausgeführt. Der Benutzer soll gar nicht wissen, was da genau passiert.

    Das Ausführen der Datei ist nicht das Problem, sondern dass das Programm an einer Stelle unbedingt den Input des Benutzers braucht. Jetzt muss ich irgendwie die Inputforderung vom C++ Programm auf die Webseite umleiten, so dass dort mit PHP ein Formular erstellt wird, mit dem der Benutzer den Input verwirklichen kann. Das Ergebnis der Auswertung des Formulars muss wieder zurück an das C++ Programm geschickt werden.

    Gerade die Kommunikation in die beiden Richtungen ist mein Problem. Ich weiß einfach nicht, wie ich das bewerkstelligen soll.



  • via CGI



  • Oh okay, aber mit CGI habe ich noch nie zu tun gehabt.

    Aber nur damit ich dann den Ablauf richtig verstehe:

    1. Benutzer klickt einen Button (Webseite mit PHP erstellt) -> C++ Programm startet
    2. C++ Programm ruft an besagter Stelle ein cgi-Skript auf
    3. Im CGI-Skript wird das Formular erzeugt und dann was?

    edit: hier folgt natürlich, dass der Benutzer das Formular ausfüllt und auf Abschicken klickt.

    4a) Die Daten werden an ein anderes CGI-Skript geschickt, welches die Daten zurück zum Programm schickt, oder
    4b) Das gleiche Skript kann auch die Rückantwort handeln

    5.) Ja, wie komme ich dann nach Beenden des Programms wieder an die richtige Stelle in meinem PHP (im ersten Punkt)?

    Irgendwie blicke ich das noch nicht so ganz, sry.



  • Nein das C++ "program" ist CGI. Du kannst dann z.B. mit redirect arbeiten.



  • Aha, das vereinfacht dann natürlich die Sache ungemein. Gibt es dazu irgendwo dazu zufällig ein Link, dass ich mir mal einen Beispielcode anschauen kann, der ähnliches leistet?

    Sowas wäre ungemein hilfreich, da mit Beispielen eher das Verständnis kommt. 🙂





  • Wie wäre es, wenn du den Benutzer die Daten eingeben lässt, die du im C++ Programm brauchst, diese in einer Datei speicherst, welche dann ggf. vom C++-Programm geladen wird.



  • @labra (oder wie auch immer)
    Danke für den sehr konstruktiven Beitrag. Wenn ich nicht schon den halben Tag im Netz suchen würde und nichts wirklich finde, dann würde ich hier nicht posten. Deinen Postcount kannst du woanders erhöhen.

    @ideenbringer

    So einfach ist das leider nicht. Das C++ Programm verarbeitet etwas und die Inputforderung ist leider sehr dynamisch je nach Verarbeitung. Was genau der Benutzer also eingeben muss, wird erst zur Laufzeit ermittelt.



  • Takhlahr schrieb:

    @labra (oder wie auch immer)
    Danke für den sehr konstruktiven Beitrag. Wenn ich nicht schon den halben Tag im Netz suchen würde und nichts wirklich finde, dann würde ich hier nicht posten. Deinen Postcount kannst du woanders erhöhen.

    Du hast bisher nichts an Code gepostet, hast einige Posts gebraucht bis du (nach Erklärung) verstanden hast, dass dein C++-Programm das CGI-Script ist, und schreist dann nach Code oder Links. Ein kurzes Googlen hat mir dann auf einen Schlag viele Tutorials mit ganz viel Beispielcode ausgespuckt. Es existiert mit freeCGI++ ein eigenes Framework.
    Und das Galileo-Buch
    http://www.hs-augsburg.de/~sandman/c_von_a_bis_z/c_026_000.htm
    Hält auch einiges an Info parat, wie die ganze Sache funktioniert. Zwar C - aber so weit ist C++ da auch nicht von entfernt.



  • l'abra d'or schrieb:

    [...]

    leider komplette themenverfehlung. das problem ist ein ganz anderes. aber nice try.

    @Takhlahr:
    schau dir mal die PHP Funktion proc_open an. Damit kannst du über pipes mit der C++ Anwendung kommunizieren. Das gelbe vom Ei ist das zwar nicht, aber vermutlich das sinnvollste. Wenn wir mal davon ausgehen dass die C++ Anwendung nicht änderbar ist.



  • Takhlahr schrieb:

    1. Benutzer klickt einen Button (Webseite mit PHP erstellt) -> C++ Programm startet
    2. C++ Programm ruft an besagter Stelle ein cgi-Skript auf
    3. Im CGI-Skript wird das Formular erzeugt und dann was?

    edit: hier folgt natürlich, dass der Benutzer das Formular ausfüllt und auf Abschicken klickt.

    4a) Die Daten werden an ein anderes CGI-Skript geschickt, welches die Daten zurück zum Programm schickt, oder
    4b) Das gleiche Skript kann auch die Rückantwort handeln

    5.) Ja, wie komme ich dann nach Beenden des Programms wieder an die richtige Stelle in meinem PHP (im ersten Punkt)?

    Das klingt für mich schon so, als liese sich das mit CGI lösen. Denn die Benutzereingaben scheinen bei dem Script nicht interaktiv zu erfolegen (wie z.B. bei nem Konsolenprogramm bei einem "cin" der User was eingeben muss) - Die Interaktion geschieht über HTML-Formulare. Da sollte es keine Prozesse incl. Prozesskommunikation brauchen.
    Aber ich bin mir erst sicher, wenn sich der OP sicher ist 😉



  • Also, das ist so. Das Programm läuft momentan so, dass es vom Benutzer per std::cin Eingaben erwartet. Die Anzahl der Eingaben hängt von dem ab, was das Programm gerade macht, ist aber unwichtig. Wichtig ist nur, dass jedesmal wahrscheinlich eine andere Anzahl von Eingaben benötigt wird.

    Die Eingabe des Benutzers ist nichts anderes, als dass er eine Anzahl von x Elemente, auch alle auf einmal, benennen muss. In der momentanen Version (offline) kann er noch eintippen, was er will. Da aber die Menge an erwünschten Eingabemöglichkeiten sehr begrenzt ist, wollte ich den Benutzer für jedes (von den x) Benennungen ein Auswahlfeld (html-Formular) spendieren, bei dem er dann das passende auswählt. Das Auswahlfeld soll für jede der x Elemente genau die gleichen Auswahlmöglichkeiten haben.

    Im Prinzip sollte die Eingabeform also aus x Auswahlfeldern in einem Formular bestehen. Das wäre für den Benutzer die angenehmste Variante. Das Ergebnis soll dann wieder an das Programm geschickt werden, so dass dieses dann weiter arbeiten kann. 🙂

    Ich hoffe, das Problem ist jetzt genauestens geschildert. 🙂

    edit: habe noch ein paar Details hinzugefügt



  • Ich denke, das wird nicht so funktionieren wie du dir das denkst. Benutzerinteraktion zwischen Browser und Applikation (Script auf dem Server) funktioniert anders als ein lokal laufendes Programm (Console oder GUI). Bei zweiterem hast du immer einen aktuellen State, du kannst eingreifen wann du willst. Deine Objekte sind immer verfügbar.
    Bei einer Webseite ruft der Browser ein bestimmtes Dokument mit Parametern (per GET oder POST übergeben) auf. Das Programm rechnet auf dem Server etwas rum und produziert ein HTML-Dokument. Dieses wird nun zurück an die anfordernde Stelle (unser Browser) geschickt. Sobald das eingeleitet ist - unser Script ist fertig - gibt es keinen Status unserer Applikation mehr. Insbesondere haben wir keinen Zugriffmehr auf die Variablen im Script, welches gerade terminiert hat!
    Das ist deshalb entscheidend denn:

    1. Du willst Dein C++_Programm aufrufen, welches rechnet und dann vom User eine Eingabe will. Dazu soll jetzt der Server dem Browser ein Eingabeformular schicken. Dass dieses geschieht muss aber das aktuelle PHP-Script abgebrochen werden und das Formular versandt werden. Auf das laufende Programm (proc_open) haben wir keinen Zugrif mehr!
    2. Ein Absenden des Formulars startet ein neues Script am Server, das mit dem Alten nichts zu tun hat. Auch wenn es theoretisch die gleiche PHP-Datei (oder CGI-Script etc.) ist.

    Darum denke ich musst du dein Script umschreiben, dass es über CGI aufrufbar ist. Dann kann dein Script rechnen und ein Formular generieren, welches der User ausfüllt. Die eingetragenen Daten werden per POST/GET wieder an dein CGI-Script geschickt und dort wieder verarbeitet. USW.

    Eine Alternative wäre evtl. Ajax. Da kannst du dir dynamisch Inhalt nachladen. Aber ich denke auch hier kannst du nicht einen ständig offenen Prozess über mehrere Aufrufe hinweg betreiben 😞


Anmelden zum Antworten