2015-10-28 14 views
10

Ho una domanda riguardante la domanda intitolata. Quindi, sto tentando di creare un programma che trasmetta dati/richieste di dati tra un programma in C++ e un sito PHP che si stacca da un server web Apache.Come impostare la comunicazione tra PHP e C++?

Sono stato alla ricerca di comunicazioni Socket, ma non sto capendo il concetto. Capisco come creare un socket in PHP e un altro in C++, e li faccio girare usando un'applicazione di test. Ma solo individualmente, non parlando tra loro O parlando al mio server web (il PHP non è sul server al momento, è su un server diverso). Quindi come funziona? Dalla mia comprensione, è necessario che uno ascolti un numero di porta e l'altro che invii qualcosa a quel comando.

Idealmente, preferirei non utilizzare alcuna libreria per aiutarmi a raggiungere questo obiettivo. So che questa domanda è stata posta molte volte in passato, ma non sto ancora andando da nessuna parte.

Qualcuno potrebbe fornire una spiegazione su come funziona il suddetto, o collegamenti a una domanda qui/altrove che potrebbe essere di aiuto? O se esiste un metodo migliore per farlo rispetto all'utilizzo di socket? Parleranno molto tra loro e la velocità potrebbe essere un problema.

Modifica, ulteriori spiegazioni:

server Web: Sono in esecuzione un server web Apache. Lo script PHP si trova su questo server.

C++ Ubicazione: durante il test, la mia applicazione C++ è memorizzata nello stesso Raspberry Pi su cui è in esecuzione il server web. Nell'applicazione reale, la mia applicazione C++ verrà comunque archiviata sullo stesso dispositivo (ma non sarà un Raspberry Pi, anche se comunque basato su Linux).

Comunicazione: lo script PHP deve essere attivato per eseguire operazioni dallo script C++ e viceversa. Avranno entrambi bisogno di passare i dati (strutture dati comuni, ma potrebbero essere abbastanza grandi) in ogni modo (quindi entrambi devono essere in grado di inviare e ricevere dati).

+1

voi dicono che php app è su un server separato dal ++ app c? Sarà sempre così? – commanderZiltoid

+2

Questa domanda è abbastanza vaga. Entrambi i programmi saranno in esecuzione sullo stesso server? Comunicazione a senso unico o bidirezionale? Si tratta di una relazione di tipo client/server? O forse una relazione di tipo worker/queue? Php viene eseguito dietro un server web (apache, ngnx ecc.)? – Steve

+1

Ciao, ti prego di approfondire il tuo caso d'uso, entrambi possono comunicare fino a quando usi lo stesso protocollo, se il tuo php è sul webserver, allora è meglio http/https (presumo che C++ sia client e PHP sia server). Se php è cli, l'opzione può espandersi in udp, tcp. Puoi anche inviare email usando C++ e controllare ricevere usando PHP, periodicamente usando job wget e cron, ecc. –

risposta

13

Penso che il modo più semplice è:

1) PHP -> C++: tcp

2) C++ -> PHP: http

cercherò di spiegare.

1) Per prendere qualcosa dall'app C++, PHP si connette all'app utilizzando la funzione stream_socket_client. L'app C++ è in ascolto su host e porta utilizzando le funzioni socket, bind e listen. Appena la connessione arriva all'app C++ accept e poi in un separato std::thread lo serve (recv per ottenere la richiesta, send per inviare risposta). How to socket.

2) Poiché PHP sta funzionando con Apache Web Server, penso che il modo più semplice sia l'uso della libreria libcurl per effettuare la richiesta HTTP dall'app C++. How to curl.

+0

Grazie per la risposta dettagliata. Ho intenzione di provarlo più tardi questa settimana. Tornerò e contrassegnerò come risposta se funziona bene :) – mfisher91

7

Un altro approccio potrebbe essere il servizio Web SOAP o REST. Su entrambi i lati, è possibile fornire un servizio Web SOAP per scambiare dati o chiamare funzioni remote. Sul lato C++, è possibile utilizzare Apache Axis per fornire un server SOAP. Dal lato PHP, è possibile utilizzare la classe SOAPServer incorporata (http://php.net/manual/de/class.soapserver.php).

Con SOAP è sufficiente scambiare messaggi basati su XML tra entrambe le applicazioni su HTTP/HTTPS. Con questo approccio, entrambe le applicazioni possono attivarsi reciprocamente e scambiarsi dati.

+1

IMO questa è la soluzione migliore perché anche se ci vuole un po 'di lavoro per essere configurata, offre la massima flessibilità e se l'OP decide di cambiare uno programma c'è la minima probabilità che si rompa e il metodo più semplice per risolverlo (basta assicurarsi che il servizio web REST o SOAP funzioni come previsto). Permette persino di cambiare una lingua diversa. – smcjones

+1

Apache/PHP è fondamentalmente progettato per utilizzare HTTP. Restful o SOAP, o equivalenti basati su JSON sono in voga e risolveranno il problema con un sovraccarico minimo, dato che puoi trovare diversi framework che faranno la maggior parte del lavoro strutturale per te. – sibaz

1

Se avete bisogno di alcune indicazioni su ciò che stas ti hanno detto allora io suggerisco di guardare

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++ si vorrà crea un listener TCP che accetta i comandi (chiaramente dovrai mettere un metodo di validazione), quindi usa PHP per aprire una connessione (usa fsock o socket a tua scelta - fsock è più semplice) e scrivi i dati nel listener C++ . E 'EZPZ

// aggiornamento con qualche esempio di codice

// 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

vi consiglio di utilizzare Unix Sockets per il C++ controllare questo: http://www.linuxhowtos.org/C_C++/socket.htm

Per il check php questo: stream_socket_client

Puoi passare informazioni internamente da entrambi i processi.

Spero che tu possa risolverlo, non mollare.

1

Una soluzione SOAP potrebbe essere qualcosa che risolve il problema, ma a mio parere complica molto l'implementazione dell'applicazione.

Si potrebbe scendere alcuni livelli e lavorare direttamente con XML-RPC.

Qui ci sono due collegamenti interessanti, che mostrano come implementare il client e il server in entrambe le lingue.

XML-RPC for C++

XML-RPC for PHP

Ci sono altre implementatios di XML-RPC per C++ (non ho usato questo metodo con PHP, in modo da non so altri alternative), non si attaccano solo con uno, prova con gli altri e usa ciò con cui ti senti più a tuo agio.

2

In aggiunta alla risposta di Ben Schnarr, penso che la soluzione più elegante e facile sarebbe quella di trasformare il programma C++ in un client per servizi Web implementato nel codice PHP. L'uso di socket direttamente ti costringerebbe ad avere un protocollo aggiuntivo su di esso per rappresentare i dati trasmessi (a meno che i dati non siano banali come un flusso di testo ASCII), il che sarebbe un po 'come reinventare la ruota.

Sono parziale a REST + JSON, perché sono semplici da implementare e utilizzare e molto potenti. Al contrario, SOAP è piuttosto complesso, pesante nelle risorse e fragile, specialmente se lo usi con C++. Ad esempio, un'implementazione diffusa che ho già utilizzato, ti costringerebbe a ricompilare il codice ogni volta che cambi il layout di uno qualsiasi dei messaggi, anche se il server sta aggiungendo un campo che il client non utilizzerà.

Sul lato PHP, è abbastanza semplice: ha già tutta l'infrastruttura di cui hai bisogno. Nel programma C++, il minimo necessario è una libreria client HTTP e un codec JSON. Io uso libcurl per il primo (di gran lunga il più popolare) e jsoncpp per quest'ultimo, ma ci sono altre opzioni per entrambi. Più di recente, alcune librerie sono apparse con l'intero pacchetto, ma non avevo ancora avuto la possibilità di usarle.Alcuni esempi:

restclient

REST SDK

Restbed

Problemi correlati