2010-01-27 5 views
6

ho bisogno di creare uno script in linguaggio PHP che esegue la permutazione dei numeri. Ma PHP ha un limite di tempo di esecuzione impostato su 60 secondi. Come posso eseguire lo script in modo che se è necessario eseguire più di 60 sesunde, non è stato interrotto dal server. So che posso modificare il limite massimo di tempo di esecuzione in php, ma voglio sentire un'altra versione che non richiede di sapere in anticipo il tempo di esecuzione di uno script.Evitare l'esecuzione di PHP termine

Un amico mi ha suggerito di accedere e uscire spesso dal server, ma non ho idea di come fare questo.

Qualsiasi consiglio è benvenuto. Un codice di esempio sarebbe utile.

Grazie.

Prima devo inserire un numero, diciamo 25. Dopo questo lo script viene avviato e deve fare quanto segue: per ogni numero < = di 25 si creerà un file con i numeri generati nell'attuale palcoscenico; per il prossimo numero aprirà il file creato in precedenza e creerà un altro file base sulle linee del file aperto e così via. Perché questo richiede molto tempo, ho bisogno di evitare che lo script sia introverso dal server.

risposta

2

@emanuel:

Credo che quando il tuo amico ti ha detto "Un amico mi ha suggerito di accedere e uscire spesso dal server, ma non ho idea di come fare questo", lui/lei deve hanno fatto sì "Dividere il calcolo script in x pezzi di lavoro e di eseguire separatamente"

ad esempio, con questo script è possibile eseguirlo 150 volte per ottenere un 150! (Fattorizzare) e mostrare il risultato:

// sceneggiatura nome: calc.php

<?php 

session_start(); 

if(!isset($_SESSION['times'])){ 

    $_SESSION['times'] = 1; 

    $_SESSION['result'] = 0; 

}elseif($_SESSION['times'] < 150){ 

    $_SESSION['times']++; 

    $_SESSION['result'] = $_SESSION['result'] * $_SESSION['times']; 

    header('Location: calc.php'); 

}elseif($_SESSION['times'] == 150){ 

    echo "The Result is: " . $_SESSION['result']; 

    die(); 

} 

?> 

BTW (@Davmuz), è possibile utilizzare solo la funzione set_time_limit() su server Apache, non è una funzione valida su server Microsoft IIS.

+0

+1 Questo è essenzialmente l'implementazione lato client della mia risposta: mettila a pezzi ed eseguine uno per uno. Tuttavia, in questa soluzione, se il browser è chiuso, il processo termina. –

+1

@turik Come commentato di seguito: '$ _SESSION ['result'] = 1;' alla riga 5. –

0
set_time_limit(0) 
+0

Ti rendi conto che ha specificamente detto che NON lo voleva? –

+0

Anche se questo è esattamente ciò che la domanda richiede, penso che sarebbe meglio ad esempio utilizzare set_time_limit (20) in ogni iterazione di un ciclo. – svens

+0

@svens Mentre l'OP dice espressamente che non vuole cambiare il limite di tempo, sono d'accordo che probabilmente sarà il modo migliore per farlo. –

0

Si potrebbe provare a mettere le chiamate che si desidera fare in una coda, che si serializzare in un file (cache o la memoria?) Quando un'operazione è fatto. Quindi è possibile utilizzare un demone CRON per eseguire questa coda ogni sessanta secondi, quindi continua a eseguire il lavoro e termina l'attività.

Gli svantaggi di questo approccio sono problemi con l'aggiunta alla coda, con blocco dei file e il come, e se avete bisogno immediatamente i risultati, questo può rivelarsi problematico. Se stai aggiungendo cose a un Db, potrebbe funzionare. Inoltre, non è molto efficiente.

0

Usa set_time_limit (0), ma è necessario disattivare il safe_mode: http://php.net/manual/en/function.set-time-limit.php Suggerisco di usare un tempo fisso (set_time_limit (300)), perché se c'è un problema nello script (un circuito senza fine o perdite di memoria) questo non può essere una fonte di problemi.

Il web server, come Apache, hanno anche un limite di tempo massimo di 300 secondi, quindi bisogna cambiarlo. Se si desidera eseguire un'applicazione Comet, potrebbe essere preferibile scegliere un altro server Web diverso da Apache che può richiedere tempi lunghi.

Se avete bisogno di un lungo tempo di esecuzione per un algoritmo pesante, è anche possibile implementare un'elaborazione parallela: http://www.google.com/#q=php+parallel+processing o memorizzare i dati di input e computer con un altro script esterno con un cron o qualsiasi altra cosa.

+0

Si prega di specificare cosa si deve fare, le risposte potrebbero essere più accurate. – Davmuz