2010-04-23 25 views
5

Sto eseguendo un'importante importazione nel mio database (circa 200k di record) e sto avendo un problema serio con il mio script di importazione che si sta esaurendo. Ho usato il mio cellulare come cronometro e ho scoperto che scade a 45 secondi ogni volta (errore interno del server) ... fa solo 200 record alla volta, a volte meno. Ho scansionato il mio phpinfo() e nulla è stato impostato su 45 secondi; quindi, non ho idea del motivo per cui lo farebbe.Script PHP Timeout dopo 45 secondi

My max_execution_time è impostato su 5 minuti e my max_input_time è impostato su 60 secondi. Ho anche provato a impostare set_time_limit (0); ignore_user_abort (1); nella parte superiore della mia pagina ma non ha funzionato.

Potrebbe anche essere utile notare che il mio file di errore riporta: "Fine anticipata delle intestazioni di script" come errore di esecuzione.

Qualsiasi assistenza è molto apprezzata.

+0

eventuali messaggi di errore? hai abilitato error_reporting (-1), vero? – Gordon

+0

Appena aggiunto come modifica quando hai postato questo :) Un messaggio di errore: "Fine anticipata delle intestazioni degli script" –

+0

Possibile duplicato di [Intestazioni anticipate degli script: index.php, mod \ _fcgid: leggere il timeout dei dati in 61 secondi] (http://stackoverflow.com/questions/14488567/premature-end-of-script-headers-index-php-mod-fcgid-read-data-timeout-in-61-s) – kenorb

risposta

0

È possibile che si stia verificando un limite di risorse sul server, soprattutto se il server non è completamente sotto il proprio controllo.

Supponendo che si tratti di un tipo di server Linux, è possibile visualizzare i limiti delle risorse con ulimit -a nella riga di comando. ulimit -t mostrerà anche solo i limiti sul tempo di cpu.

Se la CPU è limitata, potrebbe essere necessario elaborare l'importazione in lotti.

+0

Non penso è un limite di risorse ... lo script sta scadendo esattamente a 45 secondi ... se fosse il tipo di memoria, il tempo non sarebbe molto incoerente? –

+0

È possibile impostare limiti su altre cose rispetto alla memoria e gli host server limiteranno spesso il tempo della CPU per evitare processi in fuga. In tal caso sarebbe scaduto abbastanza vicino al limite. Prova 'ulimit -t' e guarda cosa ottieni. – zombat

+0

@Dave: C'è anche RLimitCPU di Apache: http://httpd.apache.org/docs/2.2/mod/core.html#rlimitcpu –

0

Per prima cosa, dovresti eseguire lo script dalla riga di comando se ci vorrà un po 'di tempo. Per lo meno il tuo browser scadrebbe dopo 2 minuti se non riceve alcun contenuto.

php -f filename.php 

Ma se è necessario eseguirlo dal browser, prova a aggiungere header ("Content-Type: text/html") prima dei calci di importazione.

Se ci si trova su un host condiviso, è possibile che esistano restrizioni sul sistema quando qualsiasi query e/o script a esecuzione prolungata vengono automaticamente eliminati dopo un certo periodo di tempo. Queste restrizioni sono generalmente allentate per script in esecuzione non web. Quindi, eseguirlo dalla riga di comando sarebbe d'aiuto.

0

Le 45 secondi potrebbero essere una coincidenza - potrebbe essere quanto tempo ci vuole per voi per raggiungere il limite di memoria .. aumentando il limite di memoria sarebbe come:

ini_set('memory_limit', '256M'); 

Potrebbe anche essere la vera connessione db che sta scadendo .. quale server DB stai usando? Per me, mssql è scaduto con un errore estremamente inutile, "Contesto del database modificato", dopo 60 secondi per impostazione predefinita. Per aggirare il problema, fai:

ini_set('mssql.timeout', 60 * 10); // 10 min 
15

ho provato tutte le soluzioni in questa pagina e, naturalmente, in esecuzione dalla riga di comando:

php -f filename.php 

come dice Brent è il modo sensato intorno ad esso .

Ma se si davvero desidera eseguire uno script dal browser che continua timeout dopo 45 secondi con un errore del server interno 500 (come ho scoperto quando ricostruire il mio indice di ricerca phpBB) poi c'è una buona probabilità è causata da mod_fcgid.

ho un Plesk VPS e ho riparato modificando il file

/etc/httpd/conf.d/fcgid.conf 

particolare, ho cambiato

FcgidIOTimeout 45 

a

FcgidIOTimeout 3600 

3600 seconds = 1 ora. Dovrebbe essere abbastanza lungo per la maggior parte, ma regolare verso l'alto se necessario. Ho visto un esempio citando 7200 secondi.

Infine, riavviare Apache per rendere attiva la nuova impostazione.

apachectl graceful 

HTH qualcuno. Mi tormenta da 6 mesi!

Cheers,

Rich

+0

Necessario questo, grazie mille. – DaveE

+3

HTH = "Spero che questo aiuti" – AVProgrammer

0

Prima di tutto

max_input_time e set_time_limit (0)

funziona solo con VPS o server dedicati. Invece di quello puoi seguire alcune regole alla tua implementazione come sotto

  1. Prima leggi l'intero file CSV.
  2. Quindi prendi solo 10 voci (righe) o meno e effettua chiamate ajax per importare in DB
  3. Prova a chiamare ajax ogni volta con 10 voci e dopo di che echo qualcosa sul browser. In questo metodo lo script non verrà mai scaduto.
  4. Seguire lo stesso metodo fino al termine delle righe CSV.
Problemi correlati