2015-10-28 15 views
10

Ich habe eine Frage bezüglich der betitelten Frage. Ich versuche also, ein Programm zu erstellen, das Daten/Anfragen für Daten zwischen einem Programm in C++ und einer PHP-Site, die von einem Apache-Webserver läuft, übergibt.Wie richte ich die Kommunikation zwischen PHP und C++ ein?

Ich habe Socket-Kommunikation erforscht, aber ich verstehe das Konzept nicht. Ich verstehe, wie man ein Socket in PHP und ein anderes in C++ erstellt, und ich lasse sie mit einer Testanwendung laufen. Aber nur einzeln, nicht miteinander reden ODER mit meinem Webserver reden (das PHP ist momentan nicht auf dem Server, es ist auf einem anderen Server). Wie funktioniert das? Nach meinem Verständnis muss man eine Portnummer abhören, und die andere muss etwas an diesen Befehl senden.

Idealerweise würde ich lieber keine Bibliotheken verwenden, um mir dabei zu helfen. Ich weiß, dass diese Frage schon oft gestellt wurde, aber ich komme immer noch nicht weiter.

Könnte jemand erklären, wie das oben genannte funktioniert, oder Links zu einer Frage hier/an anderer Stelle, die hilfreich sein könnte? Oder wenn es eine bessere Methode dafür gibt als Sockets zu verwenden? Sie werden viel miteinander reden und vielleicht ein Problem beschleunigen.

bearbeiten, eine weitere Erklärung:

Webserver: Ich bin ein Apache-Webserver ausgeführt wird. Das PHP-Skript befindet sich auf diesem Server.

C++ - Speicherort: Während des Testens ist meine C++ - Anwendung auf demselben Raspberry Pi gespeichert, auf dem der Webserver ausgeführt wird. In der echten Anwendung wird meine C++ - Anwendung immer noch auf dem gleichen Gerät gespeichert (aber es wird kein Raspberry Pi sein - immer noch Linux-basiert).

Kommunikation: Das PHP-Skript muss ausgelöst werden, um Dinge durch das C++ - Skript zu tun, und umgekehrt. Sie müssen beide Daten (gemeinsame Datenstrukturen, aber sie könnten ziemlich groß sein) auf beiden Wegen weitergeben (also müssen beide in der Lage sein, Daten zu senden und zu empfangen).

+1

Sie sagen, dass PHP-Anwendung auf einem separaten Server von der C++ app ist? Wird das immer so sein? – commanderZiltoid

+2

Diese Frage ist ziemlich vage. Werden beide Programme auf demselben Server ausgeführt? Einweg- oder Zweiwegkommunikation? Ist das eine Client/Server-Beziehung? Oder vielleicht eine Beziehung zwischen Arbeiter und Queue? Wird php hinter einem Webserver ausgeführt (Apache, Ngnx usw.)? – Steve

+1

Hallo, bitte erläutern Sie Ihren Anwendungsfall, beide können kommunizieren, solange Sie dasselbe Protokoll verwenden, wenn Ihr PHP auf Webserver ist, dann ist es am besten http/https (ich nehme an, C++ ist Client und PHP ist Server). Wenn php cli ist, kann Ihre Option auf udp, tcp erweitert werden. Sie können E-Mails auch mit C++ senden und den Empfang mit PHP überprüfen, indem Sie regelmäßig wget- und cron-Jobs usw. verwenden. –

Antwort

13

Ich denke, der einfachste Weg ist:

1) PHP -> C++: tcp

2) C++ -> PHP: http

versuchen zu erklären.

1) Um etwas aus C++ App nehmen PHP verbindet sich zu dieser App mit stream_socket_client Funktion. Die C++ App überwacht Host und Port mit den Funktionen socket, bind und listen. Sobald die Verbindung kommt C++ App accept es und dann in einem separaten std::thread dient es (recv Anfrage zu bekommen, send Antwort senden). How to socket.

2) Da PHP unter Apache Web Server arbeitet, denke ich, dass der einfachste Weg die Verwendung der Bibliothek libcurl ist, um eine HTTP-Anfrage von der C++ App zu stellen. How to curl.

+0

Vielen Dank für die detaillierte Antwort. Ich werde es später in dieser Woche ausprobieren. Ich werde zurückkommen und es als meine Antwort markieren, wenn es gut funktioniert :) – mfisher91

7

Ein anderer Ansatz könnte SOAP oder REST Web Services sein. Auf beiden Seiten können Sie einen SOAP-Web-Service bereitstellen, um Daten auszutauschen oder Remote-Funktionen aufzurufen. Auf C++ - Seite können Sie Apache Axis verwenden, um einen SOAP-Server bereitzustellen. Auf PHP-Seite können Sie die integrierte SOAPServer-Klasse (http://php.net/manual/de/class.soapserver.php) verwenden.

Mit SOAP würden Sie einfach XML-basierte Nachrichten zwischen beiden Anwendungen über HTTP/HTTPS austauschen. Mit dieser Vorgehensweise können sich beide Anwendungen gegenseitig auslösen und Daten austauschen.

+1

IMO das ist die beste Lösung, denn obwohl es ein wenig Arbeit braucht, um eingerichtet zu werden, bietet es die größte Flexibilität und wenn das OP entscheidet, eins zu ändern Programm gibt es die geringste Wahrscheinlichkeit, dass es bricht und die einfachste Methode, um es zu beheben (stellen Sie einfach sicher, dass der REST oder SOAP Web Service wie vorgesehen funktioniert). Es erlaubt sogar den Wechsel zu einer anderen Sprache. – smcjones

+1

Apache/PHP ist im Grunde entworfen, um HTTP zu verwenden. Restful oder SOAP oder JSON-basierte Entsprechungen sind in Mode und lösen das Problem für Sie mit minimalem Overhead, da Sie mehrere Frameworks finden, die den Großteil der strukturellen Arbeit für Sie erledigen. – sibaz

1

Wenn Sie einige Hinweise auf das, was Stas sagte Ihnen, dann empfehle ich Ihnen bei

suchen

http://us2.php.net/manual-lookup.php?pattern=fsock&src= {Referrer: source} http://us2.php.net/manual-lookup.php?pattern=socket&src= {Referrer: source}

In C++ Sie wollen werden Erstellen Sie einen TCP-Listener, der Befehle annimmt (Sie sollten eine Validierungsmethode verwenden), , verwenden Sie dann PHP, um eine Verbindung zu öffnen (verwenden Sie fsock oder Socket Ihrer Wahl - fsock ist einfacher) und schreiben Sie Daten in Ihren C++ - Listener . Es ist ezpz

// Aktualisierung mit einigen Beispielcode

// protocol://ip, port, $errno, $errstr, $timeout 
$fp = fsockopen("tcp://ip", 1337, $errno, $errstr, 30); 
if(!$fp) die('failed connection or something'); 

//write something 

fwrite($fp, "stuffs to write"); 

// get a reply? 

while (!feof($fp)) { 
    echo fgets($fp, 128); // where 128 is size 
} 
1

Ich empfehle Ihnen, Unix Sockets Für C++ dies überprüfen: http://www.linuxhowtos.org/C_C++/socket.htm

Für PHP-Check dieses: stream_socket_client

Sie können Informationen intern von beiden Prozessen übergeben.

Hoffe, du kannst es lösen, gib nicht auf.

1

Eine SOAP-Lösung könnte etwas sein, das das Problem löst, aber meiner Meinung nach kompliziert es die Anwendungsbereitstellung.

Sie könnten ein paar Ebenen untergehen und direkt mit XML-RPC arbeiten.

Hier haben Sie zwei interessante Links, die zeigen, wie Sie den Client und den Server in beiden Sprachen implementieren.

XML-RPC for C++

XML-RPC for PHP

Es gibt andere implementatios von XML-RPC für C++ (ich habe nicht diesen Ansatz mit PHP verwendet, so dass ich weiß nicht, andere Alternativen), kleben nicht nur mit Versuchen Sie es mit anderen und verwenden Sie das, womit Sie sich wohler fühlen.

2

Zu der Antwort von Ben Schnarr hinzufügend, denke ich, die wahrscheinlich eleganteste und einfachste Lösung wäre, das C++ Programm zu einem Client für Web Services zu machen, die im PHP Code implementiert sind. Wenn Sie Sockets direkt verwenden, werden Sie gezwungen, ein zusätzliches Protokoll darüber zu haben, um die übertragenen Daten darzustellen (es sei denn, die Daten sind trivial einfach, wie ein ASCII-Textstrom), was ein bisschen wie das Rad neu erfinden würde.

Ich bin Teil zu REST + JSON, weil sie einfach zu implementieren und zu verwenden sind, und sehr mächtig. Im Gegensatz dazu ist SOAP ziemlich komplex, schwer in Ressourcen und brüchig, besonders wenn Sie es mit C++ verwenden. Eine gängige Implementierung, die ich bereits verwendet habe, würde Sie beispielsweise zwingen, Ihren Code jedes Mal neu zu kompilieren, wenn Sie das Layout einer der Nachrichten ändern, selbst wenn der Server ein Feld hinzufügt, das der Client nicht verwendet.

Auf der PHP-Seite ist es ziemlich einfach - es hat bereits die gesamte Infrastruktur, die Sie brauchen. Für das C++ - Programm benötigen Sie mindestens eine HTTP-Client-Bibliothek und einen JSON-Codec. Ich benutze libcurl für die erste (bei weitem die beliebteste) und jsoncpp für die letztere, aber es gibt andere Optionen für beide. In jüngerer Zeit erschienen einige Bibliotheken mit dem ganzen Paket, aber ich hatte noch keine Gelegenheit, sie zu benutzen.Einige Beispiele:

restclient

REST SDK

Restbed

Verwandte Themen