Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: PHP ja tekstitiedostoon kirjoittaminen

kayttaja-1634 [18.01.2011 19:25:24]

#

Tein systeemin, joka tallentaa mm. käyttäjien antaman tekstin sekä aikatietoja ym. relevanttia yhteen ja samaan tekstitiedostoon.

Ajattelin aluksi, että käyttäisin perus fopen/fwrite/fclose etc., mutta muistan, että taannoin tämä korruptoi tai saattoi tyhjentää koko tiedoston, mikäli sitä käytti useampi samaan aikaan.

Mikähän olisi hyvä korvaava systeemi vai tapahtuuko tätä datakatoa enää nykyään?

Grez [18.01.2011 19:30:30]

#

kayttaja-1634 kirjoitti:

Mikähän olisi hyvä korvaava systeemi

Tietokanta on yleensä aika hyvä ratkaisu tiedon tallentamiseen.

Käsitääkseni tuon tiedostoon tallentamisenkin saa toimimaan valitussa ympäristössä jos tietää tarkasti mitä tekee. Itse en jaksaisi käyttää aikaa sellaiseen minkä saisi helposti tehtyä varmemmin toisella tavalla.

kayttaja-1634 [18.01.2011 19:37:13]

#

Tietokanta ei oikeastaan ole vaihtoehto.. :(

Olisikohan hyvä, jos jokaisen datapaketin tallentaisi aina eri tiedostoon? Ideoita otetaan vastaan!

Hennkka [18.01.2011 19:43:47]

#

Eikös flock toimi tuohon tarkoitukseen?

Metabolix [18.01.2011 19:56:33]

#

Tiedostot voi lukita flock-funktiolla. Nykytiedon mukaan lukitus pitää myös osata poistaa.

Jos kerran käytät tiedostoja, nopeusvaatimuksesi eivät varmaan ole kovin korkealla. Voit siis huoletta käyttää seuraavaa koodia:

<?php
# lukko.php

class Lukko {
  private static $lukko = null;
  private static $f = null;

  public static function lukitse() {
    if (!self::$lukko) {
      self::$lukko = new Lukko();
    }
  }

  public function __construct() {
    if (!self::$f) {
      self::$f = fopen(__FILE__, "r");
      if (!flock(self::$f, LOCK_EX)) {
        trigger_error("Lukitusvirhe!", E_USER_ERROR);
      }
    }
  }

  public function __destruct() {
    if (self::$f) {
      flock(self::$f, LOCK_UN);
      self::$f = null;
    }
  }
}

Funktio Lukko::lukitse estää kaiken samanaikaisen käytön, kunnes skripti on ajettu loppuun asti; näin on varmasti sinulle turvallisinta. Lukitus on syytä tehdä aina ennen datan käsittelyä.

Seuraavat funktiot tallentavat ja lataavat PHP:n muuttujia sellaisinaan:

<?php
# tiedostofunktiot.php

include("lukko.php");

function tallenna($tiedosto, $data) {
  Lukko::lukitse();
  file_put_contents($tiedosto, serialize($data));
}

function lataa($tiedosto) {
  Lukko::lukitse();
  if (file_exists($tiedosto)) {
    return unserialize(file_get_contents($tiedosto));
  }
  return null;
}

Funktioita voi käyttää näin:

<?php
include("tiedostofunktiot.php");

# Tallennetaan tiedostoon dataa.
$f = array("x" => 1, "y" => 2);
tallenna("testi.dat", $f);

# Ladataan ja tulostetaan tallennettu data.
# Jos tiedosto puuttuisi, $f olisi NULL.
$f = lataa("testi.dat");
var_dump($f);

kayttaja-1634 [18.01.2011 20:21:24]

#

Jeps, kiitos!

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta