Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    82

    Eseguire un ciclo senza aspettare che finisca

    Ho uno script in php che contiene un ciclo che invia tramite ftp delle etichette ad una stampante che poi con calma le processa

    Dato che anche l'ftp è lento e mi capita di dover eseguire un ciclo di oltre 100 secondi, mi chiedevo se c'è un modo da php di avviare il ciclo, lasciarlo 'sullo sfondo' in esecuzione e quindi poter comunque mostrare 'script ftp avviato' all'utente....

    help...

  2. #2
    Praticamente, qual'è il tuo problema?

    Viene visualizzato il risultato solo dopo che finisce di eseguire?
    Realizzazione Software, Siti Web ed E-commerce. Consulenza Software ed esperti open source ...
    Scopri i nostri servizi...

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    82
    io ho una form che mi consente di avviare la stampa su una stampante remota che accetta file via ftp soltanto. Di per se la comunicazione ftp è lenta, e in più questa accetta solo un file per volta.

    Se, caso raro ma accade ai miei utenti, devono stampare manualmente 30 etichette, il ciclo che si occupa dell'ftp impiega quasi 4 secondi (delay imposto di fabbrica tra una sessione ftp e l'altra) tra un etichetta e l'altra per un totale di 120 secondi. Durante i quali l'utente DEVE fare altro.

    Così mi sono detto: io lancio in qualche modo uo script esterno, un thread, o che altro, che si occupi della stampa, e nel frattempo l'utente ha la sua maschera comunque disponibile.

    per ora ho risolto creando una tabella di coda di job stampa. Uno sript schedulizzato sul server ogni minuto controlla se ci sono etichette da stampare (o se c'è n'è già in stampa). Se ci sono e non sta stampando nient'altro allora stampa, altrimenti esce e ci si ripensa un minuto dopo.

    il caso in cui l'utente deve attendere un minuto non crea problemi perchè la stampante ftp è a quasi mezzo magazzino di distanza....

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    70
    Anch'io avevo cercato in merito al multithreading in php, avevo trovato questa classe però non ho più avuto tempo di approfondire :

    http://www.phpclasses.org/package/39...-requests.html

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    Si la teoria è quella.

    Codice PHP:

            $request 
    "GET ".$_SERVER["PHP_SELF"].$queryString."  HTTP/1.1\r\n";
            
    $request .= 'Host: '.$_SERVER['HTTP_HOST']."\r\n";
            
    $request .= "\r\n";

            
    $socket fsockopen('tcp://'.$_SERVER['HTTP_HOST'],$_SERVER['SERVER_PORT'] );
            if (!
    $socket) {
                
    $this->writeLogLn("Open socket error ".'tcp://'.$_SERVER['HTTP_HOST'].':'.$_SERVER['SERVER_PORT'],ZELog::ERR);        
                exit;
            }
            
        
            
    fwrite($socket$request);
              
    fclose($socket); 
    Questo è un pezzo di una classe che faceva partire un altro script php senza aspettare
    che finisse.

    Come vedi apri la socket scrivi la request e chiudi la socket.
    A questo punto i due script vanno ognuno per conto proprio e il primo può terminare anche prima del secondo.

    Un alternativa è usate exec ma la maggiort parte degli hosting ha questa funzione disabilitata.

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    82
    l'hosting è nostro, è letteralmente della nostra azienda quindi possiamo fare quello che vogliamo.

    i capi hanno approvato la versione con script schedulato perchè a loro detta il socketing potrebbe essere imprevedibile...

    cosa ne pensate?

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    Se l'hosting è vostro avete pochi problemi.

    Io farei uno script con un ciclo infinito interrotto se viene lanciata un altra istanza.

    Ad esempio puoi fa in modo che quando venga lanciato lo script scriva in un file di testo il suo micro time e ogni ciclo controlli se il file di testo è cambiato.
    Nel qual caso termina perchè è stata lanciata un altra istanza dello script.

    Oltre a questo scheduli lo script perchè venga lanciato ogni 15 minuti per esempio.

    In questo modo se hai qualche problema male che vada hai 15 minuti di buco e hai sempre una sola istanza dello script che gestisca le code.

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    82
    più sempliemente, nella coda di stampa il job in stampa viene marcato 'in stampa'. Se al successivo avvio ne incontra uno ancora in stampa (alcuni job impiegano anche mezz'ora) allora esce... tutto qua..

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.