Visualizzazione risultati 1 fino 24 di 24
Like Tree2Likes
  • 2 Post By dreadnaut

Discussione: Avvio Script PHP in background

  1. #1
    snclab non è connesso Neofita
    Data registrazione
    05-01-2009
    Messaggi
    12

    Predefinito Avvio Script PHP in background

    Ciao a tutti,

    avrei la necessità di avviare uno script in background, mi spiego meglio:

    eseguendo una determinata operazione tramite pagina html o cmq php dovrebbe partire uno script in php che esegue delle operazioni sul db presente sempre su altervista

    essendo che queste operazioni potrebbero durare diversi minuti, vorrei evitare di dover tenere la pagina web aperta
    quindi vorrei poter eseguire questo script in background

    Avete dei suggerimenti ?
    purtroppo shell_exec e exec non sono abilitati per ragioni di sicurezza (ci sta) quindi non posso eseguire comandi tipo php nomefile.php

    Grazie in anticipo!

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Se l'esecuzione è avviata da un'azione su una pagina HTML o PHP più che "in background" stai cercando un'esecuzione asincrona. Puoi usare AJAX per questo scopo: dalla pagina HTML parte una richiesta HTTP verso una pagina PHP nel server, la quale avvierà l'operazione che ti interessa. La pagina HTML non deve necessariamente attendere una risposta, dopo aver avviato la richiesta può essere chiusa.

    Attenzione ai tempi di esecuzione, il limite per gli script PHP è di 180 secondi, o qualcosa di simile. Per evitare di tenere occupate le risorse del server con un singolo script troppo a lungo.

    I suggerimenti che do più spesso:


  3. #3
    snclab non è connesso Neofita
    Data registrazione
    05-01-2009
    Messaggi
    12

    Predefinito

    grazie per la risposta, proverò con ajax
    ma se invece volessi proprio lanciarlo in background ?
    su altri sistemi usavo per esempio shell_exec("php file.php")

  4. #4
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Con shell_exec i comandi vengono comunque eseguiti in foreground, non in background, a meno che il comando non sia modificato opportunamente (per esempio su un sistema UNIX-like: php file.php 1>/dev/null 2>/dev/null &).
    C'è anche una nota di exec che lo spiega.
    Di conseguenza le istruzioni shell_exec("php file.php"); e include "file.php" sono fondamentalmente equivalenti, al netto della gestione dell'output .

    Non essendo previsto accesso tramite terminale non c'è la possibilità di lanciare veri processi in background, quello che ci va più vicino sono i cronjob.
    Il più delle volte, però, non c'è bisogno che un processo sia in background, è sufficiente che sia asincrono. In quel caso ci sono i thread di PHP, che non ricordo se siano utilizzabili su AlterVista.
    Ultima modifica di mzanella : 08-09-2020 alle ore 14.11.24

    I suggerimenti che do più spesso:


  5. #5
    snclab non è connesso Neofita
    Data registrazione
    05-01-2009
    Messaggi
    12

    Predefinito

    sei stato chiarissimo! grazie
    purtroppo con ajax non va perchè dopo qualche secondo lo script viene arrestato
    la sua esecuzione dura un totale qualche minuto
    con il metodo che usavo in precedenza lasciando la pagina web aperta riuscivo a far terminare la sua esecuzione

  6. #6
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    purtroppo con ajax non va perchè dopo qualche secondo lo script viene arrestato
    Questo non è normale, va verificato cosa sta succedendo.

    con il metodo che usavo in precedenza lasciando la pagina web aperta riuscivo a far terminare la sua esecuzione
    Ha senso, "lasciando la pagina aperta" stavi infatti lasciando il processo in "foreground".

    I suggerimenti che do più spesso:


  7. #7
    snclab non è connesso Neofita
    Data registrazione
    05-01-2009
    Messaggi
    12

    Predefinito

    la funzione ajax richiama lo stesso identico script che usavo in precedenza
    l'ho scritta così

    Codice:
    		$.ajax({
    		type: "POST",
    		url: "import.php",
    		data: {
    			STARTBYFILE: "START",
          		selectedFile: selectedFile
        	},
    
    	});
    il valore della variabile selectedFile è corretto avevo messo un alert per verificarne il contenuto

  8. #8
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    La parte JavaScript sembra corretta.
    Hai modo di monitorare l'esecuzione dello script PHP? Qualche log?
    Così a intuito mi viene da pensare che il problema possa essere il passaggio di parametri. Lo script chiamato tramite exec vedrà i propri argomenti in $argv, chiamato tramite AJAX li avrà in $_POST.

    I suggerimenti che do più spesso:


  9. #9
    snclab non è connesso Neofita
    Data registrazione
    05-01-2009
    Messaggi
    12

    Predefinito

    i parametri passano correttamente, infatti inizia ad aggiornare il db con i dati corretti, poi si arresta
    non ho un log, hai suggerimenti su come poter fare un debug ?

    AGGIUNGO

    tramite onclick su un button avvio la seguente funzione

    Codice:
    function Aggiorna(){
    	
    	var selectedFile = $("#selectedFile :selected").text();
    	
    		$.ajax({
    		type: "POST",
    		url: "import.php",
    		data: {
    			STARTBYFILE: "START",
          		selectedFile: selectedFile
        	},
    
    	});
    	
    	
    }
    Ultima modifica di snclab : 08-09-2020 alle ore 14.50.40

  10. #10
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Crea un log in cui registri tutte le operazioni svolte e -soprattutto- warning, errori ed eccezioni.

    Per gli errori puoi provare
    Codice PHP:
    ini_set('log_errors', TRUE);
    ini_set('error_log', 'your/path/to/errors.log');
    per le eccezioni basta un unico try/catch temporaneo attorno all'intero codice:
    Codice PHP:
    try {
    ...
    }
    catch(
    Exception $e) {
    error_log($e->getMessage(), 3, 'your/path/to/errors.log');
    }
    Sarebbe più carino registrando un exception handler, ma per un test rapido può essere sufficiente così.

    I suggerimenti che do più spesso:


  11. #11
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Parametri POST li puoi recuperare con echo file_get_contents('php://input'); mentre il file con enctype="multipart/form-data" e i relativi errori da $_FILES.
    Ultima modifica di darbula : 08-09-2020 alle ore 14.56.38

  12. #12
    snclab non è connesso Neofita
    Data registrazione
    05-01-2009
    Messaggi
    12

    Predefinito

    cavolo! diventa leggermente complicato
    sono circa 500 righe in cui ci stanno cicli for e while
    andare a posizionare try e catch...diventa un lavorone :(

    se non ci sono altre soluzioni appena ho un pò di tempo in più, mi armo di pazienza e lo faccio!

    intanto, grazie mille per il tuo aiuto

  13. #13
    snclab non è connesso Neofita
    Data registrazione
    05-01-2009
    Messaggi
    12

    Predefinito

    i parametri post sono corretti
    enctype="multipart/form-data" e i relativi errori da $_FILES.
    non ho capito, non sto comunque inviando una form

  14. #14
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Invi comunque i dati POST a import.php data con un un'oggetto { a: "bc", d: "e,f" } sarà convertito in a=bc&d=e%2Cf (percent enconding) in php://input trovi i dati grezzi del metodo POST.
    Ultima modifica di darbula : 08-09-2020 alle ore 15.30.52

  15. #15
    snclab non è connesso Neofita
    Data registrazione
    05-01-2009
    Messaggi
    12

    Predefinito

    ok grazie, ma quelli arrivano correttamente, li avevo già verificati scrivendoli in un file
    quindi se ti riferisci a STARTBYFILE e selectedFile, li non ci stanno problemi

  16. #16
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Ok ho frainteso, imposta a 60 secondi il tempo massimo di esecuzione (ti devi adeguare a 59 secondi e non potrai andare oltre) http://it.help.altervista.org/w/Conf...ta_(.htaccess)

  17. #17
    snclab non è connesso Neofita
    Data registrazione
    05-01-2009
    Messaggi
    12

    Predefinito

    Mi sa proprio che non ci rientro in 59 secondi :(
    Credo a questo punto che dovrò proseguire come ho fatto ad oggi, lasciando aperta la pagina

  18. #18
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Anche lasciando aperta la pagina hai il limite sul tempo di esecuzione.

    I suggerimenti che do più spesso:


  19. #19
    snclab non è connesso Neofita
    Data registrazione
    05-01-2009
    Messaggi
    12

    Predefinito

    però, intanto con la pagina aperta non si arresta, a volte impiega pure 5 minuti senza fermarsi

  20. #20
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Questo non dovrebbe succedere .
    Potresti aver scovato un bug nel server.

    5 minuti è un tempo molto lungo, non sembra un processo adatto a un webserver.

    I suggerimenti che do più spesso:


  21. #21
    snclab non è connesso Neofita
    Data registrazione
    05-01-2009
    Messaggi
    12

    Predefinito

    forse rimane attivo perchè ricarico ogni tot di secondi, il frame in cui ho l'output

  22. #22
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,259

    Predefinito

    Cosa fa questo script? Si potrebbe spezzare in passi?

  23. #23
    snclab non è connesso Neofita
    Data registrazione
    05-01-2009
    Messaggi
    12

    Predefinito

    legge un file csv contenente dei turni e aggiorna un db
    il file è unico, dovrei sezionarlo ma credo che la cosa diventi complicata

    a questo punto lascio tutto così, tanto tenera la pagina aperta 1 o 2 minuti in più, realmente non mi cambia più di tanto!

    Grazie mille ragazzi per le dritte :)

  24. #24
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,259

    Predefinito

    Citazione Originalmente inviato da snclab Visualizza messaggio
    legge un file csv contenente dei turni e aggiorna un db
    Di quante righe stiamo parlando? più di 10000?
    Se stai facendo una query per riga, potremmo aver scoperto il problema

    Puoi rendere il processo più veloce creando una query singola che aggiorni più righe, oppure utilizzando prepared statement.
    mzanella and GraphOGLRisorse like this.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •