2013-01-09 28 views
44

Sto lavorando a un'applicazione Web PHP e ho bisogno di eseguire alcune operazioni di rete nella richiesta come prelevare qualcuno dal server remoto in base alla richiesta dell'utente.Chiamata di funzione asincrona in PHP

È possibile simulare il comportamento asincrono in PHP dato che devo passare alcuni dati a una funzione e anche bisogno di un output da esso.

Il mio codice è simile:

<?php 

    $data1 = processGETandPOST(); 
    $data2 = processGETandPOST(); 
    $data3 = processGETandPOST(); 

    $response1 = makeNetworkCall($data1); 
    $response2 = makeNetworkCall($data2); 
    $response3 = makeNetworkCall($data3); 

    processNetworkResponse($response1); 
    processNetworkResponse($response2); 
    processNetworkResponse($response3); 

    /*HTML and OTHER UI STUFF HERE*/ 

    exit; 
?> 

Ogni operazione di rete richiede circa 5 secondi per completare l'aggiunta di un totale di 15 secondi per il tempo di risposta della mia data applicazione faccio 3 richieste.

La funzione makeNetworkCall() esegue semplicemente una richiesta POST HTTP.

Il server remoto è un'API di terze parti, quindi non ho alcun controllo lì.

PS: Si prega di non rispondere dando suggerimenti su AJAX o Altre cose. Attualmente sto cercando se posso farlo attraverso PHP potrebbe essere con un'estensione C++ o qualcosa del genere.

+0

Provate ad usare 'curl' al fuoco richieste a prendere alcuni dati dal web ... –

+0

possibile duplicato [filettatura chiamata PHP a una funzione php in modo asincrono] (http://stackoverflow.com/questions/13846192/ php-threading-call-to-a-php-function-asincrono) – CRABOLO

+0

Puoi usare la funzione PHP [stream_select] (https://secure.php.net/manual/en/function.stream-select.php) per eseguire codice non bloccante. [React] (http://reactphp.org/) usa questo per creare un [loop event-driven simile a node.js] (https://speakerdeck.com/igorw/react-phpnw). –

risposta

26

credo che la risposta stabilisce qui:

PHP threading call to a php function asynchronously

Breve nota: l'uso threading

+2

In primo luogo, la ragione per cui non ho menzionato i thread nella mia risposta è perché l'OP ha menzionato che stanno costruendo un'applicazione web. Usare i thread in PHP sotto Apache può essere pericoloso e bisogna davvero pensare a quello che stanno facendo. Ma, se questo funziona per lui, allora fantastico! –

+10

@ColinMorelli potresti spiegare un po 'di più sul pericoloso per favore? Sto pensando di usare anche i thred ma mi piace considerarli. – Manuel

+0

Direi, prova syslog. http://php.net/manual/en/function.syslog.php – Abhidemon

2

cURL sta per essere la tua unica vera scelta qui (o quella, o utilizzando socket non bloccanti e qualche logica personalizzata).

This link dovrebbe inviarti nella giusta direzione. Non c'è elaborazione asincrona in PHP, ma se stai cercando di fare più richieste web simultanee, cURL multi si prenderà cura di questo per te.

1

Penso che se l'HTML e le altre cose dell'interfaccia utente richiedono i dati restituiti, non ci sarà un modo per asincronizzarlo.

Credo che l'unico modo per fare questo in PHP sarebbe quello di registrare una richiesta in un database e avere un controllo cron ogni minuto, o usare qualcosa come Gearman elaborazione della coda, o forse exec() un processo riga di comando

Nel frattempo la pagina php dovrebbe generare qualche html o js che la ricarichi ogni pochi secondi per verificare i progressi, non l'ideale.

Per evitare il problema, quante richieste differenti ti aspetti? Potresti scaricarli tutti automaticamente ogni ora o giù di lì e salvarli in un database?

2

Non ho una risposta diretta, ma si potrebbe desiderare di guardare in queste cose:

2

Al giorno d'oggi, è meglio usare queues di discussioni (per coloro che non utilizzano laravel ci sono tonnellate di altre implementazioni là fuori like this).

L'idea di base è che lo script PHP originale inserisce attività o lavori in una coda. Quindi i job worker delle code sono in esecuzione altrove, eliminano i lavori dalla coda e iniziano a elaborarli indipendentemente dal PHP originale.

I vantaggi sono:

  1. Scalabilità - si può semplicemente aggiungere nodi lavoratore di tenere il passo con la domanda. In questo modo, le attività vengono eseguite in parallelo.
  2. Affidabilità: i moderni gestori di code come RabbitMQ, ZeroMQ, Redis e così via sono estremamente affidabili.
Problemi correlati