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 druhouunique
stejné jakosync
, ale prohledává jen unikátní odkazyworker
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í, zkustedocker-compose up -d --scale worker=3
viz náš první workshoppromise
využívá asynchronní HTTP request (pomocí Guzzle). Odešle všechny dílčí requesty najednou a poté postupně čeká na jejich výsledek.
Úkoly
- 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ů - 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 frontyqueue
), 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
- upravte kód typu promis tak, aby vracel iterátor místo pole (výsledky budou ihned vidět)
- naimplementujte nový typ s použitím knihovny amphp/parallel
- naimplementujte nový typ s použitím knihovny react/react nebo amphp/amp
- naimplementujte nový typ s použitím rozšíření pthreads
Odevzdání
- vytvořením pull requestu do tohoto repozitáře
nebo
- zasláním na emailovou adresu workshop@intraworlds.com
Ř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.
- nainstalujte závislosti
composer install
- změňte hostname ve funkci
predis()
na Váš Redis, např.tcp://localhost:6379
- ve vedlejším terminálu pusťte workera
php bin/worker.php