GoJack - SMS gratis

  • Ottobre 05, 2024, 09:03:30 pm
  • Benvenuto, Visitatore
Effettua l'accesso o una nuova registrazione.

Inserisci il nome utente, la password e la durata della sessione.
Ricerca avanzata  

Autore Topic: Consiglio su flusso dati TCP e PHP  (Letto 10810 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

rccrcc

  • Global Moderator
  • User terzo livello
  • *****
  • Karma: +6/-0
  • Offline Offline
  • Post: 146
  • :D
    • Mostra profilo
Consiglio su flusso dati TCP e PHP
« il: 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
« Ultima modifica: Febbraio 12, 2013, 04:03:57 pm da rccrcc »
Connesso
Samsung Galaxy S-Plus GT-I9001 - Android 4.4.4

Daniele8787

  • Sviluppatore GoJack
  • Administrator
  • Senior
  • *****
  • Karma: +95/-0
  • Offline Offline
  • Post: 1878
  • L'unica vera libertà, corrisponde al non aver bisogno di NULLA.
    • Mostra profilo
Re:Consiglio su flusso dati TCP e PHP
« Risposta #1 il: 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.
Connesso

rccrcc

  • Global Moderator
  • User terzo livello
  • *****
  • Karma: +6/-0
  • Offline Offline
  • Post: 146
  • :D
    • Mostra profilo
Re:Consiglio su flusso dati TCP e PHP
« Risposta #2 il: 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  ???
Connesso
Samsung Galaxy S-Plus GT-I9001 - Android 4.4.4

antonino.spampinato

  • User quarto livello
  • ****
  • Karma: +18/-1
  • Offline Offline
  • Post: 468
    • Mostra profilo
Re:Consiglio su flusso dati TCP e PHP
« Risposta #3 il: 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
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.
« Ultima modifica: Febbraio 12, 2013, 07:19:01 pm da antonino.spampinato »
Connesso

ciopper90

  • Sviluppatore GoJack Android
  • Leggenda
  • *****
  • Karma: +39/-0
  • Offline Offline
  • Post: 615
    • Mostra profilo
Re:Consiglio su flusso dati TCP e PHP
« Risposta #4 il: 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
Connesso

Giulio

  • User secondo livello
  • **
  • Karma: +4/-0
  • Offline Offline
  • Post: 67
    • Mostra profilo
Re:Consiglio su flusso dati TCP e PHP
« Risposta #5 il: 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().
« Ultima modifica: Febbraio 12, 2013, 07:17:07 pm da Giulio »
Connesso

Wifi Alice 50-100 metri con UsbKey + Potenziamento

ciopper90

  • Sviluppatore GoJack Android
  • Leggenda
  • *****
  • Karma: +39/-0
  • Offline Offline
  • Post: 615
    • Mostra profilo
Re:Consiglio su flusso dati TCP e PHP
« Risposta #6 il: Febbraio 12, 2013, 07:47:33 pm »

al massimo forse funziona usando questo http://php.net/manual/en/class.thread.php
Connesso

Giulio

  • User secondo livello
  • **
  • Karma: +4/-0
  • Offline Offline
  • Post: 67
    • Mostra profilo
Re:Consiglio su flusso dati TCP e PHP
« Risposta #7 il: 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 ;)
Connesso

Wifi Alice 50-100 metri con UsbKey + Potenziamento

Daniele8787

  • Sviluppatore GoJack
  • Administrator
  • Senior
  • *****
  • Karma: +95/-0
  • Offline Offline
  • Post: 1878
  • L'unica vera libertà, corrisponde al non aver bisogno di NULLA.
    • Mostra profilo
Re:Consiglio su flusso dati TCP e PHP
« Risposta #8 il: 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.
« Ultima modifica: Febbraio 12, 2013, 08:50:42 pm da Daniele8787 »
Connesso

antonino.spampinato

  • User quarto livello
  • ****
  • Karma: +18/-1
  • Offline Offline
  • Post: 468
    • Mostra profilo
Re:Consiglio su flusso dati TCP e PHP
« Risposta #9 il: 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ù :(
« Ultima modifica: Febbraio 12, 2013, 09:48:53 pm da antonino.spampinato »
Connesso

rccrcc

  • Global Moderator
  • User terzo livello
  • *****
  • Karma: +6/-0
  • Offline Offline
  • Post: 146
  • :D
    • Mostra profilo
Re:Consiglio su flusso dati TCP e PHP
« Risposta #10 il: 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);
}
?>

« Ultima modifica: Febbraio 13, 2013, 04:06:57 pm da rccrcc »
Connesso
Samsung Galaxy S-Plus GT-I9001 - Android 4.4.4

antonino.spampinato

  • User quarto livello
  • ****
  • Karma: +18/-1
  • Offline Offline
  • Post: 468
    • Mostra profilo
Re:Consiglio su flusso dati TCP e PHP
« Risposta #11 il: Febbraio 13, 2013, 03:47:50 pm »

prego.
modifica script tyle in type.
ps. in basso.
« Ultima modifica: Febbraio 13, 2013, 03:51:52 pm da antonino.spampinato »
Connesso

Daniele8787

  • Sviluppatore GoJack
  • Administrator
  • Senior
  • *****
  • Karma: +95/-0
  • Offline Offline
  • Post: 1878
  • L'unica vera libertà, corrisponde al non aver bisogno di NULLA.
    • Mostra profilo
Re:Consiglio su flusso dati TCP e PHP
« Risposta #12 il: Febbraio 13, 2013, 03:49:20 pm »

Type.
Connesso

Giulio

  • User secondo livello
  • **
  • Karma: +4/-0
  • Offline Offline
  • Post: 67
    • Mostra profilo
Re:Consiglio su flusso dati TCP e PHP
« Risposta #13 il: Febbraio 13, 2013, 04:55:42 pm »

flush() funziona quindi :)
Connesso

Wifi Alice 50-100 metri con UsbKey + Potenziamento

Daniele8787

  • Sviluppatore GoJack
  • Administrator
  • Senior
  • *****
  • Karma: +95/-0
  • Offline Offline
  • Post: 1878
  • L'unica vera libertà, corrisponde al non aver bisogno di NULLA.
    • Mostra profilo
Re:Consiglio su flusso dati TCP e PHP
« Risposta #14 il: 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.
« Ultima modifica: Febbraio 13, 2013, 05:20:14 pm da Daniele8787 »
Connesso
 

Contatta Daniele8787 l'autore di GoJack


Se vuoi ringraziare me (Daniele8787) e ciopper90, per il lavoro svolto fin'ora,
puoi prendere in considerazione una libera donazione. Grazie mille.