CodeIgniter RESTful, async / background process

Sto usando l'API RESTful codeIgniter (https://github.com/philsturgeon/codeigniter-restserver) che restituisce le informazioni (in formato json) alla mia app per android / iphone.

C'è un'operazione in cui invio alcuni valori, se è tutto OK, restituisco il codice 200 come risposta.

Ora, voglio aggiungere una nuova operazione con lo stesso metodo: submit notifiche di queste modifiche con APNS (servizio di Apple Push Notificacion) e GCM (Google Cloud Messaging).

Funziona bene quando devo submit non più di 3-5 notifiche, il problema è APNS, perché devo submit questi messaggi uno per uno e richiede molto tempo, quindi le mie app ricevono un'exception di timeout (tutte le notifiche sono inviato ma l'utente ottiene la connessione di errore …)

Posso submit la risposta al codice 200 e quindi continuare a submit queste notifiche? (Qualcosa come questo…)

function my_update_method_post(){ //....GET my POST values update($data); $this->response(arrays('result'=>1),200)); //Send Notifications .... } 

Grazie in anticipo…

Ho trovato una soluzione che funziona perfettamente per me perché non mi aspetto alcun valore di risultato. Se la notifica non può essere inviata … la registro nel mio database.

Questa è la function che uso per submit una richiesta "asynchronous" (sì, questa non è una richiesta asynchronous, ma funziona come sto cercando)

 function curl_post_async($url, $params) { $post_string = http_build_query($params); $parts=parse_url($url); $fp = fsockopen($parts['host'], isset($parts['port'])?$parts['port']:80, $errno, $errstr, 30); if(!$fp) { //Perform whatever logging you want to have happen b/c this call failed! } $out = "POST ".$parts['path']." HTTP/1.1\r\n"; $out.= "Host: ".$parts['host']."\r\n"; $out.= "Content-Type: application/x-www-form-urlencoded\r\n"; $out.= "Content-Length: ".strlen($post_string)."\r\n"; $out.= "Connection: Close\r\n\r\n"; if (isset($post_string)) $out.= $post_string; fwrite($fp, $out); fclose($fp); } 

Sì, questo è ansible.

Dovresti guardare PHP exec () e questo link. Dovresti impostare una function nel tuo controller per essere chiamata dalla row di command. passerai quindi in una serie di dati GCM / APNS da utilizzare.

Questa soluzione non è l'ideale perché non sarai in grado di dire al cliente che tutti i messaggi sono stati inviati con successo. Invierai 200 per dire che la richiesta è stata ricevuta ok e questo è tutto.

Dal momento che PHP non support in modo nativo i thread o le chiamate alle funzioni asincrone, dovrai utilizzare una soluzione hacker. Dai un'occhiata alla mia domanda qui: PHP file_get_contents () segue l'intestazione Content-length

La soluzione è di submit una Connection: Close e intestazione Content-Length , quindi rendere il client di essere a conoscenza di queste intestazioni (vedi link sopra). In caso di arricciatura, ad esempio, la connessione verrà chiusa non appena viene raggiunta la lunghezza del contenuto, ma lo script PHP viene comunque eseguito "in background" in modo da poter avviare operazioni che richiedono molto tempo.

Cordiali saluti,

Stefan

PS Se lo script richiede molto tempo per essere eseguito, assicurati che il tempo massimo di esecuzione di PHP non si intrometta

Dai un'occhiata a questo articolo . Questa soluzione mi piace molto più di una in cui il client dice al server di riagganciare immediatamente; ci sono molti vantaggi se si crea questa soluzione sul lato server.

  1. Sapete che il server continuerà l'elaborazione una volta che il client si è disconnesso
  2. Il client può ancora ricevere una risposta dal server

MODIFICARE

Non mi ero reso conto che l'OP non ha accesso al servizio qui. In questo caso, l'articolo che ho citato è di scarso valore. Il problema qui è che il server impiega molto tempo per rispondere e impiccare il client. Per questo suggerisco curl_multi_init . Questo ti permette di fare un numero di richieste simultaneamente.