2016-05-10 76 views
5

Sono l'unico amministratore del database. Voglio eseguire uno script una tantum che in pratica richiede circa 3800 immagini scansionate (crescerà fino a 10.000.000) e creare un paio di miniature per ogni immagine usando la funzione exec() di PHP per eseguire il programma imagemagick esterno per creare quelle miniature.Errore di tempo di esecuzione massimo nello script PHP, è una buona soluzione per aggirarlo?

Ho creato la sceneggiatura, l'ho lanciata e tutto funziona perfettamente! Tutto è fatto sul mio server di sviluppo locale. La sceneggiatura impiega circa 11 minuti per creare migliaia di miniature. È un'operazione che viene eseguita una volta ogni due anni, quindi le conseguenze sono minime.

Fin qui tutto bene. Ecco quando mi imbatto in problemi.

Tutto ciò che ho fatto sul mio server di sviluppo locale l'ho fatto sul server live a scopo di test. Ho un account host condiviso con hostgator. L'esecuzione del mio script di 11 minuti su un host condiviso mi dà l'errore "Tempo di esecuzione massimo di 30 secondi superato ...". Ho fatto la mia ricerca, ho provato molte delle soluzioni trovate in questo post (Increase max execution time for php) solo per rendermi conto che non c'è nulla che io possa fare per modificare il tempo massimo di esecuzione di uno script su un host condiviso.

Sono bloccato. Quindi, la mia domanda è qual è la soluzione ovvia qui.

Stavo pensando di avviare lo script per ogni 200 immagini, aggiornare automaticamente la pagina ed eseguire nuovamente lo script per le prossime 200 immagini e così via fino a quando non ci saranno più immagini. In questo modo sono sicuro che i 30 secondi massimi di esecuzione consentiti sul mio host condiviso sono rispettati. Sembra una soluzione giusta in cima alla mia testa, ma non sono sicuro se questo è un NO NO, se ho intenzione di imbattersi in problemi più grandi, troppi negativi ..

È questo l'ovvio soluzione? Qualcuno incontra lo stesso problema? Cosa suggerite voi ragazzi?

Grazie

+2

Perché è necessario creare miniature ogni anno? Non dovrebbe essere sufficiente creare una volta l'immagine originale per creare l'anteprima e lasciarla per sempre (fino a quando non è obsoleta)? –

+2

Hai controllato se l'esecuzione in modalità CLI non ha tempo di esecuzione? Normalmente per gli script CLI c'è '0' (nessun limite) per max_execution_time - http://php.net/manual/en/info.configuration.php # ini.max-execution-time – codedge

+0

un sacco di host condivisi interromperà uno script di lunga durata, non importa cosa fai - quindi controlla prima quello –

risposta

7

Supponendo che si ha un motivo per ricreare le miniature in modalità batch, invece di farlo ad ogni caricamento delle immagini, come è stato suggerito, farei esattamente come avete fatto - utilizza uno script che si aggiorna - tranne che non impostarei un numero fisso di immagini.

Piuttosto avrei il tempo di script stesso dopo ogni immagine, e fermarsi quando ha raggiunto, ad esempio, 25 secondi:

$stop = time() + 25; 
while (time() < $stop) { 
    ...find image to process, process it. 
    if (finished()) { 
     die("OK"); 
    } 
} 
// Redirect to next batch of images 
die(Header('Location: ....')); 

Tuttavia, fare controllo con il vostro ISP, perché lo script potrebbe essere o visto come un abuso del servizio, o potrebbe essere scambiato per un attacco. Inoltre, informarsi se esiste un orario preferito per eseguire questo tipo di manutenzione.

Un altro modo più naturale di fare la stessa cosa è far funzionare lo script per un numero molto piccolo di immagini (possibilmente uno solo) ogni volta che qualcuno visita la home page. Ciò ha l'effetto di far sì che il carico extra dello script imiti il ​​carico reale sul server, evitando picchi imbarazzanti o carichi misteriosi di base diversi da zero. È necessario trovare un modo per non scegliere mai la stessa immagine da diverse istanze dello script eseguite in parallelo (quando dovevo farlo, ho impostato un flag in un database).

+2

ricordati di _trackare l'ultima immagine elaborata con successo_ e iniziare da essa l'esecuzione successiva ... –

+0

Perché non limitarti a farlo uno alla volta? In particolare, semplificherebbe tutto – ArtisticPhoenix

+1

@ArtisiticPhoenix che porterà a (in questo caso)> 3800 richieste server entro un breve periodo di tempo. Rallenterà il server poiché stabilire la connessione per ogni richiesta richiede un po 'di tempo e CPU e se il server non avrà abbastanza risorse fisiche, in un caso molto brutto potrebbe andare giù. – lolbas