2012-08-15 27 views
5

Sto lavorando a un progetto energetico. Nel mio sito ci sono i servizi energetici registrati con il processo di iscrizione attraverso i servizi web. Inizialmente era 1 per iniziare ora 3 altri sono venuti per integrare.PHP Come implementare più servizi Web simultaneamente?

Nella prima pagina devo mostrare i piani basati sui codici postali. Ora su questa pagina devo chiedere a tutti i 4 fornitori di energia di elencare i piani energetici.

Per richiedere ogni servizio in modo sequenziale sicuramente ci vorrà più tempo in quanto devo ottenere i dati da una fonte esterna e questa è la prima pagina quindi non voglio rallentarla al primo solo istanza.

Come posso fare richiesta a tutti i servizi contemporaneamente e raccogliere i dati da ciascun servizio ed elencarlo nella pagina finale.

+0

So che molti si lamenteranno, ma hai pensato a multi-threading? Dai primi risultati su google, questi sembrano buoni posti per iniziare ... http://villavu.com/forum/showthread.php?t=73623 e http://blog.motane.lu/2009/01/02/multithreading-in-php/support sembra snello, ma questo potrebbe velocizzare le cose avendo tutte e 4 le richieste in corso "una volta" - questo è quello che immagino almeno ... – blad

+1

E il caching? Quanto spesso cambiano questi piani? Deve essere in tempo reale? Perché non avere un cron job che esegue il polling di tutti i servizi ogni 1-5 minuti e memorizza i risultati in memcache o in una tabella HEAP MySQL? Quindi il tuo front-end potrebbe leggere dalla cache invece dei servizi web. – Costa

+0

@Costa Suoni per essere una buona soluzione. Ma il problema è che nemmeno io so quanti codici zip sono e quanto spesso cambiano il piano. Potrebbero esserci circa 50 K zipcode. Ma terrò questo a mente e realizzerò dove sarà fattibile. – Vins

risposta

3

C'è davvero solo un modo non brutto per farlo con PHP quando si esegue su un server web. Avrai bisogno del modulo cURL compilato in PHP. Ha un supporto integrato per l'esecuzione di richieste parallele. Guarda i commenti e la documentazione su www.php.net per esempi di utilizzo.

Prova: http://www.php.net/manual/en/function.curl-multi-init.php

Altre opzioni, come si biforcano processi in background o chiamando una shell UNIX, sono terribili per mantenere e raramente cross-platform. Il multithreading non è un'opzione valida in quasi tutti i comuni ambienti PHP.

Devo menzionare, anche se non necessariamente suggerire, che potrebbe essere utilizzato un approccio AJAX. Non è così leggero in tutti i casi, ma dovrebbe essere pesato.

+0

Quando ho a che fare con una situazione simile, l'ho risolto scaricando il lavoro per recuperare i dati in una shell di torta, che utilizzava pcntl_fork per eseguire simultaneamente richieste di servizi web. I processi secondari memorizzano le risposte nella memoria condivisa e quando tutti i processi sono stati eseguiti, il processo shell genitore li raccoglie e li rimanda alla richiesta web. Ha funzionato per me per ridurre i tempi di caricamento di grandi numeri. Ma prendi in considerazione ciò che Pestilence ha detto di questa soluzione. – Ceeram

+0

@pestilence Cosa succede se utilizzo una richiesta diversa per chiamare i servizi web. uno usa la secessione di REST usando SOAP terzo usando Curl .. A quel tempo come ti aiuterà a farlo .. grazie –