[php] operacje na plikach txt

0

Użyłem TYCH funkcji z faq do operacji na plikach txt.
Gdy sprawdzam ich działanie na 1 komputerze to działają idealnie, ale gdy używam ich na stronie, gdzie siedzi kilkaset osób, to się oczywiście rozjeżdżają, kasują zawartość pliku txt itp.
Wiem, że najlepiej użyć bazy np. mysql, ale nie mogę, bo mam ją strasznie wolną i spowolniło by to stronę, ale mniejsza o to.

Czy da się jakoś przerobić te funkcje, żeby działały dobrze przy większej ilości użytkowników ? (głównie chodzi mi o UpdateLine i InsertLine)

0

Można pobawić się w blokowanie <ort>plikó </ort>czyli jeśli ktoś chce zapisac to bplokuje plik, zapisuje i odblokowuje. (choć obawiam się że takie zabawy będą wcale nie szybsze od "wolnej" bazy danych [a co to za baza że wolna ?])

0

blokowanie to tam jest - pewnie chodzi o to że w tych funkcjach podajesz nazwę pliku a nie wskaźnik do otwartego już i za każdym razem jest otwierany więc zmniejsza to wydajność i jednocześnie powoduje błędy bo w między czasie kiedy zawartość pliku jest odczytana i analizujesz np którą linię skasować a dopiero potem podajesz jej index do funkcji kasującej to ktoś (inny user) może już poprzez inny skrypt zmodyfikować plik i podany index będzie się dla pierwszego usera nie zgadzał i usunie przykładowo złą linię

powiem że te funkcje teraz są tak napisane że ciężko jest jedną linijką je zmodyfikować żeby dobrze działały podczas obciążenia ale można się pobawić - napisać wsio od początku ale można dużo przepisać - najlepiej żeby plik wejściowy na początku zablokować, odczytać zawartość do tablicy i nie podawać jako argument nazwy pliku tylko wskaźnik do tej tablicy z zawartością a dopiero na samym końcu zapisać do pliku tablicę, odblokować i zamknąć plik - to powinno zwiększyć stabilność i wydajność skryptu. Przy okazji operowanie na tablicy nie wymaga dodatkowych tego typu funkcji bo w php jest szereg funkcji wstawiających, kasujących, przesuwających etc. linie w tablicy.

0

podam Ci rozwiązanie na przykładzie tej funkcji

function file_DeleteLine ($filename, $index) {
// jeśli czytanie jest w tym miejscu, to odczytujesz być może niewłaściwą zawartość pliku

    $fp = fopen ($filename, "w");
    flock($fp, LOCK_EX);

// czytanie musi się odbywać w tym miejscu
    $file = file ($filename); // ten kawałek kodu musisz poprawić, żeby wczytał zawartość pliku nie na podstawie nazwy, ale wskaźnika

    for( $w = 0; $w < count($file); $w++ )
    {
      if ($index <> $w)
        fwrite ($fp, $file[$w]);
    }
    flock($fp, LOCK_UN);
    fclose($fp);
  }
  

możesz też to zrobić na semaforach, wtedy nawet nie potrzebujesz blokować pliku funkcją flock (funkcje sem_*).

1 użytkowników online, w tym zalogowanych: 0, gości: 1