Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Kolejkowanie dostepu do plikow
Forum PHP.pl > Forum > Przedszkole
axxxon
Witam!
Chciałbym się dowiedzieć czy istnieje jakiś efektywny sposób na kolejkowanie skryptom dostępu do pliku.
Ogólnie moja sytuacja wygląda tak:

Mam 4 skrypty wykorzystujące jeden plik, skrypty mogą działać równocześnie, ale nie muszą, każdy skrypt ma zmienna która mówi o pewnej kolejności
Obecnie jeśli plik jest wykorzystywany każdy ze skryptów ma ustawiony
  1. usleep(500000);

jednak w takim wyjściu skrypt o id np 3. odczytuje plik wcześniej niż ten o id 2.

Dodatkowym utrudnieniem jest to ze skrypty nie są zawsze uruchamiane wg. kolejności:
czyli np. 5 razy pod rzad uruchamiany jest skrypt o id 1, potem uruchamiane są równocześnie skrypty 1,2,3, nastepnie uruchomiony 2-krotnie jest skrypt 2 i jednokrotnie skrypt 1, a na samym końcu skrypt 3.

Ogólnie chciałbym aby w czasie jednoczesnego uruchomienia skrypty uzyskiwały dostęp do pliku wg kolejności, a nie w wersji 1-3-2 lub 3-1-2.
zbig
Witam !

Jedyne co mi przychodzi do glowy jako pseudo optymalne rozwiaznie jest uzycie pcntl_fork.
Zasymulowanie Threadow ktore dostana dostep do pliku po zwolnieniu przez inny watek.

Ale zycze Ci wiele szczescia przy pracy php z watkami.

Pozdrawiam
yevaud
poszedlbym w http://memcachedb.org/memcacheq/
axxxon
Dzięki za podane rozwiązania, są bardzo interesujące, niestety żadnego z nich w projekcie wykorzystać sciana.gif
muszę działać na w miarę czystym php'ie plus odrobina mysql...
i mam pytanie - da się pobrać funkcja php'ową czas uruchomienia się samego skryptu z czegoś a'la logów systemowych...? tzn. nie ile on już działa tylko kiedy zaczął działać
CuteOne
UP: to jest czysty PHP wink.gif hmm może coś prostszego..

1. Plik do którego dostęp mają inne pliki niech nosi nazwę config.php
2. Dla każdego pliku, który ma do niego dostęp nadaj odpowiednie ID np.
aaa.php - id = 1
ccc.php - id = 2
bbb.php - id = 3

3. Utwórz plik pomocniczy np. kolejka.txt a w nim:
Kod
1

4. W każdym pliku dodaj:
  1. $file_id = 2; // dla każdego pliku inny ID - tak jak to wyżej napisałem
  2.  
  3. while(1) {
  4.  
  5. $handler = file_get_contents('kolejka.txt');
  6. if($handler == $file_id) {
  7.  
  8. $fid = ($file_id+1 > 3) ? 3 : $file_id+1; //ponieważ mamy 3 pliki max. ID nie może przekroczyć tej wartości
  9.  
  10. include 'config.php'; //includujemy plik
  11.  
  12. file_put_contents('kolejka.txt', $fid); // dzięki temu kolejny plik będzie mógł użyć config.php
  13. break;
  14. }
  15. else {
  16.  
  17. sleep(1); //czekamy sekundę i wznawiamy pętle
  18. }
  19. }


To samo można zrobić na bazie danych smile.gif

ps. przed rozpoczęciem pętli dodaj set_time_limit(0); żeby ino skrypt nie przestał działać po 30 sekundach wink.gif

Co do startu pliku.. na początku skryptu wstaw:

  1. file_put_contents('start.txt', time());
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.