GoJack - SMS gratis

Off-Topic => In piazza => Topic aperto da: rccrcc - Febbraio 12, 2013, 04:02:07 pm

Titolo: Consiglio su flusso dati TCP e PHP
Inserito 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?

Codice: [Seleziona]
<?php
$ip 
="127.0.0.1";
$porta "9999";
$comando "TEMPERATURA\n"//comando per avviare l'invio dati
$fp fsockopen($ip$porta$errno$errstr30);
if (!
$fp) {
    echo 
"$errstr ($errno)<br />\n";
} else {
    
fwrite($fp$comando);
    while (!
feof($fp)) {
        
set_time_limit(0); //evita il timeout del server
        
$datifgets($fp128);
        echo 
$dati."<br/>"//stampo dati
        
salva_dati(); //funzione con cui i dati vengono salvati
        
}
    
fclose($fp);
}
?>
;D
Titolo: Re:Consiglio su flusso dati TCP e PHP
Inserito da: Daniele8787 - Febbraio 12, 2013, 04:30:23 pm
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.
Titolo: Re:Consiglio su flusso dati TCP e PHP
Inserito da: rccrcc - Febbraio 12, 2013, 04:50:55 pm
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  ???
Titolo: Re:Consiglio su flusso dati TCP e PHP
Inserito da: antonino.spampinato - Febbraio 12, 2013, 06:51:47 pm
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.
Titolo: Re:Consiglio su flusso dati TCP e PHP
Inserito da: ciopper90 - Febbraio 12, 2013, 07:03:01 pm
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
Titolo: Re:Consiglio su flusso dati TCP e PHP
Inserito da: Giulio - Febbraio 12, 2013, 07:07:07 pm
Magari usa print() con quello avrai la visualizzazione anche con php in moto(se ricordo bene), oppure dopo print() metti flush().
Titolo: Re:Consiglio su flusso dati TCP e PHP
Inserito da: ciopper90 - Febbraio 12, 2013, 07:47:33 pm
al massimo forse funziona usando questo http://php.net/manual/en/class.thread.php
Titolo: Re:Consiglio su flusso dati TCP e PHP
Inserito da: Giulio - Febbraio 12, 2013, 07:54:48 pm
al massimo forse funziona usando questo http://php.net/manual/en/class.thread.php

se fa come ho suggerito ,con flush(), funziona di sicuro ;)
Titolo: Re:Consiglio su flusso dati TCP e PHP
Inserito da: Daniele8787 - Febbraio 12, 2013, 08:41:47 pm
Io non ho mai visto un php che invia dati durante la sua esecuzione. Puoi scrivere 2 righe brevi e funzionanti di esempio?  ???

Codice: [Seleziona]
<?php

ob_start
();

for (
$i =0$i <=10$i++) {
print(
'ciao');
flush();
sleep(5);
}

?>
cosi non funziona..fa vedere tutto alla fine.
Titolo: Re:Consiglio su flusso dati TCP e PHP
Inserito da: antonino.spampinato - Febbraio 12, 2013, 09:09:19 pm
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ù :(
Titolo: Re:Consiglio su flusso dati TCP e PHP
Inserito da: rccrcc - Febbraio 13, 2013, 03:42:43 pm
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

Codice: [Seleziona]
<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">&nbsp;&nbsp;TEMPERATURA:
<label id="lblTemp">0 °C</label></span>

<?php
$ip 
="127.0.0.1";
$porta "9999";
$comando "TEMPERATURA\n";
$fp fsockopen($ip$porta$errno$errstr30);
if (!
$fp) {
    echo 
"$errstr ($errno)<br />\n";
} else {
    
fwrite($fp$comando);
    while (!
feof($fp)) {
        
set_time_limit(0); //evita il timeout
        
$datifgets($fp128);
        echo 
"<script type='text/javascript'>dati_up($dati);</script>"
        
ob_flush(); 
        
flush();
    }
    
fclose($fp);
}
?>

Titolo: Re:Consiglio su flusso dati TCP e PHP
Inserito da: antonino.spampinato - Febbraio 13, 2013, 03:47:50 pm
prego.
modifica script tyle in type.
ps. in basso.
Titolo: Re:Consiglio su flusso dati TCP e PHP
Inserito da: Daniele8787 - Febbraio 13, 2013, 03:49:20 pm
Type.
Titolo: Re:Consiglio su flusso dati TCP e PHP
Inserito da: Giulio - Febbraio 13, 2013, 04:55:42 pm
flush() funziona quindi :)
Titolo: Re:Consiglio su flusso dati TCP e PHP
Inserito da: Daniele8787 - Febbraio 13, 2013, 05:08:37 pm
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.

Citazione
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:

Codice: [Seleziona]
<?php

function echo_flush($txt){
    
//inizializzazione del buffer per l'output
    
if (ob_get_level() == 0ob_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.
Titolo: Re:Consiglio su flusso dati TCP e PHP
Inserito da: antonino.spampinato - Febbraio 13, 2013, 08:02:16 pm
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.
Titolo: Re:Consiglio su flusso dati TCP e PHP
Inserito da: rccrcc - Febbraio 14, 2013, 11:44:46 am
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)
Codice: [Seleziona]
<?php
echo str_pad('',1024);
for (
$i=10$i>0$i--) {
    echo 
"$i<br>\n";
    
ob_flush();
    
flush();
    
sleep(2);
}
?>
Titolo: Re:Consiglio su flusso dati TCP e PHP
Inserito da: Daniele8787 - Febbraio 14, 2013, 05:09:19 pm
Hai ragione. E perchè il mio codice non funzionava?  ???
Titolo: Re:Consiglio su flusso dati TCP e PHP
Inserito da: rccrcc - Febbraio 15, 2013, 11:36:57 am
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!

Codice: [Seleziona]
<?php

function echo_flush($txt){
    
//inizializzazione del buffer per l'output
    
if (ob_get_level() == 0ob_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);
}

?>
Titolo: Re:Consiglio su flusso dati TCP e PHP
Inserito da: antonino.spampinato - Febbraio 15, 2013, 12:27:22 pm
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?
Titolo: Re:Consiglio su flusso dati TCP e PHP
Inserito da: ciopper90 - Febbraio 15, 2013, 02:01:52 pm
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??