2011-12-04 18 views
7

ottengo il messaggio temuto:curl_exec tempo massimo di esecuzione - che cosa sta causando?

Fatal error: Maximum execution time of 90 seconds exceeded in /home/pricing.php on line 239 

il codice è: (! Per mancanza di una parola migliore)

$url = "http://*******.com/feed?f=PR&categories=$cat_id&limit=100&startproducts=$ii&price_min=0.01&sortproducts=score&show=properties"; 

$c = curl_init($url); 
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($c, CURLOPT_HEADER, 0); 
curl_setopt($c, CURLOPT_USERPWD, "****:****"); 
$xml = simplexml_load_string(curl_exec($c)); // line 239 

la simplexml_load_string è la linea 239, sicuramente questo significa che l'alimentazione è stato ottenuto e la stringa viene caricata, ma sicuramente non ci possono volere più di 90 secondi?

Le mie domande sono:

1 - quello che potrebbe/dovrebbe causare questo?

2 - è sicuro aumentare lo php_value max_execution_time oltre 90 secondi e cosa è considerato un valore massimo sicuro?

3 - c'è un modo migliore/più rapido/più stabile per ridurre il feed rispetto all'utilizzo di arricciatura?

Grazie per tutto l'aiuto!

+0

No, non significa che il flusso "è stato ottenuto". Il tempo potrebbe benissimo essere speso in 'curl_exec' se il sito web è" lento ". Spezzala in due righe se vuoi essere sicuro. – Mat

+0

Ah ok - quindi se lo analizzo come: $ feed = curl_exec ($ c); $ xml = simplexml_load_string ($ feed); E 'questo che intendi? –

+0

Sì, quindi saprai quale delle due chiamate è in fase di stallo. – Mat

risposta

5

A1: Sì, hai ottenuto la risposta dalla tua seconda domanda. è causato da php max_execution_time.

A2: Non è sicuro, a meno che non lo stiate ospitando localmente e sapete cosa sta facendo il vostro script. Penso che la pratica comune sia 30sec o max 300sec (5min).

A3 Se avete a che fare con l'arricciatura, preferisco di impostare set_time_limit(0) sulla cima del tuo script PHP (livello equivalente codice per max_execution_time in php.ini), e utilizzare il timeout per curl per gestire il timeout.

curl_setopt($curl, CURLOPT_TIMEOUT_MS, 2000); //in miliseconds 
+0

RE A3 - questo significa che lo script non fallirebbe se impostassi CURLOPT_TIMEOUT_MS - se così fosse questa opzione migliore –

+0

Se ti riferisci a ** fail ** come nella timeout dell'esecuzione di PHP, quindi la risposta è sì, non fallirà fintanto che set_time_limit è molto alto o 0 (illimitato). Non riesco a ricordare i dettagli esatti quando raggiunge il 'CURLOPT_TIMEOUT_MS', ma una cosa è certa che' curl_exec ($ c) 'restituirà una stringa vuota. Quindi, fai un semplice controllo prima di analizzare la tua 'simplexml_load_string'. –

2
  1. Il riccio di alimentazione esterna è estremamente lento

  2. è Ok per aumentare la max_execution_time ad un valore più alto, ma non è raccomandato. Se lo script deve servire come una delle tue normali pagine web, devi pensarci due volte. Nessun utente vorrebbe aspettare più di 90 secondi per caricare una pagina.

  3. Cache è!

Dettagli di cache it! : -

Non una logica super,
cosa significa è che si può preparare la lista del URL del feed,
poi fare un processo in background (cronjob) per afferrare ogni URL del feed e memorizzare nella memoria locale.
Una volta che l'XML locale è disponibile, caricare dal locale

Quindi, è il contrario di accesso su richiesta, ottenere l'XML pronto prima che qualsiasi utente possa accedere alla pagina.
Le difficoltà saranno un sacco di diversi feed URL da afferrare, c'è un curl_multi_exec che dovrebbe essere l'ideale per afferrare più url allo stesso tempo.

Problemi correlati