2012-03-18 18 views
7

Ho uno script PHP, richiede un tempo di esecuzione di almeno 1000 secondi.Script PHP termina prima del timeout senza errori

Termina dopo circa 265 secondi ogni volta senza errori. Dato che sto usando i loop, ho testato il numero di iterazioni ed è indipendente da quello, escludendo ulteriormente la possibilità che si verifichi un errore nel loop.

Ho impostato max_execution_time su 10800 in php.ini e anche la modifica memory_limit non ha alcun effetto sui risultati.

Si prega di aiuto! Mi sono grattato la testa a fondo!

+1

Cosa fa il codice? Sei sicuro che nessun errore è stato generato? Hai impostato la visualizzazione dell'errore su E_ALL? Non hai eliminato alcun errore con l'operatore '@'? –

+0

Sicuro che non genera errori. Hai esaminato i file di registro? – Neysor

+1

stai eseguendo questo da una riga di comando, cron job, web server, altro? hai provato un metodo diverso di invocazione? – dldnh

risposta

0

Hai controllato il tuo file di registro? Se si riceve l'errore 6 o errore di segmentazione. Quindi il tuo script è in realtà in crash di PHP senza mostrare alcun errore sul browser (se si tratta di browser e non cli).

Se si utilizza apache su unix, è necessario trovare questo registro /var/log/apache2/error.log.

Altrimenti si può definire il percorso del file di log in .htaccess da aggiungere questa riga:

php_value error_log "/path/to/somewhere/convenient/php_errors.log" 

modificare il percorso da qualche parte dove il vostro httpd ha il permesso di scrittura e dove hanno permesso di lettura.

+1

Il nuovo registro degli errori è vuoto ... – 7HUND3RX

+0

Hmm sì, suppongo che gli errori di segmentazione rimarranno nel file di registro dei server HTTP. Come php è già in crash. Hai provato a esaminare il registro degli errori di Apache? o quale server HTTP stai usando? –

+1

I file di registro del server non erano consentiti su Plesk I. Il provider di hosting ha confermato che era a causa della limitazione della risorsa massima consentita per essere utilizzata da un singolo script. Grazie mille per il tuo tempo e aiuto! – 7HUND3RX

0

dare:

set_time_limit(0); 

all'inizio di script. in modo che l'esecuzione del codice non scada a meno che non sia completata.

+0

Penso abbia detto che ha escluso il timeout. –

+0

Non aiuta .. Non è possibile eseguire tutto il tempo di 10800. – 7HUND3RX

+0

@AshishAgrawal mostra il codice in questione. – mithunsatheesh

0

Questo stesso errore è successo a me. Una delle mie funzioni PHP è morta senza errori inviati a stderr, stdout e nessun altro file di registro.

Quello che è successo è che stavo usando uno script PHP di supporto scritto da qualche altro sviluppatore che stava impostando il limite di memoria a 512 MB a metà del funzionamento del mio programma. Il sottomodulo ha avvelenato il pozzetto impostando anche le impostazioni del registro degli errori su silenzioso a un certo punto a metà dell'elaborazione del mio script.

Puoi provare se questo ti sta accadendo stampando le impostazioni del sistema php disponibili per il tuo script PHP su OGNI iterazione del ciclo. Quando il pedice ha fatto l'azione sporca, il motore PHP si adatta dopo che il garbage collector viene eseguito in un punto casuale nel futuro, quindi muore immediatamente senza errori. Si tratta di un bug nel garbage collector di PHP quando i moduli secondari fanno confusione con le impostazioni di sistema mentre il garbage collector sta facendo il suo lavoro.

Soluzione: Modificare i sottomoduli di helper php e assicurarsi che non modifichino le impostazioni di sistema, poiché il garbage collector sta facendo il suo lavoro. L'interprete PHP andrà fuori di testa e morirà senza errori o uscirà in un intervallo casuale dopo l'avvelenamento delle variabili di sistema PHP.

0

su PHP, l'unico modo per nascondere gli errori dai registri anche quando il display_errors e error_reporting siano correttamente indicato è di utilizzare la Error Control Operators,

ad esempio: il codice seguente genererà un errore fatale, ma un "nascosto" uno, non apparirà né sui log né sul browser.

@echo "forgetting the last quote; 

Quindi impostare il valore display_errors su On e l'error_reporting a seconda della versione di PHP che si sta utilizzando (vedi le differenze here), e verificare se si utilizza il simbolo "@" sul vostro codice.

Problemi correlati