[PHP]la pagina php non si carica se aggiungo funzione while

blablabla

Nuovo Utente
5 Apr 2017
5
0
1
26
Cerco di descrivere in breve quello che sto facendo, ho un web server apache montato su un raspberry pi. La pagina index di questo server è una pagina php che oltre al testo html ecc. dovrebbe richiamare uno script python che mi da la misura di un sensore. Questa misura deve essere letta in continuazione e dopo essere confrontata devo poter richiamare una nuova pagina php.

Nel mio caso ho proceduto in questo modo
(index.php)

PHP:
<html>
<body>
"codice html"
<?php
while (true)
{
$calcolo=shell_exec('script.py');
sleep(3);
if($calcolo<30){
echo $calcolo;
header("location: /var/www/html/dx.html");
                           }
}
?>
</body>
</html>

Il problema è che con la funzione while il sito non mi carica mai il codice html di prima, non finisce mai di caricare. Qualcuno può aiutarmi?

P.S. Il richiamo dello script funziona perchè oltre alla misura del sensore ho anche messo l'accensione e lo spegnimento di un led proprio per il testing.
 
Ultima modifica di un moderatore:
ciao
è un po' difficile dirtelo, se non sai tu quale deve essere la condizione, deve essere qualcosa che si modifica e che ad un certo valore cambi
esempio gnocco
il while continua sino a che il valore di $conta rimane minore di 100
PHP:
$conta=0;
while($conta < 100){
    //...
    $conta++;
}
//....
oppure
PHP:
//....
$verifica=TRUE;
while($verifica){
    //....
    if($qualcosa==$qualcosaltro){$verifica=FALSE;}
}
//...
cioè in pratica tu sta facendo un while senza condizione while (true), devi chiederti "cosa è che cambia? cosa diventa false?" e a questo devi rispondere tu
 
ciao
è un po' difficile dirtelo, se non sai tu quale deve essere la condizione, deve essere qualcosa che si modifica e che ad un certo valore cambi
esempio gnocco
il while continua sino a che il valore di $conta rimane minore di 100
PHP:
$conta=0;
while($conta < 100){
    //...
    $conta++;
}
//....
oppure
PHP:
//....
$verifica=TRUE;
while($verifica){
    //....
    if($qualcosa==$qualcosaltro){$verifica=FALSE;}
}
//...
cioè in pratica tu sta facendo un while senza condizione while (true), devi chiederti "cosa è che cambia? cosa diventa false?" e a questo devi rispondere tu
Quello che mi serve l'ho chiesto prima... cerco un modo per richiamare durante l'esecuzione della pagina uno script in continuazione che mi da sempre la misura, se questa misura è minore di 30 deve richiamare un'altra pagina... Potresti aiutarmi?
 
ciao
prova una cosa del genere
PHP:
//....
$calcolo=30;
while ($calcolo>=30){
    $calcolo=shell_exec('script.py');
    sleep(3);
    if($calcolo<30){
        echo $calcolo;
        header("location: /var/www/html/dx.html");
        break;
    }
}
//....
due cose:
  • sei sicuro che il valore diventi minore di 30? se prima di diventare minore di 30 il while ti fa (dico a caso) 100mila cicli rischi che lo script ti vada in timeout
  • poi la funzione header non deve avere output html prima (come session_start) quindi o usi js o metti all'inizio ob_start e alla fine ob_end_flush
PHP:
<?php
ob_start();
?>
<!-- l'html e il php che ti serve-->
<?php
ob_end_flush();
?>
 
ciao
prova una cosa del genere
PHP:
//....
$calcolo=30;
while ($calcolo>=30){
    $calcolo=shell_exec('script.py');
    sleep(3);
    if($calcolo<30){
        echo $calcolo;
        header("location: /var/www/html/dx.html");
        break;
    }
}
//....
due cose:
  • sei sicuro che il valore diventi minore di 30? se prima di diventare minore di 30 il while ti fa (dico a caso) 100mila cicli rischi che lo script ti vada in timeout
  • poi la funzione header non deve avere output html prima (come session_start) quindi o usi js o metti all'inizio ob_start e alla fine ob_end_flush
PHP:
<?php
ob_start();
?>
<!-- l'html e il php che ti serve-->
<?php
ob_end_flush();
?>
Come è normale che sia quel break nella condizione if non ha cambiato nulla... quello che mi servirebbe sarebbe trovare il modo di far prima caricare tutta la pagina poi eseguire il codide php anche se non credo sia possibile. Qualche altro suggerimento?
 
ciao
prova una cosa del genere cioè far durare il while al massimo per un certo periodo di tempo
PHP:
<?php
ob_start();
?>
<!-- l'html che ti serve-->
<?php
//....
$sec_start=(int)date('s');// secondi prima di iniziare
$ciclare=60;//faccio ciclare per un minuto al massimo
while (($sec_elab-$sec_star)< $ciclare){
    $sec_elab=(int)date('s');
    $calcolo=shell_exec('script.py');
    sleep(3);
    if($calcolo<30){
        echo $calcolo;
        header("location: /var/www/html/dx.html");
        break;
    }
}
echo "il ciclo è terminato, calcolo non è mai stato minore di 30";//e se serve un altro rimando
//....
?>
<!-- altro html che eventualmente ti serve-->
<?php
ob_end_flush();
?>
 
ciao
prova una cosa del genere cioè far durare il while al massimo per un certo periodo di tempo
PHP:
<?php
ob_start();
?>
<!-- l'html che ti serve-->
<?php
//....
$sec_start=(int)date('s');// secondi prima di iniziare
$ciclare=60;//faccio ciclare per un minuto al massimo
while (($sec_elab-$sec_star)< $ciclare){
    $sec_elab=(int)date('s');
    $calcolo=shell_exec('script.py');
    sleep(3);
    if($calcolo<30){
        echo $calcolo;
        header("location: /var/www/html/dx.html");
        break;
    }
}
echo "il ciclo è terminato, calcolo non è mai stato minore di 30";//e se serve un altro rimando
//....
?>
<!-- altro html che eventualmente ti serve-->
<?php
ob_end_flush();
?>
Ciao, scusa ma forse non mi sono espresso bene... io sto cercando qualcosa che mi permetta di eseguire lo script py e fare il controllo in ogni momento in cui la pagina web è richiamata NON SOLO PER UN MINUTO. Il ciclo while, il metodo del contatore dei secondi ecc. lo so fare, sono programmatore C+, ma siccome mi sono avvicinato da poco al mondo php pensavo che ci fosse qualche altro metodo per ovviare a questo problema...
RIPETO: mi serve la pagina html caricata e questo codice che controlli sempre il valore della misura e se nel caso la misura sia minore di 30 cambi pagina... Se mi dite che questo con php non si può fare vado oltre e richiamo la nuova pagina direttamente dallo script py che forse è la cosa migliore a quanto ho capito.
 
scusatemi,
ricordiamo sempre che php agisce sul server e solo dopo che ha finito il suo lavoro, la pagina finale html viene inviata al client
quindi la pagina html conterrà il risultato finale di php,
essendoci in php "while (true)" il ciclo non si ferma mai perché la condizione true non viene mai passata a false,
non concludendo mai il suo lavoro, php non invia la pagina

io ti proporrei questo esempio, usando Ajax per recuperare la lettura da php
( non so python ... ma se può essere attivato da Ajax dovrebbe funzionare uguale )

Raspberry.php
PHP:
<!DOCTYPE html>
<html>
<head>
    <title>Raspberry led check</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script type='text/javascript' src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script>
    <script src="http://code.jquery.com/jquery-latest.min.js"></script>
    <script>
        $(document).ready(function()
        {
            var i=0, j;
            TrafficLamp();

            function TrafficLamp()
            {
                $(".blocco").eq(0).css("background-color", "#E4E4E4");
                $(".blocco").eq(1).css("background-color", "#E4E4E4");
                $(".blocco").eq(2).css("background-color", "#E4E4E4");

                setTimeout(function()
                {
                    i++;
                    //console.log(i);
                    if (i<10)
                    {
                        $.ajax
                        ({
                            type: "GET",
                            url: "RaspberryLed.php?parametro="+i,
                            data: "",
                            success: function(response)
                            {
                                console.log(i+' dati ricevuti : '+response);

                                j=response;

                                if (j == 1)
                                {
                                    $(".blocco").eq(0).css("background-color", "green");
                                }
                                if (j == 2)
                                {
                                    $(".blocco").eq(0).css("background-color", "yellow");
                                }
                                if (j == 3)
                                {
                                    $(".blocco").eq(0).css("background-color", "red");
                                }
                            },
                            error: function(errore)
                            {
                                alert('ERRORE : il server non risponde o lo ha fatto in modo anomalo');
                            }
                        });
                        TrafficLamp();
                    }
                    else
                    {
                        $(".blocco").eq(0).css("background-color", "#E4E4E4");
                        alert("DONE !");
                    }
                }, 3000);
            }
        });
    </script>
    <style>
        html body {
        text-align: center;
        background-color: #E4E4E4;
        margin:50px 0;
        }
        .contenitore {
        margin:auto;
        width: 150px;
        overflow: hidden;
        }
        .blocco {
        width:140px;
        height:140px;
        float: left;
        cursor:pointer;
        }
        .red {
        background-color: red;
        }
        .yellow {
        background-color: yellow;
        }
        .green {
        background-color: green;
        }
        .spento {
        background-color: #E4E4E4;
        }
    </style>
</head>
<body>
    <div class='contenitore'>
        <div class='blocco spento'></div>
        <div class='blocco spento'></div>
        <div class='blocco spento'></div>
    </div>
</body>
</html>

RaspberryLed.php
PHP:
<?php
error_reporting(-1);
ini_set('display_errors', FALSE);
ini_set('log_errors', TRUE);

$par = $_GET['parametro'];

error_log("parametro = ".$par, 0);

if ($par > 6) { $par -= 6; }
if ($par > 3) { $par -= 3; }
echo $par;
?>
secondo me questa è la via da percorrere,
ho lasciato qualche debug, e qualche cosa inutile ma è facile capire
 

Discussioni simili