Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: funzione system()

  1. #1

    funzione system()

    Ciao a tutti, devo far eseguire un'operazione da linea di comando sul server per scompattare dei file utilizzando IZArc.
    Ora vorrei verificare che tale operazione sia andata a buon fine e nel caso catturare eventuali errori durante la scompattazione.
    Il codice è il seguente:
    codice:
    function estraiFile_indiciCSV($file){
        eliminaFileEsistenti($file);
        echo " Estrazione dei file \n";
        system('..\\script\\bin\\IZArc\\IZArc -ef '.getcwd().'\\temp '.$file, $return_var);
        if($return_var === false){
            trigger_error(" Errore durante l'estrazione del file .zip \n");
        }else if($return_var == 0){
    	//echo "returned var ".$return_var." \n";
            trigger_error(" Errore durante l'estrazione del file .zip \n");
        }else{
    	//echo "returned var ".$return_var." \n";
            echo " File estratti con successo \n";
        }
    }
    Ora, in qualsiasi caso la funzione system() mi restiruisce un errore (mi dà un PHP Notice) SEPPUR portando a termine correttamente la scompattazione!
    La funzione mi restituisce il valore 0 entrando quindi nel secondo if.
    Da manuale, dovrebbe restituire false se fallisce, ma quel controllo non lo degna di uno sguardo...


    Ci tengo a sottolineare che pure exec() e passthru() fanno la stessa cosa...

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    intanto dovresti assegnare il risultato della chiamata ad una variabile e controllare prima quella, poi puoi gestire i warning/notice con "@", quindi:


    Codice PHP:
    function estraiFile_indiciCSV($file){
        
    eliminaFileEsistenti($file);
        echo 
    " Estrazione dei file \n";
        @
    $r=system('..\\script\\bin\\IZArc\\IZArc -ef '.getcwd().'\\temp '.$file$return_var);
        if (
    $r===false) {
            
    trigger_error(" Errore chiamata\n");
        } else {
          
    // i valori seguenti dipendono dall'eseguibile chiamato
          // dubito possa restituire "false":
          // devi controllare i codici di risposta del prg chiamato
          
    if($return_var === false){
              
    trigger_error(" Errore durante l'estrazione del file .zip \n");
          }else if(
    $return_var == 0){
          
    //echo "returned var ".$return_var." \n";
              
    trigger_error(" Errore durante l'estrazione del file .zip \n");
          }else{
              
    //echo "returned var ".$return_var." \n";
              
    echo " File estratti con successo \n";
          }
        };


  3. #3

    problema esecuzione file sul server con funzione system()

    Ti ringrazio per la risposta, ho provato la tua funzione, ma lo stesso la system() mi restituisce 0.

    Stando al manuale, ad ogni modo, il primo controllo che fai, in realtà dovrebbe essere equivalente al secondo (se non per l'@) perchè la $return_var dovrebbe essere l'output del comando nel caso questo venga eseguito correttamente, oppure false nel caso ci siano degli errori in fase di esecuzione (oppure 0, come il mio caso).

    La cosa strana è che se anche io eseguo un semplice comando come "ls", di nuovo la system() (ma anche exec() e passthru() ) mi restituisce lo stesso PHP Notice e la $return_var è di nuovo uguale a 0.
    Invece se faccio eseguire una stringa casuale, sicuramente sbagliata, la $return_var mi restituisce 1
    La cosa sorprendente è che nonostante i comandi siano giusti e corretti, vedi il caso IZArc e anche "ls", e vengano eseguiti correttamente lato server, il valore restituito è sempre di errore, come se il comando non fosse stato eseguito correttamente.

    Forse non ho ben capito il funzionamento di tali funzioni, ma il Manuale PHP mi sembra abbastanza chiaro nella sua incompletezza...

  4. #4
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    ATTENZIONE :

    questa funziona restituisce l'0utput in 2 canali distinti.
    Il primo e' classico return il secondo eì la return var

    prova a fare :
    Codice PHP:
    $rv "QUESTA L?HO FATTA IO MUAGHAHAGAHAGAG PROVA A TOCCARLA ORA CHE TI SCASSO" ;
    $r = @system"ls" $rv ) ;


    echo 
    "<pre>" ;
    var_dump$r ) ;

    echo 
    "<hr>" ;

    var_dump($rv) ;

    echo 
    "</pre>" 

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    mah... non dovrebbe essere la stessa cosa perchè $r è il risultato della chiamata, mentre $result_var dell'esecuzione... quindi (ma non ho verificato) se la chiamata fallisce non è documentato cosa contenga $result_var (non c'è scritto infatti nei docs) e non so se possa essere un booleano (interessante da verificare)... inoltre: cosa dovrebbe restituirti la tua chiamata? non è che "0" è il valore corretto restituito?

  6. #6
    Originariamente inviato da Virus_101
    ATTENZIONE :

    questa funziona restituisce l'0utput in 2 canali distinti.
    Il primo e' classico return il secondo eì la return var
    Grazie anche a te per la risposta, è vero che le restituzioni sono 2:
    - la prima ($r nel tuo caso) cattura l'output a video, o meglio, l'ultima riga dell'output a video (nel caso specifico con il comando "ls", restituisce come stringa, l'ultima riga del contenuto della directory corrente, dopo avermelo stampato a video tutto)
    - la seconda ($rv nel tuo caso) mi dice se l'operazione è andata a buon fine, a differenza del manuale PHP, a me restituisce 0 o 1, il problema è che pur avendo svolto correttamente il suo compito (cioè stampato a video tutto il contenuto della directory) cmq il valore ritornato è 0 (che, fino a prova contraria, è da considerare uguale a false) in quanto attiva un PHP Notice

    Originariamente inviato da eiyen
    ATTENZIONE :
    mah... non dovrebbe essere la stessa cosa perchè $r è il risultato della chiamata, mentre $result_var dell'esecuzione... quindi (ma non ho verificato) se la chiamata fallisce non è documentato cosa contenga $result_var (non c'è scritto infatti nei docs) e non so se possa essere un booleano (interessante da verificare)... inoltre: cosa dovrebbe restituirti la tua chiamata? non è che "0" è il valore corretto restituito?
    La chiamata, dato che nel mio caso sto estraendo un file zippato, mi deve saper dire se l'esecuzione è andata a buon fine o meno. A me infatti interessa catturare proprio la seconda variabile e gestirla nel caso di errori di esecuzione.
    Il problema rimane nel senso che è la restituzione che la system() mi dà che non è corretta perchè anche nel caso "ls" mi restituisce sempre 0 (come intero tra l'altro) attivando il PHP Notice.

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    aspetta, però: $result_var è il responso del comando eseguito che spesso è un valore di stato e molto spesso "0" significa "nessun errore", quindi dovresti verificare esattamente i codici di risposta del comando che chiami e poi: potresti postare il warning completo che ti viene restituito?

  8. #8
    Originariamente inviato da eiyen
    aspetta, però: $result_var è il responso del comando eseguito che spesso è un valore di stato e molto spesso "0" significa "nessun errore", quindi dovresti verificare esattamente i codici di risposta del comando che chiami e poi: potresti postare il warning completo che ti viene restituito?
    Il PHP Notice non è di molto aiuto:
    codice:
    PHP Notice: <frase di errore che gli dico io> in <persorso del file> on line <numero della linea>
    Sto seriamente pensando che in realtà sia come dici tu un valore di stato quindi potrebbe benissimo essere che "0" significhi "nessun errore"... ma allora perchè il Notice?

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    Ok, allora mi sa che la situazione è questa: la chiamata riesce, il comando viene eseguito e restituisce un codice = 0 per dire "nessun errore"... il controllo (prendo il mio snippet a riferimento) supera la prima verifica e quando controlla il valore dello stato e trova "0" GENERA il notice con il tuo "trigger_error": in questo ramo NON dovresti generare un notice (prova a commentare la riga, p.es.)

  10. #10
    Originariamente inviato da eiyen
    Ok, allora mi sa che la situazione è questa: la chiamata riesce, il comando viene eseguito e restituisce un codice = 0 per dire "nessun errore"... il controllo (prendo il mio snippet a riferimento) supera la prima verifica e quando controlla il valore dello stato e trova "0" GENERA il notice con il tuo "trigger_error": in questo ramo NON dovresti generare un notice (prova a commentare la riga, p.es.)
    E infatti è quello che al momento faccio per non fargli generare il Notice dato che l'operazione riesce con successo sempre.
    Solo che ora la mia domanda è: perchè se il comando riesce (anche con il semplice "ls") mi dà 0, e se invece non riesce (perchè inserisco una stringa casuale come comando) mi restituisce 1???

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.