Wpis z mikrobloga

#programowanie #php Chciałbym, aby skrypt w PHP przetwarzał maks. 6 plików jednocześnie (cpu 8 rdzeni). Zdarza się jednak, że użytkownicy wysyłają jednocześnie więcej plików co doprowadza nierzadko load na poziom 300 i wyższe. Macie jakąś teorię jak to dobrze kolejkować? Cron może i byłby dobry, gdy nie spore opóźnienie (min. 1 minuta, a user generalnie nie może czekać na gotowy plik więcej niż ok. 10 sekund - chyba, że serwery są bardzo obciążone, wtedy natychmiast w kolejce). Pytanie więc jak w takim wypadku rozsądnie zarządzać obciążeniem serwera?
  • 9
@DOgi: Taki pierwszy pomysł to dopisywać do kolejki w bazie nowe pliki i mies skrypt, ktory jest zapetlony i pobiera najstarsze piiki do parsowania wlasnie z takim limitem jaki ustawisz.

Edit: po przeparsowaniu zapisac taka informacje i na froncie co sekunde sprawdzac status, cos takiego wymyslilem na kacu, morze pomorze
Ja ze swojej strony polecam Gearman Job Server. Bardzo fajnie współpracuje z PHP i innymi jezykami. Możesz kolejkować zadania, wykonywać je w tle, nadawać priorytety. Fajne ogólnie :)
@rysi3k_: W tym przypadku zamiast pytać bazy można wcześniej ustalić nazwę pliku wynikowego i sprawdzać w PHP czy taki plik już istnieje czy tworzyć jakiś plik statusu - ominiesz problem z bazą, może nie do końca eleganckie ale powinno zadziałać
@JestemKaspi: niby dobre, ale tylko do czasu pojawienia się błędu w czasie przetwarzania. Czasem któryś skrypt ma sega (albo coś innego, typu połączenie mysql sobie odchodzi, plik ma złe nagłówki, przekroczenie dostępnej pamięci) i wtedy tracę kontrolę nad stanem procesu. User nie miałby informacji co się stało z jego plikiem.
@JestemKaspi: No jakieś wyjście to jest, wtedy zwiększasz operacje dyskowe :D

@DOgi: wykorzystywałem go do przesyłania do zewnętrznego serwisu poprzez API dużej porcji danych (140tys wierszy) co noc. Używałem 3 maszyn na każdej po 10-15 workerów gearmana, dzięki temu całość trwała około godziny.