RPC w / PHP - agnostico al meccanismo di trasporto
Domanda
Per un recente progetto, ho uno script PHP eseguito come un demone CLI-based. Questo demone sarà responsabile del monitoraggio / controllo dei processi di lavoro indipendenti.
Periodicamente, gli utenti saranno l'emissione di richieste per gestire i lavoratori attraverso un PHP web front-end (CLI daemon e il codice di front-end sono sullo stesso server fisico). Il front-end avrà bisogno di fare chiamate di metodo al demone.
Sono confuso su come gestire queste chiamate di metodo "remoti". Ho pensato che l'utilizzo di un protocollo RPC come JSON-RPC su una presa standard UNIX o TCP sarebbe la strada da percorrere, ma ogni implementazione di RPC e XML-RPC, SOAP, ecc per PHP sembra essere strettamente accoppiato HTTP. Dal momento che non sto comunicando attraverso il web, HTTP è completamente inutile.
Quindi, due domande:
- Perché sono la maggior parte della RPC PHP pacchetti accoppiato ad HTTP?
- Qual è il modo migliore per le chiamate di metodo maniglia come descritto sopra?
Soluzione
Perché la maggior parte dei pacchetti di PHP RPC accoppiati a HTTP?
Questo è facile. PHP è su misura per il web. E 'più raro per le applicazioni CLI scrittura in PHP.
Perché la maggior parte dei pacchetti di PHP RPC accoppiati a HTTP?
E 'più comune avere PHP eseguire RPC su programmi in esecuzione in un'altra lingua, come Java, e ci sono buone opzioni lì.
Per un programma CLI PHP, io non sono a conoscenza di qualsiasi soluzione out-of-the-box. Ma dovrebbe essere possibile implementare una soluzione personalizzata con i socket UNIX. Vedere la prese estensione . Si noti che la non esistenza di supporto multi-threading in PHP può rendere questo un po 'più difficile (per gestire connessioni multiple dovrete sborsare o implementare il proprio scheduler single-thread ...)
Altri suggerimenti
Si potrebbe ancora utilizzare HTTP e connettersi a localhost, che non generare alcun traffico di rete. Non credo che ci sia un reale vantaggio da guadagnare utilizzando direttamente i socket, se si vuole veramente un livello di trasporto diverso, si potrebbe usare Ripcord (http://ripcord.googlecode.com/), che permette di specificare la vostra propria classe livello di trasporto. Per completezza di informazione, io sono l'autore di Ripcord, così ho può essere prevenuto.