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?
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top