Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 23
  1. #11
    Come funzionano a grandi linee i semafori?

    A me interessa garantire che non ci siano problemi di sovrascrittura, per gli utenti non c'è problema, posso memorizzare i loro dati su un file temporaneo mentre attendo l'esecuzione dello script.

  2. #12
    Originariamente inviato da Artechbrand
    Scusa daniele_dll

    ma visto che stiamo parlando di una registrazione su di un sito web
    sai che bello fare attendere il tuo utente... e poi rispondergli pure con un errore?
    Bah
    Non voler usare questi sistemi perché possono portare problemi, può anche andare bene, ma arrivare alla paranoia (scusa se mi permetto) direi che non fa bene

    in media, l'esecuzione di una pagina, dura (se la pagina è fatta male) mediamente 0.5s, durante tutto questo tempo non c'è necessità che il file sia lockato diciamo ... che per farla esagerata, lo si locka per 0.1s ... quindi se l'utente aspetta qualche decimo di secondo per visualizzare la pagina, dato che le esigenze insidacabili sono queste [è stato già proposto di usare un db ... se non può/vuole poi sono fatti suoi ^^], non mi sembra un ritardo particolare ... se dovremmo tenere conto di questi "ritardi" beh direi di iniziarsi a preoccupare di ben altre cose (ad esempio il numero di richieste sono necessarie per visualizzare una pagina web, o ancora che conviene mettere i tag script in fondo al codice html, subito prima della chiusura del body, cosi da caricare e visualizzare tutta la pagina senza interromperne l'esecuzione e via dicendo)

    @starcraftworld
    mmm ... immagina dei normali semafori che controllano il traffico ... a grandi linee si assomogliano
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  3. #13
    che differenza ci sarebbe in questo caso tra usare i semafori e usare il flock?

  4. #14
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Aspe qui ci sono dei prob di fondo , loa sincronizzazione tramite semafori la si impara solitamente nei corsi di sistemi operativi nelle sezioni dedicate a processi/filesystem.

    Sinceramente e' abb arduo spiegarlo in un thread( scusate il gioco di parole ). Visto che tante colte si tratta di mesi di studio.

    Io ribadisco che a mio parere se non hai molti accessi puoi anche usare flock tranquillamente tanto con cosi' pochi accessi , e come diceve giustamente daniele, e' (per usare terminologia statstica) "estremamente improbabile" che tu incorra in accessi contemporanei a tempo di lettura/scrittura.

    Ovviamente devi considerare che quel gfile verra' usato anche a tempo di login/controllo accessi.

    Per questo io ti scondiglio di usare il file se puoi usa database.

    Se proprio non puoi usare il db allora usa flock come in esempio (tratto dalla documentazione ufficiale)

    Codice PHP:

    <?php

    $fp 
    fopen("/tmp/lock.txt""w");

    if (
    flock($fpLOCK_EX)) { // do an exclusive lock
        
    ftruncate($fp0);  // truncate file
        
    fwrite($fp"Write something here\n");
        
    flock($fpLOCK_UN); // release the lock
    } else {
        echo 
    "Couldn't get the lock!";
    }

    fclose($fp);

  5. #15
    Ma flock quindi ha qualche difetto che i semafori non hanno?

  6. #16
    beh, i semafori non sono legati ai file ... sono per usati specificatamente per la sincronizzazione tra processi diversi ... flock per niente, serve a evitare che ci siano può processi che operino sullo stesso file

    PS: se si apre il file con fopen usando w il file viene prima svuotato e poi lockato , si dovrebbe usare r+ e se il file deve cambiare di dimensione, dopo che si scrive si può usare http://www.php.net/manual/en/function.ftruncate.php per togliere la parte in più
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  7. #17
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    ARGH !

    No fermo i semafori sono una struttura astratta.
    Solitamente vengono implementati tramite variabili intere oppure array diu variabili intere (o booleane).

    giusto per capirci 1 = verde , 0=rosso.

    Se il semafonor ' verde la macchina passa se e' rosso non passa-
    Quindi in pesudocodice

    if ( semaforo IS 1 )
    then GO
    else
    STOP

    Questo concetto si applica in programmazione per sincronizzare processi o thread concorrenti.
    Se due processi volgiono accedere alla stessa risorsa nello stesso momento che succede????

    Usiamo i semafori.
    Ma un semaforo e' fondamentalmente un concetto, alcuni linguaggi implementano nativamente qlkosa di "umanizzato" per la loro gestione, altri linguaggi come java implementando direttamente i monitor per la gestione della concorrenzionalita' php invece???

    Php e' diverso e' un liunguaggio innanzitutto interpreato NON nato per applicativi realtime, ma per essere eseguite sotto apace in un ambiente stateless, ovvero eseguo lo script e buonanotte. Non ho "main" o altro che eseguo costantemente.

    Quindi come faccio a capire se un file e' aperto o no da un altra istanza di apache che avvio lo stesso script?

    per fare cio' flock usato a tempo di gestione del file consente allo script di capire se tale file e' disponibile e quindi non in quel preciso momento utilizzato da un altro script.


    il concetto e'

    1 - il file e' disponibile
    SI : apri il file , blocca il file esegui istruzioni chiiudi il file e sbloccalo
    NO : se non ho superato il limite massimo di prove , attendi X tempo e ripova , altrimenti esci con errore


    .... tutto qui.

  8. #18
    quindi flock non permette alcun errore del tipo di cui parlavo prima? nel senso che è una garanzia?
    se apro il file con simpleXML va bene lo stesso?

  9. #19
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Se lo usi correttamente si, ovviamete devi usarlo ovunque apri quel file.

    Sinceramente con simple xml nn saprei. Dovresti estendere la calsse e ridefinirti il metodo di lettura del file con un metodo tuo personale che blocca il file chiama il metodo della superclasse che parsa il file e poi lo sblocchi e ritorni l'output del metodo della superclasse.

  10. #20
    dovresti aprire il file, leggerne il contenuto e passare il contenuto letto a simplexml

    schematizzando,

    Codice PHP:
    // Apre il file in lettura/scrittura ma senza troncarlo
    if (($fp fopen($file'r+')) == false)
    {
        die(
    'impossibile aprire il file');
    }

    // Blocca l'accesso al file
    if (flock($fpLOCK_EX) === false)
    {
       die(
    'impossibile effettuare il lock!');
    }

    // Legge tutto il file
    $buffer '';
    while(!
    feof($fp))
    {
      
    $buffer .= fread($fp8192);
    }

    // Acquisisce l'oggetto corrispondente
    $simpleXml simplexml_load_string($buffer);

    // Libera la memoria
    unset($buffer);

    .
    .
    .
    si fanno tutte le varie operazioni
    .
    .
    .

    // Si posiziona all'inizio del file
    fseek($fp0SEEK_SET);

    // Scrive il buffer nel file
    if (($dataLength fwrite($fp$simpleXml->asXML())) == false)
    {
        die(
    'impossibile scrivere il file');
    }

    // Si taglia via la parte del file in più
    ftruncate($fp$dataLength);

    // Si chiude il file
    fclose($fp); 
    Ovviamente, se nella pagina non serve effettuare la scrittura il file va chiuso alla lettura del file e non dopo la scrittura, cosi da evitare blocchi inutili

    Questo sistema (che ho scritto qui e anche se tecnicamente dovrebbe andare non ho idea se ci sta qualche bug stupido che non lo fa funzionare) ha un problema: su windows non si può usare il effettuare un lock di tipo non blocking ovvero una richiesta che risponda si/no piuttosto che aspettare che il file possa essere lockato e quindi, su windows, non è possibile effettuare controlli sul timeout

    se si dovesse usare esclusivamente su linux e si volessero usare dei controlli sul timeout cosi da poter dare un avviso all'utente invece del fatal error per il timeout sull'esecuzione, il codice
    [php]
    // Blocca l'accesso al file
    if (flock($fp, LOCK_EX) === false)
    {
    die('impossibile effettuare il lock!');
    }
    [/code]

    andrebbe cambiato in
    Codice PHP:
    $timeout 10;
    $timeoutStart time();
    $wouldblock false;
    $result false;
    do
    {
        
    // Prova ad effettuare il lock del puntatore al file
        
    if (($result flock($fpLOCK_EX LOCK_NB$wouldblock=) === false)
        {
            if (
    $wouldblock === false)
            {
                die(
    'impossibile effettuare il lock!');
            }
        }
        else
        {
            
    // Il lock è riuscito
            
    break;
        }
        
        
    // Attende per un 50 centesimi di secondo per evitare controlli ripetitivi
        
    usleep(50000);
    }
    while(
    time() - $timeoutStart $timeout);

    // Verifica il risultato dell'operazione
    if ($result === false)
    {
        die (
    'si è verificato un timeout tentando il locking del file');

    (tutto questo papello come sopra, non l'ho testato quindi ci potrebbero essere bug ^^)

    ripeto ... su windows non funzionerà nel senso che flock restituirà true quando riuscirà ad effettuare il lock senza dare il timeout se passa troppo tempo ^^

    NB: piccola nota finale ... questo sistema ha lo svantaggio di consumare un sacco di memoria inutile che, anche se viene liberata subito (ergo unset($buffer)) se il file da caricare è troppo grande php darà errore per la memoria consumata

    Un'altra ottima alternativa sarebbe quella di creare una classe per gestire gli stream che permetta di effettuare le operazioni facendo questi controlli ed usare, tramite questa, simplexml

    Se ad esempio si registra uno stream di tipo xmldb, il file potrebbe essere aperto tramite una path tipo xmldb://path/al/file.xml

    http://www.php.net/stream
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

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 © 2026 vBulletin Solutions, Inc. All rights reserved.