Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
PHP - Stampare lo status di exec() php ...
Forum - PHP - Stampare lo status di exec() php ...

Avatar
giocala88 (Normal User)
Expert


Messaggi: 243
Iscritto: 23/04/2008

Segnala al moderatore
Postato alle 20:10
Mercoledì, 25/01/2012
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...

Codice sorgente - presumibilmente Php

  1. <?php
  2.     // You may use status(), start(), and stop(). notice that start() method gets called automatically one time.
  3.     $process = new Process('ls -al');
  4.  
  5.     // or if you got the pid, however here only the status() metod will work.
  6.     $process = new Process();
  7.     $process.setPid(my_pid);
  8. ?>
  9.  
  10. <?php
  11.     // Then you can start/stop/ check status of the job.
  12.     $process.stop();
  13.     $process.start();
  14.     if ($process.status()){
  15.         echo "The process is currently running";
  16.     }else{
  17.         echo "The process is not running.";
  18.     }
  19. ?>
  20.  
  21. <?php
  22. /* An easy way to keep in track of external processes.
  23.  * 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.
  24.  * @compability: Linux only. (Windows does not work).
  25.  * @author: Peec
  26.  */
  27. class Process{
  28.     private $pid;
  29.     private $command;
  30.  
  31.     public function __construct($cl=false){
  32.         if ($cl != false){
  33.             $this->command = $cl;
  34.             $this->runCom();
  35.         }
  36.     }
  37.     private function runCom(){
  38.         $command = 'nohup '.$this->command.' > /dev/null 2>&1 & echo $!';
  39.         exec($command ,$op);
  40.         $this->pid = (int)$op[0];
  41.     }
  42.  
  43.     public function setPid($pid){
  44.         $this->pid = $pid;
  45.     }
  46.  
  47.     public function getPid(){
  48.         return $this->pid;
  49.     }
  50.  
  51.     public function status(){
  52.         $command = 'ps -p '.$this->pid;
  53.         exec($command,$op);
  54.         if (!isset($op[1]))return false;
  55.         else return true;
  56.     }
  57.  
  58.     public function start(){
  59.         if ($this->command != '')$this->runCom();
  60.         else return true;
  61.     }
  62.  
  63.     public function stop(){
  64.         $command = 'kill '.$this->pid;
  65.         exec($command);
  66.         if ($this->status() == false)return true;
  67.         else return false;
  68.     }
  69. }
  70. ?>



Pensate che potrebbe servirmi a qualcosa? 8-|
Grazie a tutti ...

PM
Avatar
GN (Member)
Guru


Messaggi: 770
Iscritto: 30/04/2011

Up
1
Down
V
Segnala al moderatore
Postato alle 22:36
Mercoledì, 25/01/2012
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 http://it2.php.net/manual/en/function.filesize.php) 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 il 27/01/2012 alle 18:26
innanzitutto grazie per la risposta e l'interessamento ... cmq il programma che uso è ffmpeg in ambiente linux. il link della pagina del codice che ho trovato è http://php.net/manual/en/function.exec.php. Quindi come potrei pocedere? Qualche codice da modificare si trova in rete? Grazie ancora... - giocala88 - 25/01/12 22:43
uhm... forse sono totn - GN - 26/01/12 21:49
Uhm, ho googlato un po' ma non ho trovato niente che spiegasse come ottenere lo stato di un progresso lanciato con exec(). Ho però trovato un modo di implementare ffmpeg direttamente in php: http://ffmpeg-php.sourceforge.net/ . Prova a vedere se può servirti. - GN - 26/01/12 21:57
ho googlato anchio ma non ho trovato nulla... il problema vero e proprio è che quando si apre la pagina di conversione questa visualizza il file mp3 prima che esso stesso sia stato convertito correttamente. Come posso ovviare a questo problema? - giocala88 - 27/01/12 00:04
[quote]uhm... forse sono totn - GN - 26/01/12 21:49 [/quote] Ho premuto invio per sbaglio, un moderatore può cancellare questi due commenti - GN - 27/01/12 18:28
Ho avuto un'idea e modificato il post, prova a vedere se ti interessa. - GN - 27/01/12 21:24
Non ho capito scusa? potresti essere chiaro perfavore? Che post hai modificato? Che idea? - giocala88 - 28/01/12 13:57
Il post che stiamo commentando, la modifica comincia dove ho scritto EDIT. - GN - 29/01/12 13:40
avevo pensato la stessa cosa anchio e il tuo suggerimento chirisce tutto ... grazie di tutto ;) - giocala88 - 29/01/12 22:04
Di niente ;) - GN - 30/01/12 21:31


PM