Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Kolejka w PHP,
Prph
post
Post #1





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Dawno mnie tu nie było (IMG:style_emoticons/default/smile.gif)

Forumowicze, problem z kolejką w PHP. System, który tworzę przetwarza dane co minutę (z CRONa). Niestety uruchomienie pojedynczego procesu np, przetwarzaj.php nie kończy się w 1 minucie, ponieważ przetwarzanie danych może trwać np. 2 mninuty dla pojedynczego rekordu bazy danych, a rekordów jest np. 20. Teoretycznie szeregowe uruchomienie przetwarzania zajmie więc 40 min. Każdy przetwarzaj.pho bierze z bazy zatem 1 rekord i tylko taki mieli.

Moje pytanie: w jaki sposób napisać kolejkę, która poprawnie przetworzy takie dane? Wywołać z crona 20x ten sam przetwarzaj.php? Zanim proces zacznie wykonywać swoją pracę, ustawia na rekordzie bazy, że jest on przetwarzany, więc inny proces weźmie kolejne dane.

Spotkaliście się z podobnym problemem, macie pomysły?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Prph
post
Post #2





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Zrobione za pomocą forkowania. Aż miło patrzeć jak to działa (IMG:style_emoticons/default/smile.gif)

  1.  
  2. $sql ='tutaj selekt pobierający listę do wysłania...';
  3.  
  4. $res = db_query($sql);
  5. $queue = db_fetch_all($res);
  6.  
  7. if(!count($queue)) {
  8. echo "Nothing to send\n";
  9. }
  10.  
  11. $numOfPids = 0;
  12. $processes = array();
  13. foreach($queue as $entry) {
  14.  
  15. $processes[$numOfPids] = pcntl_fork();
  16. if($processes[$numOfPids]) { // this is parent process
  17. $numOfPids++;
  18. }
  19. else {
  20.  
  21. echo "In $numOfPids process, sending {$entry['id']}\n";
  22.  
  23. // ok we are in the child
  24. // send data
  25.  
  26. // have to connect again
  27. db_connect('...');
  28.  
  29. $update = array('status' => 'in_process');
  30. db_update('...'));
  31. send_data($entry); // funkcja wysyłająca
  32.  
  33. echo "Process $numOfPids sent data\n";
  34.  
  35. exit();
  36. }
  37. }


Wynik:

  1. In 0 process, sending 5790
  2. In 1 process, sending 5791
  3. In 2 process, sending 5797
  4. Process 0 sent data
  5. Process 2 sent data
  6. Process 1 sent data
  7. It's done!
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 5.10.2025 - 00:23