2012-05-04 17 views
6

Mamy serwer FreeBSD z sambą, do którego pracownicy kopiują pliki obrazów, które następnie są przesyłane na nasze serwery sieciowe (w ten sposób nie muszą się oni martwić o ftp). Czasami, jeśli skrypt wysyłania działa w tym samym czasie, co kopiowanie plików, może przesłać niekompletny plik.Czy istnieje lepszy sposób sprawdzenia, czy plik jest zapisywany?

Naprawiliśmy to, pobierając listę plików wraz z rozmiarami plików, a następnie czekając 5 sekund i ponownie sprawdzając rozmiary plików. Jeśli rozmiary są zgodne, to zapisz je do przesłania, jeśli się nie zgadzają, sprawdzają ponownie za 5 sekund.

To wydaje się dziwnym sposobem sprawdzenia, czy pliki są zapisywane. czy istnieje lepszy, prostszy sposób robienia tego?

+0

'if (! Flock ($ fp, LOCK_EX | LOCK_NB)) {// plik jest zablokowany do zapisu'? – DaveRandom

+0

'flock()' może? –

+0

nie jestem pewien, czy 'flock()' i zamki Samaba będą się nawzajem widzieć niezawodnie - miał kilka problemów tam lata temu –

Odpowiedz

2

Użyj flock funkcję http://php.net/flock - pisząc plik uzyskać wyłączną blokadę flock($handle, LOCK_EX), po to jest napisane zwolnić blokadę flock($handle, LOCK_UN).

Skrypt do przesłania może również spróbować uzyskać wyłączną blokadę zapisu, jeśli uda się przesłać plik, inaczej nie.

EDIT: Niestety, zapomniałem o użytkowników kopiując pliki na serwer przez sambę ... Więc nie ma przestrzeni do wykorzystania podczas kopiowania flock ... Ale skrypt wysyłania mógł nadal korzystać flock($handle, LOCK_EX), aby zobaczyć, jeśli się powiedzie, czy nie.

2

Polecam shell_exec() smbstatus (1), np. smbstatus -LB, aby sprawdzić zablokowane pliki:

0

Napisz skrypt, aby skopiować pliki do folderu tymczasowego na serwerze Samby, a następnie, po całkowitym skopiowaniu i przepłukaniu, przenieść (np. Rozłączyć/połączyć, nie kopiować ponownie), folder przesyłania.

Powiązane problemy