2010-01-18 14 views
7

Ho uno script PHP che sembrava smettere di funzionare dopo circa 20 minuti.Lo script PHP si arresta arbitrariamente senza errori

per cercare di capire perché, ho fatto uno script molto semplice da vedere quanto tempo ci sarebbe eseguito senza alcun codice complesso confondere me.

ho scoperto che la stessa cosa stava accadendo con questo semplice ciclo infinito. Ad un certo punto tra 15 e 25 minuti di esecuzione, si arresta senza alcun messaggio o errore. Il browser dice "Fatto".

Sono stato su ogni singola cosa possibile che riuscivo a pensare:

set_time_limit (session.gc_maxlifetime in the php.ini) 
memory_limit 
max_execution_time 

Il punto che lo script viene arrestato non è coerente. A volte si fermerà a 15 minuti, a volte 22 minuti.

prega, tutto l'aiuto sarebbe molto apprezzato.

è ospitato su un server 1and1. Li ho contattati e non forniscono supporto per i bug causati dagli sviluppatori.

+0

Si può essere in grado di generare un processo separato utilizzando 'exec()'. Cercare di mantenere uno script in esecuzione per oltre 30 minuti tramite l'invocazione diretta del browser è pura follia. –

+0

Hai accesso all'errore e ai log di accesso dal server? Probabilmente ti daranno maggiori informazioni su ciò che sta accadendo in questo caso. Inoltre, è possibile riprodurre il problema localmente? Questo potrebbe darti qualche altra opzione per quanto riguarda il debugging. – objectified

+0

Nah, non ho accesso ai log. Questa è una cosa che mi fa davvero impazzire. Ho creato un file csv del log degli errori PHP personalizzato, ma nessun errore PHP utile: -/ Non l'ho verificato localmente poiché ci vuole così tanto tempo per scoprirlo. Capisco se funziona correttamente, quindi è un'impostazione server oscura di cui non ho idea, o se si ferma, quindi è un oscuro problema del browser di cui non ho idea. In ogni caso, non aiuta molto. Sto per provare il consiglio di James sopra, però, sembra utile. Altre idee se nel frattempo? – RobHardgood

risposta

0

Apprezzo i commenti di tutti. Specialmente James Hartig, sei stato molto utile e mi ha mandato sulla strada giusta. Ancora non so quale fosse il problema. L'ho fatto per funzionare sul server usando SSH, usando solo il comando exec() e anche ignore_user_abort(). Ma sarebbe comunque scaduto. Quindi, ho dovuto suddividerlo in piccoli pezzi che verranno eseguiti solo per circa 2 minuti ciascuno e utilizzare le variabili/gli array di sessione per memorizzare da dove avevo interrotto. Sono contento di aver finito con questo progetto abbastanza semplice ora, e sono estremamente incazzato in 1and1. Vabbè ...

+1

Bene, ottieni quello per cui paghi. 1 & 1 è economico perché fa schifo. –

3

Ad un certo punto i tempi del browser fuori e arresta il caricamento della pagina. Se vuoi testare, apri la riga di comando ed esegui il codice. Lo script dovrebbe essere eseguito indefinitamente.

+0

Questo è quello che stavo pensando! Non c'è un modo per impedire al browser di farlo? E colorami un noob, ma il mio pacchetto di hosting 1and1 è il più economico che non supporta SSH ... e per quanto ne so, questo è l'unico modo per accedere al php tramite la linea di comando, non è vero? – RobHardgood

+0

Sì, questo è fondamentalmente l'unico modo. Posso chiederti perché vuoi caricare a tempo indeterminato? La maggior parte dei browser (oltre ai dispositivi mobili) dovrebbe andare bene finché si inviano costantemente dati. –

+0

Beh, il mio ciclo infinito era solo per il test. Lo script che sto provando a correggere deve essere eseguito per circa 30 o 40 minuti, ma continua a fermarsi dopo 20. Stavo cercando di capire perché con questo. Fa eco un breve pezzo di testo ogni pochi secondi. Non è questo il tipo di dati necessari al browser per mantenere aperta la sessione? – RobHardgood

3

avete considerato solo l'esecuzione dello script dalla riga di comando, ad esempio:

php script.php 

e hanno lo script stanare un messaggio ogni tanto che la sua ancora in corso:

<?php 

while (true) { 
    doWork(); 
    echo "still alive..."; 
    flush(); 
} 
+0

Ci sto provando ora ... Grazie – RobHardgood

+0

Sì, questo non ha funzionato – RobHardgood

+0

Prova a ottenere il massimo tempo di esecuzione utilizzando ini_set ini_set ('max_execution_time', 300); // 5min – AndrewMurphy

1

penso ciò che devi scoprire è l'ora esatta in cui si arresta (puoi impostare un'ora iniziale e continuare a scaricare l'ora corrente meno iniziale). C'è qualcosa sul lato server che sta fermando il file. Inoltre, considera di eseguire un ini_get per verificare che il tempo di esecuzione sia effettivamente 0. Se lo desideri, imposta il limite di tempo su 30 e poi OGNI ciclo, continua a impostare su 30. Ogni volta che chiami set_time_limit, il contatore si azzera e questo potrebbe consentire di ignorare i limiti effettivi. Se ancora non funziona, c'è qualcosa sui server di 1and1 che potrebbero uccidere lo script.

Inoltre, hai provato l'ignore_user_abort?

0

Penso che questo è causato da alcuni monitor di processo uccidere "processi zombie" al fine di consentire le risorse per gli altri utenti.

Eseguire l'exec utilizzando "2> & 1" per accedere qualche cosa compreso stderr.

Nella mia uscita sono riuscito a prendere questo:

... 
script.sh: line 4: 15932 Killed     php5-cli -d max_execution_time=0 -d memory_limit=128M myscript.php 

Così qualcosa (una forza esterna, non lo stesso PHP) sta uccidendo il mio processo!

Io uso IdWebSpace che è eccellente BTW ma penso che la maggior parte dei provider di hosting condiviso impongono questo meccanismo di controllo delle risorse/processo solo per essere sano.

2

in tali casi, accendo tutte le impostazioni di sviluppo in php.ini, ovviamente su un server di sviluppo. Questo mostra molti più messaggi, compresi gli avvisi di deprecazione.

Nella mia esperienza di debug di lunga esecuzione di script php, la causa più comune era mancata allocazione di memoria (Fatal error: ammessi dimensione della memoria di byte xxxx esaurito ...)

Problemi correlati