Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wielowątkowość w PHP
Forum PHP.pl > Forum > Przedszkole
olechafm
Poszukuję rozwiązań które w skuteczny i niezbyt skomplikowany sposób pozwolą mi na zaimplementowanie w PHP wielowątkowych procesów.

Posiadam aplikację, która jest uruchamiana po stronie CLI. Jest to daemon który realizuje pewne powatarzające się zadania. W tej chwili te zadania są ustawiane w kolejkę i realizowane jedno po drugim, po zakończeniu wszystkich zadań proces rozpoczyna się od nowa. Rozwiązanie takie uzależnia sukces wszystkich zadań od każdego z nich z osobna.

Potrzebuję rozwiązania, które pozwoli mi na stworzenie procesu nadrzędnego, który będzie pilnował podprocesów a w każdym podprocesie będzie realizowane jedno zadanie i procesy będa mogły działać równolegle i niezależnie od siebie, komunikując się tylko z procesem nadrzędnym informując o swoim stanie, przebiegu zadań itp.

Rozwiązanie musi działać pod Windowsem.
fonfi
Hej,
Na Windowsie nie ma możliwości używania wątków. Jak zostało napisane w dokumentacji PHP (http://www.php.net/manual/en/intro.pcntl.php):
"Note: This extension is not available on Windows platforms."

Jedynym znanym mi rozwiązaniem, realizującym taką funkcjonalność w "zbliżony" sposób, do odpalanie z głównego skryptu innego skrypu-workera, za pomocą: WScript.Shell.

  1. while (true)
  2. {
  3. if (need_to_run_new_worker)
  4. {
  5. $WshShell = new COM("WScript.Shell");
  6. $oExec = $WshShell->Run("\"C:\\Program Files\\Php\\php-win.exe\" worker.php parameter1 parameter2", 0, false);
  7. }
  8. sleep(1);
  9. }


Powyższe odpali proces php-win.exe "w tle", bez dodatkowego okienka konsoli. Oczywiście warunki w jakich jest konieczność odpalania workera musisz sobie określić, żeby nie odpalał Ci się w każdym przebiegu pętli while.
olechafm
mam świadomość, dlatego też szukam bibliotek zewnętrznych które moga współpracować z PHP a niekoniecznie być napisanymi w tym jezyku i załatwiać pewne kwestie związane z wątkami, rozwiązanie z procesem w tle mnie niezbyt satysfakcjonuje gdyż zależy mi na kontroli statusu procesu w procesie nadrzędnym itp.

znalazłem coś takiego jak biblioteka ZeroMQ która robi np. coś takiego:
  1.  
  2. <?php
  3. /*
  4. * Multithreaded Hello World server. Uses proceses due
  5. * to PHP's lack of threads!
  6. * @author Ian Barber <ian(dot)barber(at)gmail(dot)com>
  7. */
  8.  
  9. function worker_routine() {
  10. $context = new ZMQContext();
  11. // Socket to talk to dispatcher
  12. $receiver = new ZMQSocket($context, ZMQ::SOCKET_REP);
  13. $receiver->connect("ipc://workers.ipc");
  14.  
  15. while(true) {
  16. $string = $receiver->recv();
  17. printf ("Received request: [%s]%s", $string, PHP_EOL);
  18.  
  19. // Do some 'work'
  20. sleep(1);
  21.  
  22. // Send reply back to client
  23. $receiver->send("World");
  24. }
  25. }
  26.  
  27. // Launch pool of worker threads
  28. for($thread_nbr = 0; $thread_nbr != 5; $thread_nbr++) {
  29. $pid = pcntl_fork();
  30. if($pid == 0) {
  31. worker_routine();
  32. exit();
  33. }
  34. }
  35.  
  36. // Prepare our context and sockets
  37. $context = new ZMQContext();
  38.  
  39. // Socket to talk to clients
  40. $clients = new ZMQSocket($context, ZMQ::SOCKET_ROUTER);
  41. $clients->bind("tcp://*:5555");
  42.  
  43. // Socket to talk to workers
  44. $workers = new ZMQSocket($context, ZMQ::SOCKET_DEALER);
  45. $workers->bind("ipc://workers.ipc");
  46.  
  47. // Connect work threads to client threads via a queue
  48. $device = new ZMQDevice($clients, $workers);
  49. $device->run ();
  50.  
  51.  



source: http://zguide.zeromq.org/php:all#Multithreading-with-MQ


ale tu znowu jest używany $pid = pcntl_fork();
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.