Mirin webspace

Nejbohatší život má ten, kdo žije s minimem nároků

31. 10. 2009 PHP

PHP v multithreaded prostředí

Dnes jen taková drobnost na kterou se při vývoji aplikací v PHP docela zapomíná. Je to způsob jakým PHP spolupracuje s web serverem na obsluze více souběžných požadavků pokud je použito jako modul. Sice to není věc, která je bezpodmínečně nutná k tvorbě PHP aplikací, ale přesto je dobré mít alespoň trochu tušení o co jde. Bude to spíš z trochu laického pohledu, o multiprocessingu toho zas tak moc nevím.

PHP podobně jako mnoho software, které má své kořeny v unixu/linuxu spoléhalo při zpracování více úloh na více procesů - zjednodušeně na fork. Stejně tak starší verze nejpoužívanějšího web serveru Apache pracovaly tímto způsobem při obsluze více HTTP požadavků. Pokud tedy předpokládáme PHP jako modul web serveru (o jiném způsobu zde nebude řeč), tak každý požadavek znamená nový proces více méně izolovaný od ostatních.

Časem se stále více uplatňoval multithreading - vlákna. Určitě velký vliv měly MS Windows, kde se vlákna používají v mnohem větší míře než v linuxu, něco jako fork tam ani není. Web servery se přizpůsobily a začaly implementovat způsob obsluhy více HTTP požadavků přes vlákna. Při startu web serveru se tedy spustí jen jeden proces a na obsluhu přicházejících požadavků se používají vlákna. Např. Apache na windows případně IIS fungují pouze takto. PHP se muselo tedy také přizpůsobit. Přizpůsobilo, ale zdá se mi, že ne tak úplně docela.

PHP pokud funguje v multithread prostředí web serveru se chová totiž tak trochu podivně. Ano, web server a potažmo PHP modul jsou jedním procesem s mnoha vlákny na obsluhu, ale PHP samotné se vzhledem k uživateli a jeho skriptům v těchto vláknech chová jako samostatný proces. Nemůžeme tedy v PHP vytvořit objekt, který sdílí více vláken a tím i více požadavků najednou. To je naprosto zásadní rozdíl od toho, jak fungují web aplikace v Javě případně .NET. Tam se jednou aplikace nastartuje a statický a globální kontext je pak přístupný pro všechny vlákna (HTTP požadavky) jednoho procesu - jak jsem pochopil z různých internetových java a .net blogů srovnávajících tyto technologie.

Jak se mi zdá, asi by to šlo. PHP Extension API obsahuje sekci jak se zavěsit na událost startu a ukončení modulu. Dokonce nedávno se objevila extension, která uchovává informace o session v paměti procesu pod kterým je spuštěn web server. Nevím přesně proč nějakým způsobem vývojáři PHP nezpřístupní tuto možnost i do user space skriptů. Ano, práce by to bylo dost, musel by se řešit přístup a změna obsahu těchto globálních objektů z jednotlivých vláken, ale to by vývojáři PHP jistě zvládli. Důvod bude nejspíše ten, že by se tím dost podstatně změnil deployment aplikací a zásadně by se změnila práce se statickými a globálními objekty. Tím by PHP přišlo o tu jednoduchost s jakou se aplikace dají vyvíjet a udržovat a to by mohl být také konec PHP.


Komentáře (0)

Komentáře jsou uzavřeny.