Visualizzazione risultati 1 fino 10 di 10
Like Tree1Likes
  • 1 Post By mzanella

Discussione: [PHP]Fermare poche righe di codice per pochi secondi

  1. #1
    RisposteAutoBot non è connesso Neofita
    Data registrazione
    29-07-2017
    Messaggi
    26

    Predefinito [PHP]Fermare poche righe di codice per pochi secondi

    Salve a tutti, sono nuovo nel modo di php e precisamente nel programmare un BOT su telegram.
    Se, come da titolo, volessi che il mio codice deve fermarsi per tot secondi, come devo fare? Sleep non mi aiuta perchè ritarda la funzione, ma non la stoppa, cioè se gli arriva un comando da processare, il codice risponde, e se gliene arriva un altro, il codice gli risponde ma dopo tot secondi, ed io non voglio che il secondo comando debba essere proprio processato.
    Ringrazio tutti per qualsiasi assistenza!!!

  2. #2
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Torniamo all'inizio... Per accendere quel comando fai una richiesta della URI... posta la URI (senza token)... Ovviamente deve esserci qualcosa che differenzia le due richieste

  3. #3
    RisposteAutoBot non è connesso Neofita
    Data registrazione
    29-07-2017
    Messaggi
    26

    Predefinito

    Innanzitutto grazie per la risposta. Scusami ma comunque non ho capito cosa vuoi che ti posto 😅 potresti gentilmente farmi un esempio?
    Questo? https://api.telegram.org/botxxx/
    Ultima modifica di RisposteAutoBot : 26-09-2017 alle ore 16.24.32

  4. #4
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Prego figurati... Dai non puoi non capire cosa sia un URI :D .. Innanzitutto telegram richiede https e per altervista devi attivare CloudFlare e https, fare l'upgrade da MySQL 5.1 a MySQL 5.6 e poi devi abilitare le connessioni Server to server... Dunque uhm quindi devi agire su un URI esterna dove non hai alcun controllo... devi memorizzare il timestamp in un database o file di testo e solo se il il timestamp è inferiore al tempo fissato fai un update del nuovo timestamp..
    Quando verrà chiamato il bot
    Codice PHP:
    <?php
    $time
    = time();
    $filename = 'time.txt';
    if((
    $time2 = file_get_contents($filename)) == 0 || $time2+30 < $time) {
    //Creazione o Update timestamp
    if($handle = fopen($filename, 'w')) {
    fwrite($handle, $time);
    $time2 = $time;
    }
    fclose($handle);
    }
    if(
    $time2 != 0 && $time2 == $time){
    //eseguo il codice
    }
    elseif (
    $time2 != $time) {
    echo
    'devi aspettare ',$time2+30-$time,' secondi per il comando';
    }
    elseif (
    $handle == False) {
    echo
    'errore con il file';
    }
    ?>
    praticamente eseguo il codice solo quando $time2 è uguale $time.
    Nota* è una mia nota personale.. È obsoleto non pensare hai flood... Instangram dovrebbe fornire il timestamp ... Quando arriva un comando al bot o dei semplici messaggi in quella precisa stanza, deve memorizzare gli ultimi 5 timestamp generati (indipendentemente dall'user in questione)..
    Ultima modifica di darbula : 26-09-2017 alle ore 22.01.03

  5. #5
    RisposteAutoBot non è connesso Neofita
    Data registrazione
    29-07-2017
    Messaggi
    26

    Predefinito

    Grazie per la risposta...più tardi provo(adattandola alle mie esigenze) e ti faccio sapere!!! 😊😊😊

  6. #6
    RisposteAutoBot non è connesso Neofita
    Data registrazione
    29-07-2017
    Messaggi
    26

    Predefinito

    Ho testato il codice, ma non riesce mai a processare le righe di comando...dovrebbe essere impostato in modo che il conteggio del timer parte dopo aver processato le righe di comando di mio interesse e alla fine ritorna a 0(come fa già).

  7. #7
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Il php verrà sempre processato ma verrà eseguito solo se la condizione è vera
    Codice PHP:
    <?php
    $time
    = time();
    $filename = 'time.txt';
    if((
    $time2 = file_get_contents($filename)) == 0 || $time2+30 < $time) {
    //Creazione o Update timestamp
    if($handle = fopen($filename, 'w')) {
    fwrite($handle, $time);
    $time2 = $time;
    }
    fclose($handle);
    }
    if(
    $time2 != 0 && $time2 == $time){
    //eseguo il codice
    }
    elseif (
    $time2 != $time) {
    echo
    'devi aspettare ',$time2+30-$time,' secondi per il comando';
    }
    elseif (
    $handle == False) {
    echo
    'errore con il file';
    }
    ?>
    l'editor di altervista inseriva codici strani... Chiedo scusa se non ho capito la tua richiesta

  8. #8
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Come suggerito da darbula ti serve uno stato condiviso in cui tenere traccia del timestamp dell'ultima azione eseguita. Però hai anche bisogno di un meccanismo di lock, il semplice accesso e controllo sui file non basta.

    A dirla tutta, generalmente la concorrenza non va gestita basandosi sui tempi di esecuzione che sono inaffidabili e possono cambiare. Sono pochi i casi in cui ciò è indispensabile, il tuo potrebbe essere uno di questi, ma dovresti rifletterci bene.
    Ad esempio, se io volessi usare un servizio del tuo sito ma mi venisse mostrato il messaggio "non puoi procedere perché qualcun'altro ha usato il servizio prima di te, aspetta 20 secondi e spera che nessuno ti freghi il posto", non sarei molto contento !
    Piuttosto preferirei essere messo automaticamente in coda ed aspettare che il sistema elabori la mia richiesta.

    Comunque, se intendi procedere, in pseudocodice suggerirei qualcosa del genere:
    Codice:
    cerca di acquisire il lock esclusivo sullo stato condiviso (termina in caso di fallimento)
    acquisiscilo
    leggi l'istante dell'ultima operazione dallo stato condiviso
    se è trascorso almeno un determinato lasso di tempo dall'istante dell'ultima operazione procedi, altrimenti termina con fallimento
    memorizza nello stato condiviso l'istante corrente
    rilascia il lock
    
    esegui il codice in questione
    Che in codice si traduce, ad esempio, con qualcosa del genere:
    Codice PHP:
    // Cerca di acquisire il lock sullo stato condiviso e verifica il vincolo temporale.
    // Restituisce il numero di secondi da attendere prima di poter procedere (0 se è possibile agire subito)
    function get_lock($name = 'lock', $waiting_time = 5) {
    $fp = is_readable($name) ? fopen($name, 'w') : fopen($name, 'r+');
    if (!
    $fp) {
    die(
    "Errore durante l'accesso al file system.");
    }

    if (!
    flock($fp, LOCK_EX | LOCK_NB)) {
    return
    $waiting_time;
    }

    $last_action_timestamp = fread($fp, filesize($name));
    if (
    time() - $last_action_timestamp < $waiting_time) {
    return
    $waiting_time - (time() - $last_action_timestamp);
    }

    truncate($fp, 0);
    fwrite($fp, time());
    fflush($fp);
    flock($fp, LOCK_UN);

    return
    0;
    }

    $seconds_to_wait = get_lock('lock', 5);
    if (
    $seconds_to_wait > 0) {
    die(
    "Non puoi procedere perché qualcun'altro ha usato il servizio prima di te, aspetta $seconds_to_wait secondi e spera che nessuno ti freghi il posto");
    }
    // Esegui il tuo codice
    // ...
    darbula likes this.

  9. #9
    RisposteAutoBot non è connesso Neofita
    Data registrazione
    29-07-2017
    Messaggi
    26

    Predefinito

    Ragazzi siete veramente grandi e non vi ringrazierò mai abbastanza...ho già detto di essere alle prime armi sul php e le righe di codice che mi avete postato mi hanno aperto un mondo davanti...intanto ringrazio darbula perché mi ha fornito ciò di cui avevo bisogno(perché questa cosa la devo applicare ad un bot telegram, che agirà su un super gruppo, quindi per evitare casini ho bisogno che stoppa per un po’). Ringrazio poi mzanella perché ripeto, mi hai aperto nuovi scenari!!!
    GRAZIE GRAZIE GRAZIE!!!!

  10. #10
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    @maznella ovviamente tutto il discorso è riferito alle bot api che per natura sa dove deve funzionare... (Se ne deduce che il bot sa da dove sta agendo ed è compito del programmatore differienziare) https://core.telegram.org/bots/api
    @RisposteAutoBot prego figurati.

Tags for this Thread

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •