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

Discussione: Gestione Thread

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    324

    Gestione Thread

    Ciao a tutti,

    apro questa discussione perchè sono in difficoltà sulla gestione dei Thread. Nel senso che non riesco a trovare una guida dove spieghi decentemente come utilizzare al meglio i THREAD in php.
    Inoltre navigando su internet sono riuscito a trovare degli esempi di codice dove illustravano come usarli e che classe dovessi implementare.... Ma niente sembra che non funzioni....

    Adesso vi posto un po di codice che ho creato.

    Codice PHP:
    <?php      
           
    require_once 'thread/Thread.php';
           include(
    "connessione/ConfigurazioneDataBase.php");          
           
           
    session_start();      
           if(isset(
    $_SESSION['condizione'])){         
                  
    $condizione =  $_SESSION['condizione'];     
           }          
           
           
    $azione "";     
           if(isset(
    $_REQUEST['azione'])){         
                   
    $azione $_REQUEST['azione'];     
           }          
           
           
    $stato false
    ?>  

    <html>     
         <head>         
                <title>Schelutore</title>                  
                   <script type='text/javascript' src='js/prototype.js'></script>     
         </head>     
         <body>     
              <h2 align="center">Chat Server</h2>         
              <table align="center">             
                  <tr>                 
                     <td>[url="index.php?azione=avviaServer"]Avvio Server[/url]                 
                      <td>[url="index.php?azione=stopServer"]Stop Server[/url]             
                  </tr>         
               </table>                  

    <?php                      
              
               $thread 
    = new Thread('controlloUtenti');                           
               if(
    $azione == "avviaServer"){                                  
                  echo 
    "sono dentro";                                  
                  
    $file fopen("log/log.txt""a+");                 
                  
    fwrite($file"La scelta è ".$azione."\n");
               
                   
    $thread->start(1,10);                                  
                   while (
    $thread->isAlive()){                     
                         echo 
    "sono dentro 1";                     
                         
    $stato true;                     
                         
    $file fopen("log/log.txt""a+");                     
                         
    fwrite($file"Lo stato applicativo è true \n");                 
                    }             
                 }else{                 
                     
    $arrestoProcesso $thread->stop(1,true);                 
                     
    $file fopen("log/log.txt""a+");                 
                     
    fwrite($file"Lo stato applicativo è ".$arrestoProcesso."\n");                        
                 }
              
                 function 
    controlloUtenti(){                 
                     
    $connessione = new ConfigurazioneDataBase();                 
                     
    $db $connessione->connetti();                  
                     
    $azione "";                                   
                     
    $query "select ospite.id_ospite,ospite.dataValidita,ospite.nickname,chat.id_channel from tbl_ospiti as ospite, tbl_chat as chat where ospite.attivo = true and chat.id_ospite = ospite.id_ospite GROUP BY ospite.id_ospite";                         
                     
    $resultSet mysql_query($query$db) or die (mysql_error());
                     
    $file fopen("log/log.txt","a+"); 
                     
    fwrite($file"Query eseguita");
                     
    sleep(1000);
                  }
    ?>     
       </body> 
    </html>
    Questo è il codice della mia pagina index.php.

    Adesso qualcuno mi sa dire come mai il Thread non parte? O meglio non funziona.....
    Inoltre avrei una domanda da chiedere nel metodo ->stop() al suo interno che valori devono essere passati? O meglio che cosa dovrebbero indicare?

    Grazie anticipatamente.

  2. #2
    Se non posti la classe "Thread.php" ci vuole la sfera di cristallo!
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    324
    Originariamente inviato da satifal
    Se non posti la classe "Thread.php" ci vuole la sfera di cristallo!
    scusa hai ragione ho dato per costanto che si conosceva già.... Comunque, da quanto sono riuscito a capire cercando su internet, la classe Thread.php serve per la gestione dei thread in php... sbaglio?

    Ecco il codice della classe:

    Codice PHP:
    <?php 
          
    /**  * Implements threading in PHP  
           *   * @package <none>
           * @version 1.0.0 - stable  * @author Tudor Barbu <miau@motane.lu>  
           * @copyright MIT  */ 

    class Thread {     
           const 
    FUNCTION_NOT_CALLABLE     10;     
           const 
    COULD_NOT_FORK            15;          

          
    /**      * possible errors      
           *      * @var array      
           */     
     
    private $errors = array(         
          
    Thread::FUNCTION_NOT_CALLABLE   => 'You must specify a valid function name that can be called from the current scope.',         
          
    Thread::COULD_NOT_FORK          => 'pcntl_fork() returned a status of -1. No new process was created',     );          

          
    /**      * callback for the function that should      
           * run as a separate thread      
           *      * @var callback      */     

    protected $runnable;          

          
    /**      
           * holds the current process id      
           *      * @var integer      */     

           
    private $pid;          

           
    /**      
            * hodls exit code after child die      
            */     
     
           
    private $exitCode = -1;      

            
    /**      
             * checks if threading is supported by the current      
             * PHP configuration      
             *      * @return boolean      
             */     

             
    public static function available() {         
                 
    $required_functions = array(             'pcntl_fork',         );                  
                 foreach( 
    $required_functions as $function ) {             
                    if ( !
    function_exists$function ) ) {                 
                          return 
    false;             
                    }         
                  }                  
                 return 
    true;     
             }          
     
             
    /**      * class constructor - you can pass      
              * the callback function as an argument      
              *      * @param callback $_runnable      
              */     

               
    public function __construct$_runnable null ) {         
                   if( 
    $_runnable !== null ) {             
                       
    $this->setRunnable$_runnable );         
                   }     
                }          

             
    /**      
              * sets the callback      
              *      * @param callback $_runnable      
              * @return callback     
              */     

              
    public function setRunnable$_runnable ) {         
                     if( 
    self::runnableOk$_runnable ) ) {             
                         
    $this->runnable $_runnable;         
                     }else {             
                         throw new 
    Exception$this->getErrorThread::FUNCTION_NOT_CALLABLE ), Thread::FUNCTION_NOT_CALLABLE );         
                     }     
               }          

               
    /**      * gets the callback      
                *      * @return callback      
                */     

               
    public function getRunnable() {         
                        return 
    $this->runnable;     
                }          

                
    /**      * checks if the callback is ok (the function/method      
                 * actually exists and is runnable from the current      
                 * context)      
                 *       * can be called statically      
                 *      * @param callback $_runnable      
                 * @return boolean      
                 */     

                 
    public static function runnableOk$_runnable ) {         
                      return ( 
    function_exists$_runnable ) && is_callable$_runnable ) );     
                 }          

                 
    /**      * returns the process id (pid) of the simulated thread      
                  *       * @return int      
                  */     

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

                  
    /**      * checks if the child thread is alive      
                   *      * @return boolean      
                   */     
    public function isAlive() {         
     
                  
    $pid pcntl_waitpid$this->pid$statusWNOHANG );                  
                   if (
    $pid === 0) { 
                           
    // child is still alive             
                           
    return true;         
                    } else {             
                          if (
    pcntl_wifexited($status) && $this->exitCode == -1) {
                              
    // normal exit                 
                              
    $this->exitCode pcntl_wexitstatus($status);             
                          }             
                        return 
    false;         
                    }     
                 }      
      
                
    /**      * return exit code of child (-1 if child is still alive)      
                 *      * @return int      
                 */     

               
    public function getExitCode() {         
                      
    $this->isAlive();         
                      return 
    $this->exitCode;     
               }          

               
    /**      * starts the thread, all the parameters are       
                * passed to the callback function      
                *       * @return void      
                */     

               
    public function start() {         
                     
    $pid = @ pcntl_fork();         
                     if( 
    $pid == -) {             
                        throw new 
    Exception$this->getErrorThread::COULD_NOT_FORK ), Thread::COULD_NOT_FORK );         
                     }         
                     if( 
    $pid ) {             
                          
    // parent              
                          
    $this->pid $pid;         
                     }else {             
                          
    // child             
                          
    pcntl_signalSIGTERM, array( $this'signalHandler' ) );             
                          
    $arguments func_get_args();             
                          if ( !empty( 
    $arguments ) ) {                 
                               
    call_user_func_array$this->runnable$arguments );             
                          }else {                 
                               
    call_user_func$this->runnable );
                          }                          
                          exit( 
    );         
                     }     
                    }

                   
    /**      * attempts to stop the thread      
                    * returns true on success and false otherwise      
                    *      * @param integer $_signal - SIGKILL/SIGTERM      
                    * @param boolean $_wait      
                    */     

                    
    public function stop$_signal SIGKILL$_wait false ) {         
                            if( 
    $this->isAlive() ) {             
                                  
    posix_kill$this->pid$_signal );             
                                  if( 
    $_wait ) {                 
                                       
    pcntl_waitpid$this->pid$status );             
                                  }         
                             }     
                     }          

                     
    /**      * alias of stop();      
                      *      * @return boolean      
                      */     
     
                    
    public function kill$_signal SIGKILL$_wait false ) {         
                         return 
    $this->stop$_signal$_wait );     
                    }          

                    
    /**      * gets the error's message based on      
                     * its id      
                     *      * @param integer $_code      
                     * @return string      
                     */     

                    
    public function getError$_code ) {         
                            if ( isset( 
    $this->errors[$_code] ) ) {             
                                   return 
    $this->errors[$_code];         
                            }else {             
                                 return 
    'No such error code ' $_code '! Quit inventing errors!!!';         
                            }     
                     }          

                     
    /**      * signal handler      
                      *      * @param integer $_signal      
                      */     

                    
    protected function signalHandler$_signal ) {         
                           switch( 
    $_signal ) {             
                                   case 
    SIGTERM:                 
                                        exit( 
    );             
                                        break;         
                           }     
                     }  
    }  

    // EOF

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    324
    Qualcuno per caso sa dove posso trovare qualche tutorial e/o guida che spiega come usare i Thread in php?

    Grazie anticipatamente

  5. #5
    Originariamente inviato da manublack
    Qualcuno per caso sa dove posso trovare qualche tutorial e/o guida che spiega come usare i Thread in php?

    Grazie anticipatamente
    ma non dovresti far partire il thread tipo da un cron piuttosto che da dentro apache? non vorrei che quello quando la richiesta si esaurisce ti cancelli pure i thread correlati. Poi sinceramente da come l'hai strutturato, dubito che faccia quello che vuoi: basti solo pensare che ogni volta che tu richiami quella pagina quello crea un nuovo thread, lo stop non funzionerà mai
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    324
    Originariamente inviato da Santino83_02
    ma non dovresti far partire il thread tipo da un cron piuttosto che da dentro apache? non vorrei che quello quando la richiesta si esaurisce ti cancelli pure i thread correlati. Poi sinceramente da come l'hai strutturato, dubito che faccia quello che vuoi: basti solo pensare che ogni volta che tu richiami quella pagina quello crea un nuovo thread, lo stop non funzionerà mai
    lo so strutturato cosi direi che effettivamente fa molto pena.... ma purtroppo sto cercando a tutti i costi di fare un applicazione che mi permetta di avere un processo, lato backend, che sia sempre attivo o non attivo a seconda della scelta che decido di fare....

    Mi spiego meglio io vorrei creare un Thread che giri sempre e vada in sleep per un tot di tempo e dopodichè concluso lo sleep rieffettui nuovamente le procedura... Tutto questo monitorizzato attraverso un interfaccia, creata da me, che mi esponga lo stato di questo Thread in modo che se è attivo lo possa stoppare e se è fermo avviarlo.... Tutto li... io vorrei fare una cosa del genere...

    solo che googlando qua e la non si trovano molte cose che spiegano come gestire i Thread in php... anzi addirittura mi è apparso di capire che php non li gestisce proprio questo tipo di cose... è vero? Se cosi non fosse avreste delle guide o tutorial da consigliare a riguardo?

    Questo mi serve per questioni lavorative...

    Grazie anticipatamente.

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    324
    up!!!

  8. #8
    mah visto tutto, io eviterei di far partire il thread da dentro apache.

    l'idea di fondo potrebbe essere: faccio uno script bash (anche con php) richiamato da shell a cui passo dei parametri, che so " myjob.php start" o "myjob.php stop" e lo script fa partire o stoppare il thread a seconda del parametro. Per sapere se il 3d è vivo o morto ci possono essere varie tecniche, una simpatica è fargli aprire un oscket di controllo per controllarlo, oppure usando un pid file, oppure leggendo l'elenco dei processi... insomma, dipende.

    sul supporto dei thread da parte di php, non mi pare ci sia niente di molto ufficiale, apparte qualcosa nella pecl.
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  9. #9
    parlo da ignorante in materia Thread con PHP.

    ma non sarebbe meglio e più facile gestire queste cose tramite AJAX?
    alla fine il risultato che ottieni è praticamente lo stess, o no?

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    324
    Originariamente inviato da Santino83_02
    mah visto tutto, io eviterei di far partire il thread da dentro apache.

    l'idea di fondo potrebbe essere: faccio uno script bash (anche con php) richiamato da shell a cui passo dei parametri, che so " myjob.php start" o "myjob.php stop" e lo script fa partire o stoppare il thread a seconda del parametro. Per sapere se il 3d è vivo o morto ci possono essere varie tecniche, una simpatica è fargli aprire un oscket di controllo per controllarlo, oppure usando un pid file, oppure leggendo l'elenco dei processi... insomma, dipende.

    sul supporto dei thread da parte di php, non mi pare ci sia niente di molto ufficiale, apparte qualcosa nella pecl.
    grazie per la risposta, va bene anche la tua proposta solo che sinceramente a livello pratico non so proprio da dove iniziare....

    Sapresti darmi una mano a tal proposito?

    Grazie anticipatamente.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.