Oppure

Loading
25/01/12 19:10
giocala88
Salve ragazzi ho creato una pagina web con la funzione exec() che converte un video da avi in mp3. La funzione va benissimo sia da shell che da php...ora però vorrei stampare a video lo status della conversione ed indicare all'utente a che punto è la stessa es: 10%,11%, 12% ... e così via. Esiste un modo per implementare una roba del genere? Io non saprei proprio da dove iniziare.
Comunque in rete ho trovato questo codice...

<?php
    // You may use status(), start(), and stop(). notice that start() method gets called automatically one time.
    $process = new Process('ls -al');

    // or if you got the pid, however here only the status() metod will work.
    $process = new Process();
    $process.setPid(my_pid);
?>

<?php
    // Then you can start/stop/ check status of the job.
    $process.stop();
    $process.start();
    if ($process.status()){
        echo "The process is currently running";
    }else{
        echo "The process is not running.";
    }
?>

<?php
/* An easy way to keep in track of external processes.
 * Ever wanted to execute a process in php, but you still wanted to have somewhat controll of the process ? Well.. This is a way of doing it.
 * @compability: Linux only. (Windows does not work).
 * @author: Peec
 */
class Process{
    private $pid;
    private $command;

    public function __construct($cl=false){
        if ($cl != false){
            $this->command = $cl;
            $this->runCom();
        }
    }
    private function runCom(){
        $command = 'nohup '.$this->command.' > /dev/null 2>&1 & echo $!';
        exec($command ,$op);
        $this->pid = (int)$op[0];
    }

    public function setPid($pid){
        $this->pid = $pid;
    }

    public function getPid(){
        return $this->pid;
    }

    public function status(){
        $command = 'ps -p '.$this->pid;
        exec($command,$op);
        if (!isset($op[1]))return false;
        else return true;
    }

    public function start(){
        if ($this->command != '')$this->runCom();
        else return true;
    }

    public function stop(){
        $command = 'kill '.$this->pid;
        exec($command);
        if ($this->status() == false)return true;
        else return false;
    }
}
?>


Pensate che potrebbe servirmi a qualcosa? 8-|
Grazie a tutti ...
aaa
25/01/12 21:36
GN
Prova a linkare la pagina dove l'hai visto, forse si riesce a trovare un po' di documentazione.
Dal punto di vista teorico, secondo me, dovresti fare una pagina che esegue il processo e ne riporta ogni tot secondi il progresso, per esempio in un file sul server, e una che legge il processo dal file. Ogni processo dovrà avere un id univoco per evitare conflitti tra i vari utenti che caricano la pagina. Il progresso sarà facilmente leggibile dal lato client usando una richiesta AJAX, ogni tot secondi, alla seconda pagina e passando come parametro l'id univoco.
Ho dato un'occhiata alla documentazione di exec(), e ho capito (prima non lo sapevo ancora) che serve a eseguire un programma esterno; immagino che nel tuo caso sia il convertitore da avi a mp3. Il problema, a questo punto, è in questo programma: se l'hai scritto tu, potresti modificarlo in modo che salvi il progresso ogni volta che cambia in un file, anzi meglio in una tabella di database con due campi: id e progresso, che poi viene letta da una pagina php richiesta dal client con AJAX.
Ricapitolando, secondo me potresti fare così:
1)Costruire una tabella di database con due campi: id e progresso;
2)Modificare la pagina che avvia la conversione in modo che prima di chiamare exec() generi un id univoco e inserisca un nuovo record nella tabella con l'id generato e progresso 0;
3)Modificare il programma di conversione in modo che prenda un parametro da riga di comando (da passare nella exec) con l'id e che al variare del progresso, salvi questo nel record con l'id passato alla riga di comando;
4)Scrivere una nuova pagina php che, dato un parametro get o post, forse è più semplice get, contenente l'id, restituisca il relativo prograsso letto da database;
5)Inserire nella pagina per l'utente uno script javascript con un setinterval() che ogni 1 o 2 secondi richieda il progresso al server tramite AJAX e lo aggiorni nella pagina.

EDIT: mi è venuta un'idea. Ho pensato che ffmpeg, una volta avviato da linea di comando, inizierà la conversione scrivendo l'output in un file sul server; se riuscissi a trovare la dimensione prevista per questo file prima della conversione, potresti metterla in un'altro campo di database; nella pagina da chiamare tramite AJAX, potresti fare una proporzione tra la dimensione attuale del file e quella prevista come totale e ricavare quindi la percentuale.
Riguardo alla necessità di ottenere un valore che indica se la conversione è finita, potresti aggiungere un altro campo di database con l'ultima dimensione di file verificata; ad ogni (costante) richiesta del client:
a)Se la dimensione attuale (che puoi verificare con it2.php.net/manual/en/…) del file è maggiore di quella salvata nel database, aggiornare il valore nel database stasso;
b)Se non è maggiore, mostrare il link per il download.
Ultima modifica effettuata da GN 27/01/12 17:26
aaa