Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> PHP thread
sasiadstar
post 14.08.2017, 13:29:19
Post #1





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 19.06.2015

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


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?

Ten post edytował sasiadstar 14.08.2017, 13:32:55
Go to the top of the page
+Quote Post
Puszy
post 16.08.2017, 14:41:34
Post #2





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


Z ciekawości, odpal to przez CLI i sprawdź wynik.
Go to the top of the page
+Quote Post
sasiadstar
post 17.08.2017, 11:38:15
Post #3





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 19.06.2015

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


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
Go to the top of the page
+Quote Post
Puszy
post 18.08.2017, 11:53:47
Post #4





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


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.
Go to the top of the page
+Quote Post
sasiadstar
post 18.08.2017, 18:56:08
Post #5





Grupa: Zarejestrowani
Postów: 102
Pomógł: 0
Dołączył: 19.06.2015

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


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.  
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 7.07.2025 - 12:13