Autor Zpráva
Imro
Profil *
Dobrý deň.
Na svojej stránke využívam ukladanie informácií do súborov, tých informácií sa však ukladá veľmi veľa (užívatelia, komentáre a iné dáta) a niekde som počul, že je možné takto stratiť dáta (ak sa naraz ukladajú dve veci - buď sa jedno neuloží, alebo sa obe skombinujú, napr. ukladám slovo LOL a ROFL, bude z toho buď LOL, alebo ROFL, alebo LOFL), je to pravda?
Ak hej, je možné tejto strate dát nejako zabrániť bez využitia SQL? Hosting totiž SQL nepodporuje a okrem toho by som existujúce dáta príliš dlho prenášal do tabuliek...

Napadlo ma, či by nešlo nejako využiť CRON, aby sa tie dáta nejako uložili a každú minútu by ich CRON zapísal, ale je tam v podstate rovnaký problém - počas tej minúty tie dáta musia niekde byť zapísané...
Nejaký nápad? Vopred vďaka za odpovede.
xmark
Profil
LOL a ROFL k přesné odpovědi bohužel nestačí. Myslím že i pomocí souborů lze dosáhnout bezpečného ukládání dat, ale není to jednoduché. Jestli jde o projekt, který má nějakou návštěvnost a má smysl do něj investovat pár set Kč, doporučil bych přestěhovat to na hosting s databází.
NejakyTom
Profil
Rozhodne prejit na hosting kde je nejaky db system..
Databaze nejsou stvoreny jen tak pro srandu, ma to nejaky smysl a rozhodne hrozi mensi sance ze nejaka data ztratite, lehci organizace, vyhledavani, razeni a dalsi a dalsi veci. A nejake prepsani dat je nemozne.

Jinak k tematu: kdyz prvni uzivatel odevre soubor a zacne do nej zapisovat a mezitim udelat jiny uzivatel to same je jasne ze se data zapsat nemuzou - respektive se prepisou (urcite se nespoji) a data jednoho z uzivatelu (zalezi ktery soubor ulozi driv) tam nebudou. Akorat tohle probiha strasne moc rychle takze sance ze se to stane je mala.
Imro
Profil *
xmark:
Problém je, že zatiaľ neviem či stojí za to investovať do toho ďalšie peniaze.

NejakyTom:
Nemyslel som zapisovanie do JEDNÉHO súboru, ale do rozdielnych súborov.
Užívateľ č. 1 sa registruje, PHP otvorí súbor LOL.dat a zapíše dáta.
V tom istom momente užívateľ č. 2 pridá komentár, otvorí sa súbor ROFL.dat a zapíšu sa dáta.
Takto na to vplyv nemá? Ak sa naraz využívajú dva súbory, nestratia sa dáta? Len ak sa naraz používa jeden?

Ale vďaka, asi prejdem na tú DB.
NejakyTom
Profil
V tomhle pripade neni duvod proc by se data mohla vytratit.
Ale i tak doporucuji nejakou DB nejlepe asi nejrozsirenejsi MySQL kterou ma 90% webhostingu.
imploder
Profil
Imro:
Může se to pokazit, jenom pokud 2 skripty mají soubor otevřený ve stejnou dobu. Pokud ho jeden upraví, zavře a až pak ho otevře druhý, tak se nic stát nemůže.

PHP samo o sobě nemá vhodné prostředky, jak tohle zaručit, ale jde použít třeba Nette::SafeStream. Pokud se bude se souborem pracovat pomocí něj, tak to bude bezpečné.
Imro
Profil *
NejakyTom, imploder:
No v podstate vždy sa dáta zapisujú postupne, no aj tak sa môže stať, že dáta zapíšu dvaja užívatelia naraz (napr. sa registrujú, vtedy sa síce pracuje s rozdielnymi súbormi, no napr. ich e-mail sa zapíše do jedného rovnakého súboru, čiže tu je riziko...
Ten Nette::SafeStream nechápem - stačí ak pri každej ceste k súboru použijem safe:// ?

Spýtam sa providera či je možné pridať k zakúpenému balíku aj databázu, ak hej, prejdem na SQL, ak nie, pozriem sa bližšie na ten Safestream, každopádne veľmi pekne ďakujem všetkým.
Imro
Profil *
Dokelu práve mi došlo - na ten SafeStream treba aj nejakú knižnicu, nie? Nemám ju tam však ako vložiť, cez FTP mám prístup len k mojej stránke..
imploder
Profil
Imro:
Jak Nette::SafeStream používat je popsané v tom článku. Ten odkaz na stažení dole (pod nadpisem Download) už nefunguje. Je to součástí knihovny Nette, dokumentace je tady: http://doc.nette.org/cs/nette-io-safestream

Vytáhl jsem SafeStream z Nette a přiložil k němu ukázku použití (ukazka.php - zapisuje na konec souboru soubor.txt řádky "ahoj"): odkaz

Stačí zavolat NSafeStream::register() a pak dávat před cestu k souboru 'safe://' a používat standardní funkce PHP pro práci se soubory. Mělo by to fungovat.
Imro
Profil *
imploder:
A funguje to štandardne aj pri iných módoch (zápis, čítanie), resp. mám to safe:// používať aj pri čítaní súborov alebo len pri zápise?
Bude to fungovať aj keď zapisujem/čítam do/zo súborov po riadkoch (zápis niečo\n niečo, čítanie fgets, fgets)?
Vďaka.
Imro
Profil *
imploder:
Jo a (prepáč že sa stále pýtam kraviny) teda nebude treba žiadnu knižnicu, len includnúť ten PHP súbor s funkciami toho Nette, však?
imploder
Profil
Imro:
Stačí to jen includnout a zavolat NSafeStream::register() - jako je to ve skriptu ukazka.php. Nic jiného z Nette není potřeba používat. Dají se používat různé módy, na čtení i na zápis. Všechno je to v SafeStream.php - je to jedna malá třída, nic rozsáhlého. Funkce se dají používat standardní, jako normálně v PHP.
Imro
Profil *
imploder:
Ďakujem ti, práve si mi ušetril veľa trápenia :D
Posledná ******* otázka - aby som predišiel problémom - safe:// mám použiť pred cestou k súboru alebo pred súborom?
Teda 'safe:///lol/subor.txt' alebo '/lol/safe://subor.txt' ?
Imro
Profil *
Jo a ešte...
treba používať aj unlink('safe://subor.txt') (keď už, tak predpokladám že po fclose)?
imploder
Profil
Imro:
Posledná ******* otázka - aby som predišiel problémom - safe:// mám použiť pred cestou k súboru alebo pred súborom?
Před celou cestou. Je to podobné, jako se u URL zapisuje na začátku http:// jako název protokolu - stejný princip.

treba používať aj unlink('safe://subor.txt') (keď už, tak predpokladám že po fclose)?
Ne. To by soubor smazalo. V článku je to uvedené jen pro ilustraci, že to jde.
Imro
Profil *
imploder:
Vďaka, na to prvé som už prišiel sám (ale predsa len som mal čakať na tvoju odpoveď :D 2 minúty stránka nič nezapisovala keďže som to safe:// dal najprv pred názov súboru).
Ten unlink ma napadol vďaka tej dokumentácií Nette...
Každopádne ti ďakujem, funguje to ako má :)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0