Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    File esterni di appoggio

    Buongiorno, ho questa domanda:
    Volendo salvare dei dati su un file per caricarli fra pagine, qual'è il posto corretto?

    Spiego il problema:
    Sito in WordPress
    Ho la pagina1 che cambia una immagine.
    Una pagina2 mirror deve cambiare l'immagine come pagina1 (in automatico)

    Mi sono fatto una routine in PHP che salva l'immagine scelta su un file esterno .txt da pagina1
    E poi una routine che carica lo stesso file da pagina2 ma SENZA fare l'update della pagina (refresh)

    E qui nasce il mio problema il file txt che vado a leggere e caricare da pagina1 è come se non fosse aggiornato. Se invece faccio il refresh della pagina, anche il file si aggiorna e viene caricato il file correttamente. Per leggere il file uso questa sintassi:
    Codice PHP:
      $filename "/tmp/utente101.txt";
      
    $handle fopen($filename"r");

      
    $img101 fread($handlefilesize($filename));

      
    fclose($handle); 
    $img101 fino a che non faccio il refresh della pagina mi tiene il vecchio dato. Perché ? Cosa sto sbagliando ? Per caso PHP mi punta ad una sessione differente ? Come faccio a forzare la lettura corretta ?

    Saluti
    Alf

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    11,595
    Forse non ho capito io la situazione, ma se non fai il refresh della pagina, come dovrebbe fare il tuo browser a sapere che l'immagine è cambiata?
    Una volta che visualizzi la pagina la comunicazione è terminata, ciò che accade sul server dopo, al browser è sconosciuto.
    Al limite dovresti fare chiamate asincrone (AJAX, quindi javascript) da pagina2 ad intervalli per ricaricare solo l'immagine, ma in tal caso, visto che senza controlli ogni volta scaricheresti un'immagine, anche se non è cambiata, prevederei un sistema per capire se l'iimmagine sul server è la stessa attualmente visualizzata oppure no.
    Per farlo potresti per esempio cambiare nome al file quando viene aggiornato, così hai qualcosa da confrontare per accorgerti del cambiamento.

  3. #3
    Ciao Alhazred, grazie della risposta.
    La pagina2 (quella che deve cambiare) ha uno script in javascript che ogni 30 secondi lancia uno script in PHP con la funzione CallPhp() che legge il file. In questo modo pensavo di risolvere il mio problema. La funzione si esegue correttamente. Se io gli dico echo "Ciao", ogni 30 secondi mi scrive "Ciao".

    Solo che il file letto non è quello che nel frattempo è stato cambiato. E' come se fino al refresh della pagina, PHP non vedesse che il file è stato cambiato.

    Non posso usare il refresh perché ho visto che si sovraccarica il server facendo troppe chiamate ogni x secondi.
    Ecco perché chiedevo se magari sbaglio io la posizione su dove salvare i files. Magari la /tmp/ è una directory che viene duplicata in memoria ad ogni sessione di pagina (almeno questa è l'impressione che ho).

    Sulle chiamate asincrone (Ajax) non ho trovato esempi su come fare...
    Ciao
    Alf

  4. #4
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    11,595
    Fammi capire bene cosa hai.
    pagina1 contiene un form da cui è possibile caricare un'immagine sul server, l'immagine la salvi in una tua cartella che si chiama tmp oppure tmp è la cartella di default in cui php fa gli upload prima di spostare i file?
    Dentro questa cartella tmp c'è solo un file, ovvero quello dell'ultima immagine caricata?

    in pagina2 in che modo chiami lo script php sul server tramite javascript?
    Potrebbe essere che gestisci male la rispota del server per la modifica dell'immagine.

    Apri la console per il debug del browser che usi (ctrl+shift+j su Firefox, ctrl+shift-i su Chrome) e vedi se Javascript ti propone degli errori sulla chiamata allo script php (abbastanza probabile).

  5. #5
    Allora:
    Pagina1
    io ho un pannello con 4 tasti (Offline / Online / Pausa / Occupato)
    4 tasti. Se premo uno di questi tasti all'operatore compare il suo stato che ha appena scelto.
    Mettiamo che scelga "Occupato"

    Una procedura PHP

    Codice PHP:
    <?php
    // utente: utente101
    if(isset($_POST["esegui1"]))
    {
        
    $scelta=1;
    }        
    if(isset(
    $_POST["esegui2"]))
    {
        
    $scelta=2;
    }        
    if(isset(
    $_POST["esegui3"]))
    {
        
    $scelta=3;
    }        
    if(isset(
    $_POST["esegui4"]))
    {
        
    $scelta=4;
    }        
    if(
    $scelta==0)
      {
       
    $img "https://miosito.com/wp-content/uploads/2019/03/profilo_101_1.png";
       echo 
    '<img alt="" src="',$img '">',"\n <br />";
      }    
    if(
    $scelta==1)
      {
       
    $img "https://miosito.com/wp-content/uploads/2019/03/profilo_101_1.png";
       echo 
    '<img alt="" src="',$img '">',"\n <br />";
       
    $fp fopen('/tmp/utente101.txt''w');
       
    fwrite($fp$img);
       
    fclose($fp);
      }    
    if(
    $scelta==2)
      {
       
    $img "https://miosito.com/wp-content/uploads/2019/03/profilo_101_2.png";
       echo 
    '<img alt="" src="',$img '">',"\n <br />";
       
    $fp fopen('/tmp/utente101.txt''w');
       
    fwrite($fp$img);
       
    fclose($fp);
      }    
    if(
    $scelta==3)
      {
       
    $img "https://miosito.com/wp-content/uploads/2019/03/profilo_101_3.png";
       echo 
    '<img alt="" src="',$img '">',"\n <br />";
       
    $fp fopen('/tmp/utente101.txt''w');
       
    fwrite($fp$img);
       
    fclose($fp);
      }    
    if(
    $scelta==4)
      {
       
    $img "https://miosito.com/wp-content/uploads/2019/03/profilo_101_4.png";
       echo 
    '<img alt="" src="',$img '">',"\n <br />";
       
    $fp fopen('/tmp/utente101.txt''w');
       
    fwrite($fp$img);
       
    fclose($fp);
      }    



    ?>
    <br>
    <form method="POST" action="">
    <input type="submit" name="esegui1" value="    Offline   " /> 
    </form>
    <br>
    <form method="POST" action="">
    <input type="submit" name="esegui2" value="  In pausa  " /> 
    </form>
    <br>
    <form method="POST" action="">
    <input type="submit" name="esegui3" value="    Online   " /> 
    </form>
    <br>
    <form method="POST" action="">
    <input type="submit" name="esegui4" value="Occupato" /> 
    </form>
    salva il file utente101.txt dentro .cagefs/tmp/ che contiene solo la stringa:
    https://miosito.com/wp-content/uploa...filo_101_4.png

    ------

    Pagina2
    Contiene uno script che entra in azione ogni 30 secondi. Che lancia una funzione PHP che a sua volta lancia uno snippet che carica il dato.

    Codice PHP:
    <script>
        function on_callPhp()
            {
                var result="<?php php_func();?>";
                // alert(result);
                return false;
            }
        
        var data = new Date();
        data.setTime(<? echo time()*1000?>);
        function orologio()
        {

    var sec = data.getSeconds();
            document.getElementById('orologio').innerHTML = sec;
            data.setTime(data.getTime()+1000)
            setTimeout("orologio();",1000);
        if(sec==0)
            {
                // "routine 1 di apertura file in PHP"; 
                document.getElementById('scritta').innerHTML = 'lancio routine 1 di apertura file in PHP';
                on_callPhp();
            }
        if(sec==30)
            {
                // "routine 2 di apertura file in PHP"; 
                document.getElementById('scritta').innerHTML = 'lancio routine 2 di apertura file in PHP';
                on_callPhp();
            }
        }
    </script>
    <body onload="orologio()">
        <div id="orologio"></div>
        <div id="scritta"></div>
        <?php
            
    function php_func()
            {
                echo 
    "ciao";
                echo 
    do_shortcode('[wbcr_snippet id="532" title="test_chiamata_snippet"]');
            }
        
    ?>    
        
    </body>
    Infine lo snippet 532 che viene correttamente richiamato contiene questo:

    Codice PHP:
    <?php
    {
    $img101 "";    
    $filename "/tmp/utente101.txt";
    $handle fopen($filename"r");
    $img101 fread($handlefilesize($filename));
    fclose($handle);
    if(
    $img101=="https://miosito.com/wp-content/uploads/2019/03/profilo_101_3.png")
        {
            echo 
    "LIBERO e ONLINE";
            echo 
    '<a href="tel:348240XXXX"><img alt="" src="',$img101 '"></a>',"\n <br />";
        }
        else
        {
            echo 
    "TUTTI GLI ALTRI CASI";
            echo 
    '<img alt="" src="',$img101 '"></a>',"\n <br />";
        }
    }
    ?>
    Allora stranamente se l'operatore entra la prima volta e il file contiene la stringa:
    "https://miosito.com/wp-content/uploads/2019/03/profilo_101_3.png"

    Il sito presenta che è Online (correttamente).
    Poi l'operatore dal suo pannello si mette come "Occupato" e il file contiene:
    "https://miosito.com/wp-content/uploads/2019/03/profilo_101_4.png"

    Ma se io ho una pagina aperta lo stato non mi cambia. La procedura funziona e ogni 30 secondi ricevo i messaggi di controllo ma continua a caricarmi la stringa come se il file non fosse stato aggiornato. Se ricarico la pagina mi vede il file ultimo. E' come se separasse le sessioni.

    Ultima cosa (ma questo è relativo) lo snippet 532 lanciato da solo mi visualizza l'immagine. Lanciato da funzione PHP non visualizza l'immagine. Ma forse sbaglio io a richiamarla.

  6. #6
    Ho provato per controllo anche a mettere il codice dello snippet 532 direttamente nella funzione PHP
    Codice PHP:
    <?php
            
    function php_func()
            {
                .... 
    codice qui dentro
            
    }
        
    ?>
    Ma inutilmente. Stesso comportamento
    Alf

  7. #7
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    11,595
    codice:
    <script>
    function on_callPhp()
    {
        var result="<?php php_func();?>";
        // alert(result);
        return false;
    }
    ...
    Quella chiamata php viene eseguita solo alla prima visualizzazione della pagina, quando viene elaborata sul server, dopo non ha più alcun effetto perché quella riga diventa

    var result = "il_link_che_viene_preso_la_prima_volta";
    result non contiene più una chiamata alla funzione php_func(), ma ciò che questa ha restituito alla prima esecuzione.

    Prova a visualizzare il sorgente della pagina per rendertene conto, vedrai che nella pagina non c'è nemmeno la funzione php_func(), quella esiste solo nel momento in cui il file php viene interpretato la prima volta sul server.

    Quella funzione va messa in un file php a se stante e poi chiamata tramite AJAX.
    La funzione PHP non deve fare nulla di speciale, solo fare l'echo della stringa relativa all'immagine, il resto lo deve fare tutto AJAX, ovvero:
    - inviare una richiesta al file contenente php_func()
    - recuperare la risposta
    - sostituire il link alla nuova immagine nel src del tag img

    Per informazioni su AJAX, chiedi nella sezione Javascript, visto che è con quello che si fanno, ma intanto ti lascio un link
    https://www.w3schools.com/php/php_ajax_php.asp

  8. #8
    Grazie Alhazred, immaginavo che succedesse qualche cosa di simile.
    Ok chiederò nella sezione Ajax

    Ciao
    Alf

  9. #9
    Ciao, prima di chiudere fammi fare una serie di domande, così mi preparo un po' per la discussone su Ajax.

    Allora tu dici che:
    1 - "La funzione PHP non deve fare nulla di speciale, solo fare l'echo della stringa relativa all'immagine". Questo accade nella funzione func_php() o nella on_callPhp() ?

    2 - inviare una richiesta al file contenente php_func() - (quindi sono nella on_callPhp o nella chiamata Ajax? )
    3 - recuperare la risposta (qui sono ancora nella php_func() )
    4 - sostituire il link alla nuova immagine nel src del tag img (e anche qui sono ancora nella php_func() )
    Quindi mi pare di capire, correggimi se sbaglio che la
    on_callPhp() che gira periodicamente in JavaScript richiama la php_func() che è messa da un'altra parte. In un altro file.

    E dentro questo file PHP accade questo:
    fa echo della stringa relativa alla immagine
    fa la chiamata Ajax
    recupera la risposta
    sostituisce il link della nuova immagine del tag img.

    Giusto ?
    Alf
    Ultima modifica di alfredo.benni; 08-04-2019 a 18:45

  10. #10
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    11,595
    1) on_callPhp() è una funzione javascript, quindi intendo l'altra.
    2) La chiamata AJAX si fa all'interno di una funzione Javascript. AJAX non è un altro linguaggio di programmazione o un plugin o cose simili, è solo un modo di usare codice Javascript.
    3) no, sei sempre in Javascript, quindi dentro la chiamata AJAX
    4) e anche qui no, sei sempre nella chiamata AJAX

    In pratica la chiamata AJAX invierà una richiesta che è l'equivalente del submit di un form, quindi avrà un indirizzo al quale inviare la richiesta e questo sarà il file php contenente la funzione func_php(), in realtà in quel file non serve la funzione func_php(), il codice puoi metterlo direttamente fuori, quindi così come ce l'hai ora, ma senza metterlo dentro una funzione.

    No, succede nella chiamata AJAX, quindi in Javascript.
    Per questo ti dicevo che in PHP non devi fare quasi niente, fa praticamente tutto Javascript in questo scenario.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2019 vBulletin Solutions, Inc. All rights reserved.