Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    52

    eseguire php da un altro php in modo asincrono

    Voglio eseguire un php da un altro script php, passandogli dei parametri GET.
    Il secondo php ha un ciclo while che può durare anche 30 secondi e vorrei che non mi bloccasse lo script php di partenza, non mi interessa la risposta del secondo script php dato che setta variabili globali.

    Ho provato con :

    include 'contentLoop.php' ;

    ma mi blocca il primo script per la durata del ciclo while,
    E poi non va con i parametri ?loop=on

    Ho provato fopen, fsockopen, ma non esegue il file php, apre solo il file per la lettura.
    fopen("contentLoop.php", 'r');
    anche qui senza i parametri GET ?loop=on...

    Come si potrebbe fare?

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    183
    30 secondi??? Cosa diavolo fa questo while???

    Al di là di questo:
    Se includi la seconda pagina è come se scrivessi il suo intero codice al posto della riga dove c'è l'include()... A cosa ti serve passarglieli in GET?
    Se invece vuoi proprio che la seconda pagina sia separata dalla prima non puoi (sempre che non puoi crearti una function) fare un redirect a questa passandogli i parametri in GET e poi da questa tornare alla prima tramite un altro redirect? (e se ti serve per più pagine gli passi anche l'url della prima pagina di provenienza?)

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    52
    Allora, mettiamo che il primo php sia content.php e il secondo sia contentLoop.php.

    Il content.php viene chiamato molto spesso circa ogni 5 secondi.
    Voglio che il contentLoop.php venga chiamato ogni volta dal content.php e che inizi un ciclo while che durerebbe anche fino a 30sec se non viene interrotto.
    Alla successiva chiamata di content.php (dopo 5 sec), prima di chiamare nuovamente il contentLoop, setto una variabile di sessione che dovrebbe fare uscire contentLoop dal ciclo while.
    Dopo viene nuovamente eseguito contentLoop e riparte il ciclo.

    Per fare questo ho quindi bisogno che contentLoop sia eseguito in modo totalmente separato da content (come se fosse stato chiamato da un browser) in modo da non bloccarlo mentre c'è il ciclo while.

    In effetti non è strettamente necessario passare argomenti in GET, dato che posso interagire fra i due script con variabili di sessione, ma dato che chiedevo come effettuare la chiamata, volevo sapere come fare anche il GET.

    Con il redirect inizierei l'altro php col ciclo, però se faccio ancora redirect, il primo php non continua da dove ero rimasto, ma dall'inizio. Perdipiù di volta in volta ci sono parecchi parametri passati al content.php che mi toccherebbe passare al contentLoop perché me li ripassi al content...
    Oppure potrei cercare di spostare la chiamata alla fine del content.php, quando ha già finito tutto.

    Insomma forse potrebbe essere l'ultima spiaggia, ma se c'è qualche altra possibilità forse è meglio...
    Purtroppo sono in safe mode con un hosting Windows su Aruba, perciò non posso usare exec e simili, altrimenti avrei risolto...

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    183
    io farei così:

    content.php:
    if(!isset($_GET(variabili output di contentloop)))
    eseguo la prima parte del codice e faccio il redirect a loopcontent passandogli in get gli input
    else
    prendo in input le variabili di output di contentloop ripassatemi in get
    continuo con la seconda parte del codice.

  5. #5
    Se puoi usare touch ed unlink io userei un file di lock, e per rimuoverlo dopo tot secondi puoi usare filemtime tanto per esempio, non è esattamente quello che hai chiesto tu ma mi sembra un metodo più semplice
    Can You See Curtains? Then Isn't Windows!

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    52
    Però se faccio in contentLoop:

    while ($loop == 1){
    header("content.php?qualcosa");

    if (....) ....

    }

    mi ritorna su content.php per terminarlo, ma il while del contentLoop continua ad essere attivo lo stesso o dopo il redirect a content, il contentLoop si è chiuso anche se aveva iniziato il while e quindi non mi fa l'If successivo?



    Per il file di lock, penso che lo posso usare, però a me serve uno script separato dal principale content.php che faccia un suo ciclo in background e che venga terminato sempre da content, in modo che se content non viene più chiamato, il ciclo contentLoop non si ferma e , dopo un 30sec, arriva a un if che gli fa eseguire un codice particolare avvisando che content non è stato più chiamato.
    Se avete un'altra idea per controllare lato server se content non viene più chiamato dopo una 30 sec...
    Con touch e unlink non credo che posso ottenere questo.
    Grazie comunque delle idee, spero che risolviamo.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    356
    dai un'occhiata qui --> http://www.ilcaimano.it/ict/php-asincrono/

    mi pare di capire che è quello che interessa a te...
    Jekkil

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    183
    no se fai un header ecc. la pagina si interrompe.
    Se questo if non ha bisogno di ulteriori input puoi fare il redirect dopo che anche questo è stato eseguito, e passare a content anche i suoi output, altrimenti hai due strade:
    metti l'if in un'altra pagina (che so, contentLoop2.php) oppure passi a contentLoop gli input dell'if con un'altro redirect e rifai i controlli che hai fatto su content, ovvero metti if(!isset(input dell'if)) fai il primo ciclo else fai l'if e poi rifai un ulteriore redirect a content con i valori ricavati dall'if.
    In questo caso devi aggiungere a content ulteriori controlli !isset e isset per eseguire la terza parte di codice (quella che a questo punto utilizza gli output dell'if di contentLoop).

    Oppure (sempre se l'if ha bisogno di ulteriori input) quando passi quelli del primo ciclo passi anche tutti i dati necessari all'if e (se necessario) metti il pezzo di codice che li genera (interpolandoli con i dati usciti dal primo ciclo?) tra questo e l'if.

    Questa soluzione però la scarterei, contentLoop mi sembra già abbastanza pesantina di suo...

    Un po' di pseudocodice sarebbe utile per capire meglio che approcio utilizzare.

    Se può esserti utile potresti utilizzare delle classi e crearti delle funzioni, che ti richiami da content, però dipende tantissimo da cosa devi fare, soprattutto se la tua applicazione è procedurale o per oggetti.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    52
    Allora, ho spostato la chiamata a contentLoop alla fine di content, per cui non ho più bisogno di passare niente in GET. Al massimo posso passare un ?exit=1 da contentLoop quando ritorno a content in modo da farlo chiudere subito.
    Però se quando ritorno a content all'interno del while mi interrompe il contentLoop è inutile...

    L'if mi serve per confrontare il time di inizio del contentLoop e vedere se è oltre i 30sec. vuol dire che content non è stato più chiamato.

    es.
    content.php:
    Codice PHP:
    <?php  
    if ($_REQUEST['exit'] == 1) exit; 
     .... 

    //come ultima operazione (non ho bisogno di eseguire altro codice al ritorno): 
    if $_REQUEST("autoit") { 
       ... 
       
    $_SESSION["loop"] = 0// blocco il ciclo del contentLoop della vecchia chiamata e finisco l'esecuzione di contentLoop.php 
       
    Sleep(1); 
       
    $_SESSION["loop"] = 1// setto a 1 per un nuovo ciclo   
       
    header("contentLoop.php");   //rieseguo contentLoop e riinizio il ciclo, ma il content dovrebbe terminare l'esecuzione e liberare l'output, invece... } 
    ?>

    es. contentLoop.php:

    Codice PHP:
    <?php
    $_SESSION
    ["timeOld"] =  getdate(); // memorizzo quando è stato lanciato contentLoop

    while ($_SESSION["loop"]  == 1){
       
    header("content.php?exit=1"); // ritorno a content.php ed esco subito, mentre contentLoop dovrebbe continuare, invece così me lo chiude...

       
    $_SESSION["time"] =  getdate(); // prendo il time attuale e controllo quanto tempo è passato dall'inizio della chiamata a contentLoop:

       
    if ($_SESSION["time"]['seconds'] - $_SESSION["timeOld"]["seconds"] > 30 ) {
       
    // se siamo arrivati qui vuol dire che content.php non è stato chiamato per 30sec e quindi non ha chiuso il ciclo contentLoop da 30 secondi, quindi eseguo l'operazione prevista.
       
    }
       
    sleep(1); // per non appesantire il while (serve?)
    }
    ?>
    Chiaramente il redirect non funziona in questo caso...

    Praticamente contentLoop dovrebbe contare da quanti secondi è avvenuta l'ultima chiamata a content.php ed eseguire un codice se supera i 30sec. E non bloccare content.php che deve chiudersi e liberare il client che lo chiama ogni 5sec.


    Curl asincrono non l'ho mai usato, dici che potrebbe risolvere?


    Un alternativa sarebbe il crontab, ma sono su hosting Windows, non so in che modo si può fare (e se me lo lasciano fare...), ma se si potesse, farei eseguire ogni 30sec un php che mi controlla una var di sessione in cui ho messo il time dell'ultima chiamata a content. Così sarebbe molto più semplice, ma...

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    356
    Originariamente inviato da Jekkil
    dai un'occhiata qui --> http://www.ilcaimano.it/ict/php-asincrono/

    mi pare di capire che è quello che interessa a te...
    perdonami, ma hai dato un'occhiata a questo post? parla proprio dell'esecuzione di uno script in maniera asincrona, senza interessarsi dell'output...
    Jekkil

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.