Skip to content

peoplepath/workshop-async-php

Repository files navigation

Zadání

Vyhledejte všechny odkazy na zadané stránce. Pokud je nalezený odkaz URL na další stránku vyhledejte odkazy i na ní, atd. až do zadané hloubky.

Instalace

Příklady vyžadují docker-compose pro spuštění Redisu a workerů, dále poskytuje PHP pro spouštění web crawleru.

Stáhněte zdrojové kódy

git clone https://github.com/intraworlds/workshop-async-php.git
cd workshop-async-php

Nainstalujte závislosti

docker-compose run --rm composer install

Spusťte Redis a workera

docker-compose up -d

Pokud nechcete pracovat s dockerem zkuste instalaci bez dockeru.

Příklady

Applikace dostává tři parametry

crawl.php <type> <url> <depth>

Vrať všechny odkazy na stránce www.intraworlds.com

docker-compose run -T php bin/crawl.php sync https://www.intraworlds.com 0

Vrať všecny odkazy na stránce www.intraworlds.cz a odkazy na nich

docker-compose run -T php bin/crawl.php sync https://www.intraworlds.cz 1

Pozor! Opatrně s hloubkou prohledávání. Hodnoty nad 1 jdou už do tisíců odkazů

Typy

  • sync normální synchronní prohlédávání, stránky se načítají jedna za druhou
  • unique stejné jako sync, ale prohledává jen unikátní odkazy
  • worker jednotlivé stránky jsou zpracovány asynchronně v samostaném workeru, počet workerů je možné měnit a tím ovlivňovat rychlost prohledávání, zkuste docker-compose up -d --scale worker=3 viz náš první workshop
  • promise využívá asynchronní HTTP request (pomocí Guzzle). Odešle všechny dílčí requesty najednou a poté postupně čeká na jejich výsledek.

Úkoly

  1. upravte kód workeru tak, aby načítal pouze unikátní odkazy (viz typ unique), tip: využijte Redis, viz náš předchozí workshop, pozor na souběhy v případě více workerů
  2. odkomentujte řádek v souboru bin/worker.php, worker začne s 50% pravděpodobností padat před vykonáním práce (dochází ke zdrátě dat z fronty queue), upravte kód tak aby práce nebyla ztracena

Rada: při změně kódů workeru je nutné worker restartovat pomocí docker-compose restart worker

Tip: Prostudujte Redis command RPOPLPUSH

Bonusové úkoly

  1. upravte kód typu promis tak, aby vracel iterátor místo pole (výsledky budou ihned vidět)
  2. naimplementujte nový typ s použitím knihovny amphp/parallel
  3. naimplementujte nový typ s použitím knihovny react/react nebo amphp/amp
  4. naimplementujte nový typ s použitím rozšíření pthreads

Odevzdání

  • vytvořením pull requestu do tohoto repozitáře

nebo

Řešení

Řešení úkolů a mnoho dalších informací k dispozici na našem IWorkoshopu 27.11.2018 od 18 hodin v Beer Factory. Přijďte, vstup je zdarma!

Instalace bez Dockeru

Pro instalaci bez dockeru je třeba mít nainstalované PHP 7.2, Composer a běžící Redis.

  1. nainstalujte závislosti composer install
  2. změňte hostname ve funkci predis() na Váš Redis, např. tcp://localhost:6379
  3. ve vedlejším terminálu pusťte workera php bin/worker.php

Licence

MIT License

About

Demonstrační příklady pro workshop o asynchronním zpracování v PHP.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages