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?
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.
Tietokanta ei oikeastaan ole vaihtoehto.. :(
Olisikohan hyvä, jos jokaisen datapaketin tallentaisi aina eri tiedostoon? Ideoita otetaan vastaan!
Eikös flock toimi tuohon tarkoitukseen?
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:
Jeps, kiitos!
Aihe on jo aika vanha, joten et voi enää vastata siihen.