Demonstrační příklady pro workshop o asynchronním zpracování v PHP.
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
bin
src
.gitignore
LICENSE
README.md
composer.json
composer.lock
docker-compose.yml

README.md

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