Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP thread
Forum PHP.pl > Forum > PHP
sasiadstar
Witam
Mam taki kod testowy
  1. <?php
  2. ini_set('display_errors', 0);
  3. class CheckIpThread extends Thread {
  4. private $ip;
  5. public $data = null;
  6.  
  7. public function __construct ($ip_to_check) {
  8. $this->ip = $ip_to_check;
  9. }
  10.  
  11. public function run () {
  12. $this->data = th($this->ip);
  13. }
  14. }
  15. $threads = [];
  16.  
  17. for($a=0;$a<=1000;$a=$a+100)
  18. {licz($a);}
  19. function licz($co)
  20. {
  21. for($a=0;$a<=100;$a++)
  22. {//echo_($a);
  23. $thread = new CheckIpThread($co+$a);
  24. $threads []= $thread;
  25. $thread->start();
  26. }
  27. foreach ($threads as $thread) {
  28. $thread->join();
  29. }
  30.  
  31. foreach ($threads as $thread) {
  32. echo_($thread->data);
  33. }
  34. }
  35.  
  36.  
  37. function th($wsad)
  38. {return $wsad;//jakies tam obliczenia
  39. }
  40.  
  41. function echo_($tekst,$def=0)
  42. {
  43. flush();
  44. usleep(200);
  45. if($def===0)
  46. {var_dump($tekst);}
  47. if($def===1)
  48. {echo($tekst);}
  49. echo"</br>";
  50.  
  51.  
  52. }
  53. ?>

Kod wypluwa liczby od 0 do 799 i przestaje dalej sie wykonywać cały czas przegladarka "kręci" i na tym sie temat kończy.
O co kaman?
Puszy
Z ciekawości, odpal to przez CLI i sprawdź wynik.
sasiadstar
Hmmm
CLI działa.
Poszedłem za ciosem edge działa.
Innych przeglądarek nie mam.
No ciekawe.

Aktualizacja
Zwiększyłem wartość do wyliczenia i wywaliło błąd a po powrocie do 2000 jest to samo.
PHP Fatal error: Uncaught exception 'RuntimeException' with message 'pthreads has detected that the CheckIpThread could not be started, the system lacks the necessary resources or the system-imposed limit would be exceeded' in C:\xampp\htdocs\test\Benchmark.php:34
Stack trace:
#0 C:\xampp\htdocs\test\Benchmark.php(34): Thread->start()
#1 C:\xampp\htdocs\test\Benchmark.php(22): th_(900)
#2 {main}
thrown in C:\xampp\htdocs\test\Benchmark.php on line 34
Puszy
U mnie na produkcji jest jakoś tak ustawiony Apache że strona ładuje się 30 sekund i zawracany jest bodajże 500, nie idzie tego zmienić od strony kodu. Dlatego wiele akcji musiałem przerzucić na CLI i odpalać CRONem. Wygląda na to że nie starcza zasobów serwera.
sasiadstar
No właśnie a wiem że da się to zrobić tylko sie używa jakichś workerów pooli i czego tam jeszcze, poprostu nie wiem jak to zrobić.
Znalazłem taki kod który działa tak jak bym tego chciał ale nie wiem jak to poprzerabiać niestety za tepy jestem w klasach.
Chciałbym żeby w tym miejscu
  1. for($a=0;$a<=10000;$a++)
  2. {$pool->submit(new MyWork($a));}
  3. //return wynik
  4.  
  5.  

mozna bylo miec wynik wszystkich operacji a nie tam gdzie jest echo
  1. <?php
  2. ini_set('display_errors', 0);
  3. ini_set('default_socket_timeout', 3);
  4. class MyWork extends Threaded {
  5.  
  6. public $name;
  7.  
  8. public function __construct($name) {
  9.  
  10. $this->name = $name;
  11. }
  12.  
  13. public function run() {
  14. echo_( $this->name );
  15.  
  16. }
  17.  
  18. }
  19.  
  20. class MyWorker extends Worker {
  21. public function run() {}
  22. }
  23.  
  24. $pool = new Pool(50, \MyWorker::class);
  25. for($a=0;$a<=10000;$a++)
  26. {$pool->submit(new MyWork($a));}
  27.  
  28. $pool->shutdown();
  29.  
  30. function echo_($tekst,$def=0)
  31. {
  32. flush();
  33. //usleep(200);
  34. if($def===0)
  35. {var_dump($tekst);}
  36. if($def===1)
  37. {echo($tekst);}
  38. echo"</br>";
  39.  
  40. }
  41. ?>
  42.  
  43.  
  44.  
  45.  
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.