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

    problema scrittura contemporanea file

    Ciao a tutti, premettendo che sono un neofita di php, qualcuno mi saprebbe spiegare una maniera per far scrivere un file in maniera sequenziale evitando che scrivendo in parallelo si perda la consequenzialità dei dati?
    Per intenderci io ho dovuto modificare un programma estraendo delle informazioni da esso poi le ho inviate attraverso l'oggetto xmlhttprequest ad un file php che li riceve e li scrive in un file.
    Il problema è che talvolta non vengono scritti nell'esatta maniera in cui sono stati estratti, ossia talvolta il file 5 viene prima del 4.
    Il motivo non so spiegarmelo, pensavo fosse dovuto al fatto che la scrittura avviene in tempi ravvicinati e quindi durante le varie operazioni possono accavallarsi e causare queste situazioni.
    Per questo motivo cercavo un modo per evitarlo, qualcuno può suggerirmelo?
    per completezza metto parte del codice:

    dal file .js:

    createXHR: function(inviodati) {
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open("GET", inviodati, true);
    xmlHttp.send(null);
    xmlHttp.close;

    }

    inviodati = page +
    "?date=" +
    escape(date) +
    "&href=" +
    escape(href) +
    "&domain=" +
    escape(domain) +
    "&size=" +
    escape(size) +
    "&timeElapsed=" +
    escape(timeElapsed) +
    "&responseHeaders=" +
    escape(responseHeaders) +
    "&requestHeaders=" +
    escape(requestHeaders) +
    "&xhrRootPage=" +
    escape(xhrRootPage);


    this.createXHR(inviodati);


    dal file php:

    <?php

    $date;
    $href;
    $domain;
    $size;
    $timeElapsed;
    $responseHeaders;
    $requestHeaders;
    $xhrRootPage;



    if ((isset($_GET['date']))and(isset($_GET['href']))and(isset($_GET['domain']))and

    (isset($_GET['size']))and(isset($_GET['timeElapsed']))and
    (isset($_GET['responseHeaders']))and(isset($_GET['requestHeaders']))and(isset($_GET['xhrRootPage'])))

    {
    $date = $_GET['date'];
    $href = $_GET['href'];
    $domain = $_GET['domain'];
    $size = $_GET['size'];
    $timeElapsed = $_GET['timeElapsed'];
    $responseHeaders = $_GET['responseHeaders'];
    $requestHeaders = $_GET['requestHeaders'];
    $xhrRootPage = $_GET['xhrRootPage'];

    };
    ?>


    <?php
    $file;
    include 'ricdati.php';



    $file = fopen("NetFirebugExtensionLOG.rtf", "a+");

    if (!$file)
    {
    echo "

    Impossibile aprire il file remoto in scrittura.\n";
    exit;
    }



    /* Scrive i dati qui. */



    fputs ($file, $date." ".$href." ".$domain."\ndimensione: ".$size."\ntempo di caricamento: ".$timeElapsed."\nRootPage: ".$xhrRootPage);

    fputs ($file, "\nHeaders di risposta:"."\n".$responseHeaders);

    fputs ($file, "\nHeaders di richiesta:"."\n".$requestHeaders."\n");

    fputs ($file, " - - - - - - - - - - - "."\n");

    fclose ($file);

  2. #2
    Perchè non usi un database?

    Il motivo non so spiegarmelo, pensavo fosse dovuto al fatto che la scrittura avviene in tempi ravvicinati e quindi durante le varie operazioni possono accavallarsi e causare queste situazioni.
    Per questo motivo cercavo un modo per evitarlo, qualcuno può suggerirmelo?
    Prova con:
    http://www.php.net/flock

  3. #3
    in realtà sono costretto a usare entrambe le soluzioni sia il database che il file su cui scrivere per cui non posso escluderlo.
    Sostanzialmente mi servirebbe un modo per inviare un feedback che dallo script php vada allo script javascript per dire che è stato effettuato il salvataggio e può riprendere il ciclo.
    Grazie per il link, purtroppo l'avevo visto poco fa e non mi è sembrato molto d'aiuto perchè è vero che potevo rendere esclusivo l'accesso ma chi non riusciva ad accedere non scriveva più e quindi i dati andavano persi.

  4. #4
    in realtà sono costretto a usare entrambe le soluzioni sia il database che il file su cui scrivere per cui non posso escluderlo.
    Se puoi usare un database, a che ti serve lavorare su un file? Quali vantaggi pensi di ottenere?
    non mi è sembrato molto d'aiuto perchè è vero che potevo rendere esclusivo l'accesso ma chi non riusciva ad accedere non scriveva più e quindi i dati andavano persi.
    Per quello è sufficiente un while() per fare in modo che lo script attenda fin tanto che il lock viene tolto dal file prima di eseguire la scrittura. Nessun dato viene perso.

  5. #5
    dici che dal database questo problema non si pone?
    ho provato ad usare flock, per l'esattezza questo codice:

    $file = fopen("NetFirebugExtensionLOG.rtf", "a+");


    /* Scrive i dati qui. */

    if (flock($file, LOCK_EX)) { // Esegue un lock esclusivo

    fputs ($file, $date." ".$href." ".$domain."\ndimensione: ".$size."\ntempo di caricamento: ".$timeElapsed."\nRootPage: ".$xhrRootPage);

    fputs ($file, "\nHeaders di risposta:"."\n".$responseHeaders);

    fputs ($file, "\nHeaders di richiesta:"."\n".$requestHeaders."\n");

    fputs ($file, " - - - - - - - - - - - "."\n");

    fclose ($file);


    flock($file, LOCK_UN); // rilascia il lock
    }



    tuttavia continua a darmi lo stesso problema.
    Come useresti il while?

  6. #6
    ho provato anche con il database ed il problema è il medesimo

  7. #7
    dici che dal database questo problema non si pone?
    Un server database come MySQL è nato per supportare accessi concorrenti, oltretutto scriveresti in modo sequenziale nella tabelle e potresti sempre leggere i dati con un ORDER BY.

    Una cosa tipo:

    while(!flock($file, LOCK_EX)) {}

    Eventualmente con un usleep() ed un controllo delle esecuzioni per evitare un ciclo infinito.

  8. #8
    sto usando easyphp per il database quindi il database mysql c'è tuttavia il problema esiste comunque.
    Mi sono ridotto a inserire un ciclo for che faccia "perdere tempo" per permettere la scrittura

    Comunque per fare maggior chiarezza laddove non l'avessi detto, lo script php che riceve i dati è unico, esso è incluso in un altro che si occupa di scrivere sul file /database
    Che tu sappia non esiste alcun modo per inviare un dato che funga da feedback per il ciclo presente nella funzione javascript che invia i dati?

  9. #9
    Utente di HTML.it L'avatar di mariox
    Registrato dal
    Nov 2006
    Messaggi
    837
    se utilizzi il database puoi utilizzare le funzioni di libreria di mysql, nello specifico LOCK TABLE e UNLOCK TABLE.

    http://database.html.it/guide/lezion...azioni-e-lock/

    in pratica puoi bloccare la tabella sia in lettura che in scrittura, successivamente terminata la query di inserimento dei dati, la tabella viene sbloccata e così via....

  10. #10
    ti ringrazio, ho letto ma credo di non aver capito dove devo dare il comando
    LOCK TABLES
    tabella [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}

    scusa ma non sono molto ferrato nella materia per ora

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