2012-11-24 22 views
6

Ho uno script PHP "A" che avvia un altro script PHP "B", che può durare fino a 5 ore. Io uso la funzione di arricciatura per quello. Ma il mio problema è che lo script "A" non mantiene la connessione allo script "B". Ho modificato max_execution_time, timeout, timeout socket, ecc ... ma non aiuta.Problemi keep-alive di connessione

Devo inviare un'intestazione allo script "B" con arricciatura o qualcosa del genere?

$curl_header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text 
/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 
$curl_header[] = "Cache-Control: max-age=0"; 
$curl_header[] = "Connection: keep-alive"; 
$curl_header[] = "Keep-Alive: 84600"; 

$url = 'http://test.de/test_B.php'; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'); 
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $curl_header); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 300); 
curl_setopt($ch, CURLOPT_TIMEOUT, 84600); 
curl_setopt($ch, CURLOPT_NOSIGNAL, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_URL, $url); 
$result = curl_exec($ch); 
$curl_errno = curl_errno($ch); 
curl_close($ch); 

`

+1

incollare un po 'di codice? – GBD

+0

Lo script php chiamante si interrompe? Hai messo max_execution time sullo scipt chiamante a 0? Hai anche impostato la velocità di trasferimento bassa - se ricevi una risposta parziale (inclusi spazi bianchi) e poi nulla, la CURLOPT_LOW_SPEED_TIME potrebbe dare il calcio d'inizio? – Robbie

risposta

1

Se lo script di "B" richiede molto tempo per finire potrebbe essere utile per mettere un po 'durante l'esecuzione echo "something"; flush(); che manterrà il collegamento vivo.

Mi succede di recente su un'esecuzione simile.

0

Lo script B memorizza l'output da qualche parte e quindi dopo 5 ore di connessione e verifica. I server HTTP non sono progettati per questi tempi e potresti incorrere in qualsiasi tipo di timeout.

0

è possibile utilizzare la seguente architettura:

Script A chiama B copione che viene eseguito lo script C tramite richiesta shell in background e restituisce un po 'identificatore. Fondamentalmente, lo script B avvia appena il lavoro di 5 ore che funzionerà in background e non è necessario mantenere la connessione. È possibile memorizzare i progressi nel database o in alcuni file.

Quindi, lo script A può richiedere lo sviluppo di quello script di 5 ore C chiamando un'interfaccia echoing, chiamiamolo Script D, che leggerà il database o il file e tracciare fino a che punto lo script C è andato con le sue attività.

Problemi correlati