GoJack - SMS gratis
Off-Topic => In piazza => Topic aperto da: rccrcc - Febbraio 12, 2013, 04:02:07 pm
-
Sto sviluppando un progetto usando il php e mi sono bloccato, vediamo se qualcuno mi sa indirizzare sulla strada migliore da intraprendere.
Mi vengono inviati dei dati mediante socket TCP, temperatura, pressione ed altri parametri. Questi mi vengono spediti non a intervalli regolari, ma soltanto quando variano. Io vorrei salvare i dati in un db e visualizzarli in tempo reale.
Nessun problema per ricevere i dati e salvarli, il problema sta nel fatto che siccome il flusso dati è continuo, la pagina php continua ad elaborare e non mi visualizza i dati raccolti nel momento in cui arrivano. Come posso fare?
<?php
$ip ="127.0.0.1";
$porta = "9999";
$comando = "TEMPERATURA\n"; //comando per avviare l'invio dati
$fp = fsockopen($ip, $porta, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
fwrite($fp, $comando);
while (!feof($fp)) {
set_time_limit(0); //evita il timeout del server
$dati= fgets($fp, 128);
echo $dati."<br/>"; //stampo dati
salva_dati(); //funzione con cui i dati vengono salvati
}
fclose($fp);
}
?>
;D
-
Non basterebbe fare due php, uno per salvare i dati nel db, e l'altro che li visualizza prendendoli dal db? ovviamente dovresti poi scrivere una funzione per il php principale, per fargli capire quando ci sono state delle modifiche al db, ancora da visualizzare. Per tale scopo si può usare il javascript, facendo fare una richiesta ogni 10 secondi ai file salvati contenenti il db, per vedere se ci sono cambiamenti. Nel caso ci siano, visualizza i nuovi dati. I software in php non possono restituire dati durante la loro esecuzione, ma solo quando si sono chiusi e hanno completato l'elaborazione (almeno credo). Penso che per te serva il javascript unito al php.
-
Grazie del consiglio.
Speravo in una soluzione più "elegante" limitando gli accessi al db. Nella descrizione del problema ho semplificato al minimo il progetto, ma il flusso dati è piuttosto intenso, quindi diventerebbe problematico. Mi sa che dovrò indirizzarmi verso Java ???
-
set_time_limit(0);
credo che il web server capisca senza limiti di tempo se il max_execution_time non è presente o configurato per non avere limiti di tempo.Inoltre sia apache che IIS hanno un tempo di esecuzione a 300 secondi http://www.php.net/manual/it/info.configuration.php#ini.max-execution-time (http://www.php.net/manual/it/info.configuration.php#ini.max-execution-time)
Prova impostando ad 1 secondo con cronjob e/o un programma cgi, visto che il web server è il tuo, e gira in locale.
ps. parlo da profano.
-
alla fine che uno lo implementi in java alla fine la logica e la stessa di daniele visto che quello che bisogna fare e aggiornare la gui dopo aver aggiornato il db
-
Magari usa print() con quello avrai la visualizzazione anche con php in moto(se ricordo bene), oppure dopo print() metti flush().
-
al massimo forse funziona usando questo http://php.net/manual/en/class.thread.php
-
al massimo forse funziona usando questo http://php.net/manual/en/class.thread.php
se fa come ho suggerito ,con flush(), funziona di sicuro ;)
-
Io non ho mai visto un php che invia dati durante la sua esecuzione. Puoi scrivere 2 righe brevi e funzionanti di esempio? ???
<?php
ob_start();
for ($i =0; $i <=10; $i++) {
print('ciao');
flush();
sleep(5);
}
?>
cosi non funziona..fa vedere tutto alla fine.
-
usa var_dump($dati); se ti da zero non viene passato nulla.
Che sistema operativo hai? hai firewall? la porta di ascolto è abilitata dal tuo modem/router?
scusami per queste domande sceme.
http://support.microsoft.com/kb/308127/it
magari se ne viene a capo :(
ps. daniele usi chrome o safari? primo risultato http://www.google.it/search?hl=it&q=esempi%20ob_flush%20di%20php&btnG=Cerca forse questo te li fa vedere in tempo di esecuzione.
Mi assento dalla discussione :) , non vi riesco a capire più :(
-
Grazie ragazzi, problema risolto. Ignoravo l'esistenza di queste istruzioni, molto utili in un sacco di applicazioni.
Posto il risultato finale semplificato, può sempre tornare utile a qualcuno. Ho aggiunto un semplice javascript in cui mi visualizza soltanto l'ultimo valore, quindi mi da il valore in tempo reale ;)
A BUON RENDERE!!! ;D
<html>
<head>
<title>Temperatura</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link rel="SHORTCUT ICON" href="icona.ico">
<script type="text/javascript">
function dati_up(temp) {
document.getElementById("lblTemp").innerHTML = temp +" °C";
}
</script>
</head>
<body>
<span style="font-family:Tahoma; size: 10px; color:#000066"> TEMPERATURA:
<label id="lblTemp">0 °C</label></span>
<?php
$ip ="127.0.0.1";
$porta = "9999";
$comando = "TEMPERATURA\n";
$fp = fsockopen($ip, $porta, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
fwrite($fp, $comando);
while (!feof($fp)) {
set_time_limit(0); //evita il timeout
$dati= fgets($fp, 128);
echo "<script type='text/javascript'>dati_up($dati);</script>";
ob_flush();
flush();
}
fclose($fp);
}
?>
-
prego.
modifica script tyle in type.
ps. in basso.
-
Type.
-
flush() funziona quindi :)
-
Boh, io l'ho provato in tutti i modi e ti assicuro che non funziona. Ho anche copiato e incollato i codici delle guide che hai incollato, ma non ne funziona nessuno, almeno su windows e sugli altri che ho provato. I dati sono visualizzati tutti insieme alla chiusura del php, come sempre.
Several servers, especially on Win32, will still buffer the output from your script until it terminates before transmitting the results to the browser.
da http://php.net/manual/en/function.flush.php
e infatti dice "especially" e non "only" perchè infatti io l'ho provato anche su servers non windows, e da sempre lo stesso risultato. Ho anche provato questo codice:
<?php
function echo_flush($txt){
//inizializzazione del buffer per l'output
if (ob_get_level() == 0) ob_start();
echo $txt;
//per Chrome e Safari si deve aggiungere questa istruzione
print str_pad('',4096)."\n";
//invia il contenuto al buffer
ob_flush();
flush();
}
for ($i =0; $i <=10; $i++) {
echo_flush('ciao');
sleep(5);
}
?>
ma niente.
-
Bè ti resta da provare da 127.0.0.1 su un non windows 32.
Può darsi che in locale funzioni, mentre in remoto no.
-
Daniele nemmeno a me funziona il codice che hai postato ???
Prova questo, testato con Chrome, Firefox ed Explorer (Windows 7/WampServer con Apache 2.2.22 e PHP 5.3.13)
<?php
echo str_pad('',1024);
for ($i=10; $i>0; $i--) {
echo "$i<br>\n";
ob_flush();
flush();
sleep(2);
}
?>
-
Hai ragione. E perchè il mio codice non funzionava? ???
-
C'ho messo venti minuti ma ci sono arrivato: in fondo alla echo vuole il <br/> . Non chiedermi il perchè, non ne ho proprio idea!
<?php
function echo_flush($txt){
//inizializzazione del buffer per l'output
if (ob_get_level() == 0) ob_start();
echo $txt."<br/>";
//per Chrome e Safari si deve aggiungere questa istruzione
print str_pad('',4096)."\n";
//invia il contenuto al buffer
ob_flush();
flush();
}
for ($i =0; $i <=10; $i++) {
echo_flush('ciao');
sleep(5);
}
?>
-
vero non ci avevo pensato.
Se con php, si richiede l'output dal browser,di un file con mime type text/html, nella stampa a video di più variabili, senza <br> non le mostrerà tutte.
ps. in qualche mio script ricordo qualcosa del genere..Voi confermate?
-
vero non ci avevo pensato.
Se con php, si richiede l'output dal browser,di un file con mime type text/html, nella stampa a video di più variabili, senza <br> non le mostrerà tutte.
ps. in qualche mio script ricordo qualcosa del genere..Voi confermate?
ma se togliete il "sleep(5)" scommetto che non funziona vero??