Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Processo indipendente

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    9

    Processo indipendente

    Salve a tutti, ho cercato nelle varie guide articoli e altri topic una soluzione per il mio problema.

    E' un po complicato da spiegare ma cercherò di rendere chiaro il mio obbiettivo che non so come raggiungere:

    Allora ho un sito che si appoggia su un db mysql con vari utenti registrati. Il sito ha una certa funzione che è "offerta" agli utenti registrati e praticamente per funzionare si appoggia su altri siti (apre dei socket su altri siti per prelevarne il contenuto e mostrarlo). Siccome gli utenti possono essere tanti e le richieste contemporanee molte volevo creare una specie di coda, ossia l'utente fa la sua richiesta e intanto gli viene detto "la tua ricerca verrà processata entro qualche minuto", praticamente mi creo una coda in una tabella sql delle operazioni da fare, e fin qui tutto bene. Il punto è che una volta che il primo utente fa la sua richiesta dovrei far partire una funzione php che va ad occuparsi di "smaltire" le operazioni in coda (ovviamente le farei un po temporizzate per evitare di ammassare tutto il lavoro in una volta che rallenterebbero enormemente l'host). Questa funzione però sebbene io possa scriverla non so come invocarla perchè teoricamente quando l'utente fa la richiesta dovrebbe: "controllare la coda, se non ci sono elementi processo la richiesta dell'utente" il punto è come? cioè all'utente viene comunque risposto che dovrà controllare la pagina tra qualche minuto ma nel frattempo bisognerebbe lanciare lo script php che però deve girare in maniera del tutto indipendente dall'utente, che deve ricevere solo la sua pagina html e stop.

    Come posso fare per far eseguire questo script in maniera indipendente? Spero di essere chiaro, il mio problema è che non so come richiamare la funzione che si occupi delle operazioni da eseguire senza ostacolare la ricezione della pagina html attuale all'utente. In un altro linguaggio io penserei ai thread/fork ma non so se è il caso del php. Spero che qualcuno possa darmi delle delucidazioni.

  2. #2
    Crea uno script che viene eseguito con regolarità tramite cron (es. una volta al minuto).

    Lo script si deve occupare di verificare che non vi sia un'altro "demone" in esecuzione (es. controllando l'esistenza di un file oppure di un record nel DB).
    Se un'altro demone è in esecuzione, lo script termina.
    Altrimenti inizia ad elaborare la coda e non termina fin tanto che non ha finito.

    In questo modo eviti di introdurre degli overhead (es. causati da richieste tramite il web server) e disaccoppi lo "spider" dal web server (riducendo il rischio di crash, sovraccarichi etc.).

    Eventualmente puoi creare un sistema a "demoni" paralleli (es. fino a 4) che si occupano di smaltire varie code in modo più veloce.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    9
    Ma devo quindi obbligatoriamente passare da cron?

    A me risulterebbe molto comodo una cosa del genere:
    Utente chiede la pagina "esegui.php?var=.."

    Caso ci sono elementi in coda "aggiungo l'elemento in coda tanto ci sarà già una funzione che la sta processando"

    Caso non ci sono elementi in coda "aggiungo l'elemento in coda e invoco "processacoda.php" mentre restituisco all'utente una pagina"

    Il punto è che ovviamente questo processacoda "bloccherebbe" l'acquisizione della pagina all'utente a me servisse solo che venisse lanciato e poi provvederebbe da solo a funzionare visto che non interagisce con la pagina html. Devo passare obbligatoriamente da cron? Io non avrei necessità di controllare periodicamente la coda, mi basterebbe una cosa di questo tipo.

  4. #4
    ciao
    la soluzione ottimale è eseguire uno script con cron come tu ha suggerito filippo.toso

    sempre con cron, io però smaltirei la coda diversamente, fai eseguire, ad esempio, lo script ogni minuto....ma lo script non deve occuparsi di smaltire tutta la coda ma un solo step alla volta
    considera che lavori con le socket... quindi 10,20,30 chiamate di seguito nello stesso script te lo sconsiglio...
    fai uno step per volta, finito un processo lo elimini dalla coda (ovvero dalla tabella nel DB) e all'esecuzione successiva lo script elaborerà il processo successivo.

    ps: Utente chiede la pagina "esegui.php?var=.."
    solo a vederla quella url te la sconsiglio, poi magari fai mille controlli....ma così su due piedi è molto pericolosa
    There are 10 types of people in the world: Those who understand binary, and those who don't.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    9
    Nono era solo un esempio in realtà non c'entra niente con quella richiesta.

    Io pensavo di usare un unico processo che smaltisse la coda intervallando le connessioni ogni 5/10 secondi utilizzando sleep() certo che avrei preferito fare a meno di cron, non è proprio possibile senza?

  6. #6
    certo che è possibile senza!
    non esiste quasi mai una sola soluzione ad un problema.... solo che tu dovresti scegliere quella migliore...

    per quanto riguarda lo smaltimento della coda, ripeto, io ti consiglio una, max due chiamate per script con le socket...
    tanto lo script te lo manda in esecuzione il sistema, che ti frega, anzi non sovracarichi il sistema
    tieni presente che lo script per default può restare in esecuzione un tempo limitato (di solito 60 sec.) e non è consigliabile modificare il tempo di vita dello script a meno che non sai esattamente quello che fai e ne sei sicuro...

    poi non so, che coda hai? ti è sufficiente smaltire una max due operazioni al minuto?
    hai provato a vedere quanto tempo ti prende ogni operazione?
    There are 10 types of people in the world: Those who understand binary, and those who don't.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    9
    Diciamo che dipende dalla richiesta dell'utente: diciamo che in media la richiesta del''utente ci mette dai 20/30 secondi (eseguendo una 15ina di richieste di pagine tramite socket), per questo volevo evitare che se si connettono tanti utenti contemporaneamente scoppierebbe tutto. Non sapevo che gli script avessero una durata prestabilita, allora forse è meglio una cron come dici tu.

    A questo punto pongo tre domande:

    1) Anche se non è il metodo migliore quale sarebbe stata l'altra strada? Come avrei dovuto invocare la mia funzione?

    2) Il consiglio finale è quello di creare uno script che esegua un operazione alla volta e farlo rilanciare più volte tramite cron?

    3) Sto cercando di documentarmi su cron, ma non ho capito "dove" devo andare a digitare "minuti ore giorno mese anno php --q nomepagina.php. sulla shell? ma il server non "sono" io.. è su altervista

  8. #8
    Originariamente inviato da Ralf00
    A questo punto pongo tre domande:

    1) Anche se non è il metodo migliore quale sarebbe stata l'altra strada? Come avrei dovuto invocare la mia funzione?

    2) Il consiglio finale è quello di creare uno script che esegua un operazione alla volta e farlo rilanciare più volte tramite cron?

    3) Sto cercando di documentarmi su cron, ma non ho capito "dove" devo andare a digitare "minuti ore giorno mese anno php --q nomepagina.php. sulla shell? ma il server non "sono" io.. è su altervista
    Puoi fare in almeno 2 maniere:

    a) una pagina aperta sul tuo pc che fa il refresh ogni minuto ed ad ogni refresh si occupa di processare una richiesta
    contro: se non hai la pagina aperta non viene processato nulla della coda

    b) sul sito aggiungi alle pagine la funzione che si occupa di processare un elemento della coda.
    Quindi quando un visitatore apre una tua pagina il tuo script viene eseguito. (ovviamente metti un controllo per evitare che vengano processate più di una voce alla volta)
    contro1: se nessuno si connette al tuo sito l'elaborazione della coda non avanza
    contro2: se il processo impiega 40 secondi, per quei 40 secondi il visitatore sarà in attesa( magari puoi ovviare in qualche maniera)

    c) utilizzare un sito esterno che mette a disposizione servizi quali richiamare una certa pagina ad un prestabilito intervallo di tempo.

    In merito al CRON devi cercare un host che ti metta a disposizione tale servizio (o tramite pannello web o tramite shell).
    Da quel che ricordo Altervista non te lo permette quindi non puoi utilizzarlo.
    Di solito chi mette a disposizione spazi web free non ti danno certi tipi di accessi.
    Ed anche chi te li mette a disposizione alla fine non ti permette di impiegare troppe risorse (CPU e RAM) per i tuoi script.

  9. #9
    Scusate se riprendo questa vecchia discussione ma vorrei collegarmi al punto c) dell'ultimo messaggio per domandare: voi conoscete qualcuno di questi siti esterni che richiami una pagina ogni 1-2 minuti? Il mio sito è su Altervista e quindi avete detto che non c'è la possibilità di fare altrimenti. Io ho però due siti che richiedono il lancio di una funzione che si effettua al caricamento della pagina (e che vorrei rendere indipendente dagli utenti connessi per due motivi: innanzitutto perchè così se nessuno è online la funzione parte lo stesso; in secondo luogo perchè se ci sono molti utenti online e l'aggiornamento rallenta non riesco a fare in modo che la funzione parta una volta sola -quindi il lancio viene fatto da più utenti in contemporanea con risultati disastrosi-). Con uno ho risolto mediante un sito di controllo della raggiungibilità della pagina (effettua però controlli ogni mezz'ora minimo). Con l'altro mi servirebbe, come detto, un refresh esterno ogni minuto (massimo 2).

    Grazie in anticipo.
    Io sono la gomma, tu la colla.

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.