Prskavčí blog

Apr 10, 2011

PHP a RabbitMQ

V poslední době se objevilo hodně článků o RabbitMQ a připravuje se kniha kde většina příkladů je v PHP. Připravil jsem malou demonstraci jak se message queue dobře využit. RabbitMQ je napsaný v Erlangu podobně jako CouchDB a hodí ke zpracování dávkových úloh. V demonstraci využívám knihovnu wkhtmltopdf která umí zpracovat html stránku na PDF, používá k tomu webkit jádro.

require_once APPLICATION_PATH . ‘/models/Rabbit.php’; /**

  • /Ensure library/ is on include_path */ set_include_path(implode(PATH_SEPARATOR, array( realpath(APPLICATION_PATH . ‘/../library’), get_include_path() )));

/** Zend_Application */ require_once ‘Zend/Application.php’;

// Create application, bootstrap, and run $application = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . ‘/configs/application.ini’ ); $application->getBootstrap()->bootstrap();

$config = new Zend_Config_Ini(APPLICATION_PATH . ‘/configs/application.ini’, APPLICATION_ENV);

$r = new Application_Model_Rabbit($config->rabbitmq); $r->consumer(); Tento script musí běžet na serveru, kde se zpracovává vlastní požadavek. Model potom volá metodu, která se vykoná.

Vlastní aplikace je potom jednoduchá

a volá se producer, který invokuje RabbitMQ

Demo u mne funguje velmi dobře, nevím jak na jiných platformách, zkoušel jsem to jen na Macu. Na linuxu by to mělo fungovat obdobně. Jen pro webovou aplikaci by bylo vhodné použít jiný systém notifikace pro webovou aplikaci. Nenašel jsem jak například předávat notifikace přes RabbitMQ, ale pokud někdo víte jak to elegatně udělat přidejte to do komentářů.

Veškerý zdrojový kód je dostupný na githubu.

Zvolil jsem jednoduché jednosměrné řešení bez implementace RPC, kde by se dala pro notifikaci použít reply fronta. Ale myslím, že to celkem stačí pro vetšinu dávkových aplikací jako jsou logovaní, upload souborů i generovaní PDF. Nic nebrání nahradit moji notifikaci například posláním linku ke stažení výsledného PDF apod. Příklad by šel pomocí RPC vylepšit na notifikaci přímo v aplikaci. Pro implementaci RPC lze například použít Thumper.