Strona 1 z 1

Długotrwałe kolejki priorytetowe

: 07 kwie 2013, 17:08
autor: alojzikftp
Cześć
Piszę program, który ma zawierać dwie kolejki priorytetowe. Ma być szybki, bo przetwarza duże ilości danych, a także kolejki muszą być sprawne przez wiele godzin - użytkownicy będą podawali dane na stronie WWW, i te dane mogą na tej kolejce trochę czekać.

Pierwszym pomysłem jest C++ i po prostu program zatrzyma się czekając na dalsze dane, tylko że nie wiem, jak z poziomu PHP "podłączyć" się do programu, podać mu dane i się rozłączyć.
Drugim pomysłem jest zastosowanie kolejek linuxowych (jeśli istnieją :)). Tylko że tu pojawia się problem przeciążenia operatora itp.
Więc pytania:
1. Jak Wy byście to zrobili
2. Jak podawać dane do pracującego programu z PHP, albo czegoś innego. (Po prostu dane ze strony WWW wepchnąć na kolejki).
3. Czy istnieją kolejki w systemie, albo jakiś program, ale zależy mi na czymś stabilnym.

Mam nadzieję że ktoś zrozumie i pozrawiam

Re: Długotrwałe kolejki priorytetowe

: 09 kwie 2013, 13:29
autor: JSokol
Chodzi Ci o coś w stylu "X użytkowników zleca Y zleceń które mają się kolejno wykonywać" - czy dobrze rozumiem?
Tego typu problem możesz rozwiązać tak, że "zadania" będą przekazywane do wybranego katalogu w formie odpowiednio spreparowanego XMLa, a w tle będzie chodził sobie programik napisany w C++, który będzie sprawdzał czy są zadania w katalogu, jeśli tak to bierze pierwsze z góry do wykonania i po wykonaniu znów sprawdza czy są jeszcze jakieś, jeśli nie ma żadnych, to usypia się na określony czas i potem ponawia sprawdzenia.

Re: Długotrwałe kolejki priorytetowe

: 09 kwie 2013, 13:40
autor: ethanak
kolejki systemowe raczej tu się nie sprawdzą z uwagi na niewielką pojemność. ja bym to zrobił na jakiejś bazie danych gdzie skrypt w php pcha dane do bazy, a jakiś program to sobie cyklicznie czyta. sygnalizację nowych danych można zrobić choćby przez kill albo jakieś sockety (nie wiem czy php obsługuje abstract unix sockets, ale to by było najbezpieczniejsze rozwiązanie).

Re: Długotrwałe kolejki priorytetowe

: 09 kwie 2013, 15:47
autor: tloszabno
Możesz użyć pod C++ socketów ( bsd ) i normalnie nasłuchiwać na jakiś "swoim" porcie na jakieś żądanie. Myślę, że z poziomy php się do tego wtedy spokojnie dostaniesz.

Re: Długotrwałe kolejki priorytetowe

: 09 kwie 2013, 16:10
autor: alojzikftp
Dzięki za odpowiedzi.
Dobrze mnie zrozumieliście. Bazę danych, pliki i sockety brałem pod rozwagę. Przymierzałem się do socketów C++, ale w sumie to dość trudne jeśli nie miałem z tym styczności wcześniej.
Znalazłem jednak coś takiego jak named pipe.

Kod: Zaznacz cały

int main()
{
        int pipe = open("pipe", O_RDONLY);
        char buffer[SIZE];
        for(int i=0;i<SIZE;i++)
        {
                buffer[i] = '\0';
        }
        read(pipe, buffer, SIZE);
        cout << buffer;
}
i tworzę sobie w bashu

Kod: Zaznacz cały

mkfifo pipe
To tak dla przykładu jak czytać, a w PHP po prostu użyje system(echo "text" > pipe). Wiecie jak to zrobić ładniej, bez wstawiania '\0', bo inaczej zostaje tam jakiś syf, a nie wiadomo jaka będzie dokładnie długość wejścia?

Bałem się czy pipe nie będzie przypadkiem mieszał danych od dwóch różnych userów wykonujących żądanie jednocześnie, ale
One Linux pipe(7) man page says that pipe capacity is 65536 bytes since Linux 2.6.11 and a single system page prior to that (e.g. 4096 bytes on (32-bit) x86 systems).
wydaje mi się więc, że przesłanie krótkiego komunikatu spokojnie zmieści się w 4096 bajtach strony i nie pomiesza, zgadzacie się?
Pozdrawiam

Re: Długotrwałe kolejki priorytetowe

: 10 kwie 2013, 03:47
autor: ethanak
Ej, czekaj - bo jeśli to są krótkie komunikaty to spokojnie możesz użyć IPC... tyle że jeśli sockety są dla Ciebie za trudne to IPC tym bardziej ;)
Pipy mają te brzydkie właściwości, że się blokują kiedy druga strona sobie gdzieś pójdzie. Radzę jednak poczytać o socketach (man socket, man bind, man listen, man accept) bo to Ci się na 100% w życiu przyda.