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

blablabla

Nuovo Utente
5 Apr 2017
5
0
1
23
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:

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
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
 

blablabla

Nuovo Utente
5 Apr 2017
5
0
1
23
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?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
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();
?>
 

blablabla

Nuovo Utente
5 Apr 2017
5
0
1
23
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?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
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();
?>
 

blablabla

Nuovo Utente
5 Apr 2017
5
0
1
23
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.
 

marino51

Utente Attivo
28 Feb 2013
3.001
173
63
Lombardia
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
Autore Titolo Forum Risposte Data
L Problemi form Pagina php HTML e CSS 2
L php mysql cerca e visualizza pagina PHP 0
A Aiuto per pagina php PHP 0
G creazione menu a tendina e invio a pagina php PHP 1
F pagina dinamica PHP PHP 3
elpirata Update dinamico informazioni scritte in una pagina php jQuery 11
J creare pagina php di prenotazione PHP 5
C Form email php su pagina index.html? PHP 21
M Chiamare pagina php da javascript Javascript 8
V pagina php PHP 0
F Passare una variabile php dal DB mysql alla pagina PHP 3
J [PHP] Visualizzare risultato query stessa pagina PHP 3
F [PHP] [HTML] Tabella cambia pagina responsive PHP 8
C Refresh parte di codice pagina php PHP 6
F [PHP] Pagina conta verghe per carpenteria PHP 15
Michelebozzo [PHP] Rimuovere pubblicazione nome pagina ... aiuto! PHP 7
R [PHP] pagina inclusa che non viene visualizzata PHP 2
felino [PHP] Monitorare una pagina web ciclicamente PHP 2
S [PHP] aggiornamento table tramite select senza ricaricare la pagina PHP 5
T con oop creare un ciclo per una pagina dinamica html con php PHP 3
R [PHP] creare pagina profilo per ogni utente PHP 4
M Inviare variabili da menu a tendina a pagina php con post PHP 6
D [PHP] [HTML] Pagina con permessi amministratore PHP 6
M [PHP] Parametro valido su pagina avanti e indietro PHP 0
L [PHP] Visualizzare se una pagina è pingata PHP 1
E Caricare dati da DB MySql all'apertura pagina, meglio PHP o Javascript? PHP 1
P PHP - Leggere una pagina passata con Form e Captcha PHP 0
W [PHP] Come posso testare la pagina direttamente su smartphone PHP 2
M Errore pagina php 'Cannot detect primary key' PHP 8
C [PHP] Pagina html che legge file txt PHP 41
webmachine Pagina PHP sempre in ascolto PHP 1
Cosina [PHP] Chiudere sessione quando la pagina viene riaggiornata PHP 4
R [PHP] [Javascript] Link a DIV id di un' altra pagina PHP 4
A [PHP] errore 404 e invio mai path pagina con link interrotto PHP 2
M [PHP] Come display data nella stessa pagina PHP 4
A [PHP] Inserimento url dinamici in pagina html PHP 3
Y [PHP] [HTML] Pagina referenti PHP 5
Tommy03 Perchè non si apre una pagina PHP PHP 4
M [Javascript] [PHP] aggiornare pagina ogni ora Javascript 2
F Pagina php che gestisca le immagini di un DB PHP 5
B [PHP] passare valore ad un form su un'altra pagina PHP 4
andreas88 [PHP] [HTML] Pagina preventivi form contatti PHP 5
U [PHP] Form stessa pagina con qualche complicazione PHP 0
M Creare tabella da pagina php popolata con valori passati con POST PHP 5
usura18 [PHP] Perdita contenuto cookie al reload della pagina PHP 6
M [PHP] Info pagina web PHP 6
K [PHP] Passaggio Variabili Senza Refresh Di Pagina PHP 1
N Doppio Form in pagina php PHP 6
T [PHP] tornare alla pagina con gli input già compilati PHP 2
T [PHP] impedire un doppio INSERT INTO dopo reload della pagina PHP 3

Discussioni simili