Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Leggere variabili di sessione da loop infinito

    Salve a tutti,

    una pagina php genera un pulsante html che, al suo click, cambia lo stato di una variabile di sessione booleana. Quando quest'ultima è 1, lancio tramite exec uno script php in background che contiene un ciclo while. Questo ciclo while è attivo finchè la variabile di sessione resta 1.
    In pratica abbiamo uno script che si conclude generando una pagina html ed uno script attivo in background che devo poter controllare dal suddetto pulsante.

    Questo almeno in teoria!

    In realtà non riesco a far condividere la variabile di sessione dopo che il ciclo si avvia, diventando un loop infinito.

    Facendo diversi test, osservo che la variabile di sessione passa correttamente dal primo file php (quello del pulsante) al secondo ma, quando comincia il loop, la stessa variabile, che cmq viene ri-settata dal pulsante (l'ho testato), in qualche modo non "passa" all'interno del loop, quasi come se internamente al ciclo while suddetta variabile fosse diventata in realtà un variabile locale... proprio non capisco!

    Vi dico anche che di base utilizzo l'ultima versione di Joomla (avviando opportunamente la sua sessione) e il mio dubbio è se sbaglio qualcosa con php o se trascuro qualche aspetto di Joomla.

    ...ovviamente su questo forum mi aspetto dei commenti "lato" php.

    Vi ringrazio anticipatamente!

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Non è che la variabile di sessione viene valorizzata all'avviamento dello script ? Sarebbe logico.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Ho fatto una prova. Non so cosa vuoi fare di preciso quindi è solo a scopo illustrativo.

    Clicca sul bottone Start (apre una pagina php) che cicla su se stessa finché non clicchi su Stop.

    A quanto pare lo sleep(1) è importante (o ogni codice che impedisce l'invio immediato dello header).


    test389a.php
    Codice PHP:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <?php
    session_start
    ();
    if (isset(
    $_POST['submit'])) {
      if (
    $_POST['submit'] == 'Stop') {
       
    $_SESSION['pippo'] = '1';
     } else {
      
    $_SESSION['pippo'] = '0';
     }
    } else {
     
    $_SESSION['pippo'] = '0';

    ?>
    <html>
    <head>
    <title>Untitled</title>
    </head>
    <body>
    Stato della session :
    <?php
    print $_SESSION['pippo'];
    ?>
    <form action="test389b2.php" method="post" target="_blank">
     Apre una nuova pagina :<input type="submit" name="submit" value="Start" />
    </form>
    <form action="test389a.php" method="post">
     Ferma lo script della pagina aperta : <input type="submit" name="submit" value="Stop" />
     <br/>
     Risetta lo stato della session a 0 :<input type="submit" name="submit" value="Reset" /> 
    </form>
    </body>
    </html>
    test389b2.php
    Codice PHP:
    <?php
     error_reporting
    (E_ALL);
     
    session_start();
     
    $loop true;
     if (isset(
    $_SESSION['pippo'])) {
      if (
    $_SESSION['pippo'] == '1') {
      
    $loop false;
     } 
     } 
     if (
    $loop) {
       
    sleep(1);
       
    header('Location: test389b2.php');
       exit;
     }
    print 
    "Finito";
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  4. #4
    Grazie per la dritta: mi ha permesso di fare un altro test che non avevo ancora fatto: ovvero quello di ricreare le stesse condizioni del problema, ma al di fuori di Joomla.
    Il codice che mi hai passato è concettualmente identico a ciò che avevo scritto, solo che il loop non avveniva tramite richiamo dell'header, ma era costituito da un ciclo while.
    Anch'io avevo impostato uno sleep.
    Speravo che il problema si risolvesse usando il tuo approccio al loop (con il richiamo dell'header) ma ciò non avviene: la variabile di sessione, all'interno dello script che cicla, mi resta congelata a 1 e il loop è infinito.

    Forse devo pensare che il problema deriva dal Joomla. C'è qualcosa che non so a riguardo forse..

  5. #5
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Posta il codice se non è troppo lungo.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  6. #6
    Per semplicità ho modificato il tuo script, sostituendo session_start() con il codice opportuno richiesto da Joomla per avviare la sessione, ma niente da fare: lo script si avvia, comincia a ciclare, ma non si interrompe...

    filea.php

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <?php
    //session_start();
    // Starting session
    define( '_JEXEC', 1 );
    define( 'JPATH_BASE', '../' );
    define( 'DS', DIRECTORY_SEPARATOR );
    require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
    require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
    $mainframe = JFactory::getApplication('site');
    $mainframe -> initialise();


    if (isset($_POST['submit'])) {
    if ($_POST['submit'] == 'Stop') {
    $_SESSION['pippo'] = '1';
    } else {
    $_SESSION['pippo'] = '0';
    }
    } else {
    $_SESSION['pippo'] = '0';
    }
    ?>
    <html>
    <head>
    <title>Untitled</title>
    </head>
    <body>
    Stato della session :
    <?php
    print $_SESSION['pippo'];
    ?>
    <form action="fileb.php" method="post" target="_blank">
    Apre una nuova pagina :<input type="submit" name="submit" value="Start" />
    </form>
    <form action="filea.php" method="post">
    Ferma lo script della pagina aperta : <input type="submit" name="submit" value="Stop" />
    <br/>
    Risetta lo stato della session a 0 :<input type="submit" name="submit" value="Reset" />
    </form>
    </body>
    </html>




    fileb.php

    <?php
    error_reporting(E_ALL);
    // session_start();
    // Starting session
    define( '_JEXEC', 1 );
    define( 'JPATH_BASE', '../' );
    define( 'DS', DIRECTORY_SEPARATOR );
    require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
    require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
    $mainframe = JFactory::getApplication('site');
    $mainframe -> initialise();


    $loop = true;
    if (isset($_SESSION['pippo'])) {
    if ($_SESSION['pippo'] == '1') {
    $loop = false;
    }
    }
    if ($loop) {
    sleep(1);
    header('Location: fileb.php');
    exit;
    }
    print "Finito";
    ?>
    Ultima modifica di utentedisperato; 29-11-2014 a 00:37

  7. #7
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Ok daro' un'occhiata. Mi confermi che il mio script funziona se usato fuori da joomla ?
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  8. #8
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Guarda là http://docs.joomla.org/How_to_access...xternal_script

    secondo me ci sono le risposte che aspetti.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  9. #9
    mmm...ci sono già passato... e rispettavo già le regole.

    Per scrupolo ho rimodificato i tuoi file, settando meglio la variabile pippo come indicato dal tuo link:

    filea.php

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <?php
    //session_start();
    // Starting session
    define( '_JEXEC', 1 );
    define( 'JPATH_BASE', '../' );
    define( 'DS', DIRECTORY_SEPARATOR );
    require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
    require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );


    $mainframe = JFactory::getApplication('site');
    $mainframe -> initialise();
    $session =& JFactory::getSession();
    if (isset($_POST['submit'])) {
    if ($_POST['submit'] == 'Stop') {
    $session -> set('pippo', 1);
    } else {
    $session -> set('pippo', 0);
    }
    } else {
    $session -> set('pippo', 0);
    }
    ?>
    <html>
    <head>
    <title>Untitled</title>
    </head>
    <body>
    Stato della session :
    <?php
    $pippo = $session -> get('pippo');
    print $pippo;
    ?>


    fileb.php

    <?php
    error_reporting(E_ALL);
    // session_start();
    // Starting session
    define( '_JEXEC', 1 );
    define( 'JPATH_BASE', '../' );
    define( 'DS', DIRECTORY_SEPARATOR );
    require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
    require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );


    $mainframe = JFactory::getApplication('site');
    $mainframe -> initialise();
    $session =& JFactory::getSession();
    $pippo = $session -> get('pippo');
    $loop = true;
    if (isset($pippo)) {
    if ($pippo == '1') {
    $loop = false;
    }
    }
    if ($loop) {
    sleep(1);
    header('Location: fileb.php');
    exit;
    }
    print "Finito";
    ?>

    ...ma non funziona! Comunque i tuoi script originali funzionavano benissimo.

    Ho un sospetto che il problema derivi da Joomla. E' come se le variabili di sessione possano essere scambiate all'inizio e alla fine dell'esecuzione dello script...boh!!!

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.