• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Php threads problem z wielowątkowością.

Object Storage Arubacloud
0 głosów
335 wizyt
pytanie zadane 18 sierpnia 2017 w PHP przez sasiadstar Nowicjusz (160 p.)

Witam 

Chciałem użyć wielowątkowości w PHP 5.6.3

Zainstalowałem wszystko i napisałem skrypt.

Wszystko pięknie ładnie ale niestety wywala mi błąd

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

jak rozwiązać problem "usuwania" wątków tak aby mozna wykonywać np po 100 zadań jednocześnie w nieskończoność i aby skrypt usuwał te juz wykonane.

Może potrzeba czegoś innego niz czysty php thread?

<?php
$flaga=0;
//ini_set('memory_limit', '2M');
//set_time_limit(0);
//ini_set('display_errors', 0);
class CheckIpThread extends Thread {
    private $ip;
    public $data = null;
    public function __construct ($ip_to_check) {
       $this->ip = $ip_to_check;
	   
    }

    public function run () {
       $this->data = th($this->ip);
	   $this->kill;
    }
	
}

for($a=0;$a<=2000;$a=$a+100)//dowolna wartośc wykonywana w krokach co 100 wątków
{$zm[]=th_($a);

echo_($zm);
unset($zm);
}

function th_($co)
{$threads = [];
	for($a=0;$a<=100;$a++)
	{

$thread = new CheckIpThread($co+$a);

$thread->ip=($co+$a);
	
    $threads []= $thread;
    $thread->start();
$flaga=1;	
}
foreach ($threads as $thread) {
    $thread->join();
}
$zm=[];
foreach ($threads as $thread) {
    $zm[]=($thread->data);
}
unset($thread);
//$thread->exit();
return $zm;
}


function th($wsad)
{return $wsad;//
}

function echo_($tekst,$def=0)//LIVE VIEV
{
       ob_flush();
       flush();
        //usleep(200);
	if($def===0)
		{var_dump($tekst);}
	if($def===1)
		{echo($tekst);}
		echo"</br>";

ob_end_flush();
ob_clean();		
}
?>

 

3 odpowiedzi

0 głosów
odpowiedź 18 sierpnia 2017 przez Boshi VIP (100,240 p.)
Zmień język na jave/c#/python, PHP nie jest dostosowany do wielowątkowości na razie a używanie pozornych narzędzi i tak skończy się męczarnia.
komentarz 18 sierpnia 2017 przez sasiadstar Nowicjusz (160 p.)
Powiem szczerze że nie chce mi się uczyć czegoś nowego. Jedynie do czego mi to potrzebne to sprawdzanie kilkudziesięciu ip w jednym podejściu bo po jednym to by zajęło całe wieki. tak naprawdę nie chce się uczyć jakichś cudów bo tylko chce zautomatyzować sobie jedną rzecz i do tego mi to będzie wyłącznie potrzebne. Mogę łatwo iść na skróty i uruchomić kilkadziesiąt skryptów z CLI ale szukam bardziej optymalnego rozwiązania.

A wiem że się da tylko nie wiem jak to zrobić żeby te wątki były usuwane i nie przekraczały limitu systemu.
komentarz 18 sierpnia 2017 przez PiotrBajer Mądrala (5,300 p.)
Wydaje mi się, i z doświadczenia wiem, że odpalanie skryptów PHP z linii komend jest wydajniejsze. Miałem kiedyś podobne zadanie, tyle że polegało na podmianie opisów na kilku tysiącach aukcji Allegro. Program napisany w ten sposób co próbujesz przetwarzał wszystkie aukcje w ok. 16 godzin, odpalenie kilkudziesięciu skryptów PHP z konsoli poradziło sobie w 4 godziny.
komentarz 18 sierpnia 2017 przez sasiadstar Nowicjusz (160 p.)

Woe jednak za pomoca threds

Znalazłem taie coś i wydaje mi się że to jest to o co mi chodzi tylo nie wiem jak zwrócić te dane do jakiejsc tablicy

<?php
ini_set('display_errors', 0);
set_time_limit(0);
ini_set('default_socket_timeout', 3);
class MyWork extends Threaded {

    public $name;

    public function __construct($name) {
    
        $this->name = $name;
    }

    public function run() {       
            echo_( $this->name );       
       
    }

}

class MyWorker extends Worker {
    public function run() {}
}

$pool = new Pool(50, \MyWorker::class);
for($a=0;$a<=10000;$a++)
{$pool->submit(new MyWork($a));}

$pool->shutdown();

function echo_($tekst,$def=0)
{
       ob_flush();
       flush();
        //usleep(200);
	if($def===0)
		{var_dump($tekst);}
	if($def===1)
		{echo($tekst);}
		echo"</br>";

ob_end_flush();
ob_clean();		
}
?>

 

komentarz 18 sierpnia 2017 przez Boshi VIP (100,240 p.)
Które dane? precyzuj
komentarz 18 sierpnia 2017 przez sasiadstar Nowicjusz (160 p.)
echo_( $this->name ); 

Chciałbym to zamiast echować dodawać do tablicy i zwrocic jak wszystkie 50 watków zakonczy "bieg".

for($a=0;$a<=10000;$a++)
{$wynik[]=$pool->submit(new MyWork($a));}

//wynik

Tu wrzucamy dane do przetworzenia a po przetworzeniu chcialbm dostac wynik tak jak w pierwszym przykladzie.

0 głosów
odpowiedź 18 sierpnia 2017 przez maly Nałogowiec (37,190 p.)
Pomijając fakt że nierozumiem co ten kod robi to czemu wątek zabija sam siebie(kill)?
0 głosów
odpowiedź 18 sierpnia 2017 przez rafal.budzis Szeryf (85,260 p.)
Masz ten kod bez wątków (wersje wolną)? Może dało by się go inaczej zoptymalizować. Próbowałeś dane wrzucić najpierw do jakiejś bazy danych i wykonać sobie takie sprawdzenie bez języka programowania z udziałem tylko kilku zapytań?
komentarz 18 sierpnia 2017 przez sasiadstar Nowicjusz (160 p.)
$this->name = $name;
//ma być get_headers($name);

tu nie ma żadnej optymalizacji kod ma sprawdzać adresy IP (duzo adresów) .

To ma byc taki boot szukający bardzo specyficznych urządzeń w internecie i nic ponadto żadnego skanowania portów.

Jezeli znajdzie ma dodać do bazy danych i na tym koniec pracy skryptu.

Ale do sprawnego działania potrzeba przeszukiwać więcej niż jeden ip na raz.

Podobne pytania

0 głosów
2 odpowiedzi 1,299 wizyt
+1 głos
1 odpowiedź 1,359 wizyt
pytanie zadane 18 kwietnia 2015 w C# przez Dorion300 Szeryf (90,250 p.)
0 głosów
1 odpowiedź 1,589 wizyt
pytanie zadane 7 czerwca 2017 w PHP przez Majcon Nowicjusz (200 p.)

92,556 zapytań

141,404 odpowiedzi

319,563 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...