LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> Kompilátor PHP - projekt Phalanger

Projekt Phalanger je kompilátor jazyka PHP pro .NET.

11.12.2006 15:00 | Tomáš Petříček | Články autora | přečteno 8227×

Co je Phalanger?

Projekt Phalanger je kompilátor jazyka PHP pro .NET a od verze 2.0 i pro platformu Mono. Projekt vznikl původně pouze pro .NET, ale jedním z cílů verze 2.0 je plná podpora pro Mono a běh na serveru Apache (pomocí rozšíření mod-Mono). Phalanger je vyvíjený pod Shared Source licencí, která umožňuje jeho úpravu, rozvoj i redistribuci včetně komerčního užití. Více informací o projektu, včetně zdrojových kódů a binární distribuce poslední verze naleznete na webu projektu.

PHP je dynamický jazyk a tak by jeho kompilace do nativního kódu byla nesmírně složitá. I svým návrhem (tím, že se jedná o skriptovací jazyk) je mnohem vhodnější pro interpretaci, tak jak to dělá standardní PHP. Phalanger se snaží volit zlatou střední cestu - tedy to co je možné snadno zkompilovat, to se zkompiluje a tam, kde to možné není tam se provede kompilace až za běhu (například při použití funkce eval).

Čím je Phalanger zajímavý?

Cílem Phalangeru je za prvé co nejlepší kompatibilita se stávajícími PHP aplikacemi, co nejvyšši výkon zkompilovaného kódu a rozšíření PHP tak, aby jej bylo možné použít i pro vývoj aplikací založených na platformě Mono (včetně použití libovolných knihoven, které jsou na Monu dostupné). Krátký přehled možných použití Phalangeru by tedy vypadal takto:

  • Provoz stávajících PHP aplikací - Na Phalangeru běží stávající PHP aplikace až dvakrát rychleji než pomocí standardního PHP interpretu. Více informací včetně popisu metodiky testování naleznete na našem webu v sekci věnované testování. Mezi aplikace, které jsme na Phalangeru testovali patří i tak známé projektu jako PhpBB, PhpMyAdmin a DokuWiki.
  • Integrace platformy Mono a PHP - Díky Phalangeru je možné vytvářet část aplikace v libovolném jazyce platformy Mono a takto napsané objekty používat z webové aplikace v PHP. Například přístup k datům nebo volání webových služeb může být pohodlnější v C#, ale pro zobrazování na webu je výhodnější použít PHP.
  • Vývoj ne-webových aplikací v PHP - Pokud je PHP váš oblíbený jazyk tak můžete díky Phalangeru vytvářet i jiné než webové aplikace a používat všechny knihovny dostupné v Monu (projekt lze poté distribuovat jako několik zkompilovaných knihoven spustitelných pod pomocí Mona). Pro Mono existuje široké množství knihoven včetně například Gtk# (pro tvorbu GUI). Seznam nejzajímavějších naleznete na webu Mono projektu.

Kompilace PHP aplikací

Phalanger je založený na Mono platformě a tak při spuštění webu (nebo i jiné aplikace) v PHP proběhne několik kroků. Nejprve je potřeba aplikaci zkompilovat - to se provede automaticky při prvním dotazu a výsledek se uloží do cache. Pokud dojde ke změně ve skriptu tak se zkompilovaná verze z cache odstraní, takže lze aplikaci upravovat stejně jednoduše jako je v PHP dobrým zvykem. V Phalangeru přibývá ještě jedna možnost a to aplikaci předkompilovat a distribuovat pouze ve zkompilované podobě. Co se tedy přesně stane když spouštíte PHP aplikaci pod Phalangerem?

  1. Pokud ještě není zkompilovaná, nebo došlo ke změně ve zdrojových kódech, tak se aplikace přeloží do IL kódu, tedy do tvaru aplikací pro Mono.
  2. Zavolá se Mono, které IL kód zkompiluje do nativního kódu optimalizovaného pro konkrétní procesor na kterém běží.
  3. Dokud aplikace nenarazí například na funkci eval tak běží v nativním kódu. Pokud dojde k volání eval tak se pro PHP kód který se spouští zopakují tyto tři kroky.

Phalanger Hello world

Nejprve tedy ukážu jak v PHP napsat a pomocí Phalangeru zkompilovat jednoduchou konzolovou aplikaci. Vše jsem testoval s poslední verzí Mona (tedy 1.2.1). Po stažení a instalaci Mona si stáhněte z stránky Phalangeru binární distribuci pro Mono (ZIP soubor) a rozbalte ji do vámi zvoleného adresáře. Následně je potřeba do global assembly cache (speciální umístění kam Mono ukládá sdílené knihovny) zaregistrovat několik knihoven Phalangeru. To provedete následujícím příkazem (spuštěným v adresáři Bin):

gacutil -i PhpNetCore.dll
gacutil -i PhpNetCore.IL.dll
gacutil -i PhpNetClassLibrary.dll

Nyní se tedy konečně dostáváme k skutečnému programování. Někde na disku si vytvoříme soubor "hello.php" s následujícím obsahem:

<?
  echo "Hello world!";
?>

Protože chceme aplikaci nejprve zkompilovat (budeme jí potom zpouštět pomocí Mono runtime z příkazové řádky), tak pomocí následujícího příkazu spustíme kompilátor phpc, který je součástí Phalangeru (předpokládám že cesta k němu je ../Bin):

mono ../Bin/phpc.exe hello.php

Pokud vše proběhne v pořádku, tak by měl vzniknout adresář bin se zkompilovanou aplikací (tedy souborem "hello.exe"). Tuto zkompilovanou aplikaci můžete pustit opět příkazem:

mono bin/hello.exe

PHP a Gtk#

Předcházející triviální příklad používal pouze standardní knihovny PHP. Ještě bych ale v tomto článku rád ukázal jak je možné díky Phalangeru pracovat s knihovnami tříd Mona. Na ukázku použijeme knihovny gtk-sharp a gnome-sharp, pomocí kterých lze vytvářet uživatelské rozhraní (knihovny primárně vznikaly pod Linuxem, ale protože GTK funguje i pod Windows existuje i Windows port). Pro to abychom mohli v PHP snadno pracovat s Mono knihovnami je potřeba zaponout několik rozšíření Phalangeru - důležité bude nyní hlavně použití namespaces, které jsou v Monu používané pro organizaci tříd. Namespaces v Phalangeru vycházejí z návrhů, které se objevují v PHP komunitě při diskuzi na toto téma a namespaces jsou jedna z vlastností, které se možná objeví i v PHP 6.

Phalanger & Gtk#

Podíváme se tedy jak vytvořit aplikaci, kterou můžete vidět na obrázku. Tentokrát tedy bude kromě samotného zdrojového kódu potřeba vytvořit i konfigurační soubor, který bude Phalangeru říkat jaké knihovny se mají z Mona použít. Začnu tedy s konfiguračním souborem - zde je důležité i jméno, takže ho pojmenujeme app.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <configSections>
      <!-- Registrace sekce pro konfiguraci Phalangeru -->
      <section name="phpNet" type="PHP.Core.ConfigurationSectionHandler, PhpNetCore,
        Version=2.0.0.0, Culture=neutral, PublicKeyToken=0a8e8c4c76728c71" />
  </configSections>      
  <phpNet>
    <!-- Seznam knihoven, ktere aplikace referencuje -->
    <classLibrary>
      <add assembly="mscorlib" />
      <add assembly="System, Version=1.0.5000.0, 
        Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <add assembly="gnome-sharp, Version=2.4.0.0, 
        Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
      <add assembly="gtk-sharp, Version=2.4.0.0, 
        Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
    </classLibrary>
    <compiler>
      <!-- Nastaveni kompilatoru - rozsireni pro praci s Monem -->
      <set name="LanguageFeatures">
        <add value="PhpClr" />
      </set>
    </compiler>
  </phpNet>
</configuration>

Konfigurace pomocí app.config souborů je vlastností Mona, proto je nejprve potřeba v konfiguračním souboru zaregistrovat sekci, která bude obsahovat specifické nastavení pro Phalanger (tedy sekci phpNet). V této sekci je jednak nastavený seznam knihoven, které bude aplikace používat a za druhé je tam možné nastavit další vlastnosti kompilátoru. V tomto případě je povoleno PhpClr rozšíření jazyka PHP. Mimochodem, pokud vás zajímá seznam všech knihoven, které máte nainstalovány a lze je z Phalangeru použít, tak seznm získáte následujícím příkazem (dokumentaci k nim lze snadno nalézt na internetu):

gacutil -l

Pokud již máme správně nastavený konfigurační soubor, můžeme se pustit do programování Gtk# Hello world aplikace. Gtk# je knihovna, která umožňuje pod Monem objektový vývoj GUI aplikací. Gtk# je postavené nad Gtk a pracuje se tedy se stejnými objekty jako Gtk aplikace psané například v jazyce C. Zdrojový kód ukázkové aplikace vypadá takto:

<?php
  // Import jmennych prostoru ve kterych jsou potrebne objekty (PHP/CLR)
  import namespace System; 
  import namespace Gtk;
  import namespace Gnome;

  class MyProgram
  {
    // Vstupni bod aplikace - rozsireni PHP/CLR
    static function Main()
    {
      // Spousteni programu
      new MyProgram();
    }

    // Hlavni widget aplikace
    var $app;
    
    function MyProgram()
    {
      // Inicializace programu a aplikace
      $program = new Program("MyProgram", "0.0", Modules::$UI, array());
      $this->app = new App("MyProgram", "MyWindow");
      $this->app->SetDefaultSize(400, 300);
      $this->app->Remove($this->app->Child);

      // Vytvoreni tlacitka
      $btn = new Button("Click me!");
      $btn->BorderWidth = 20;
      $this->app->Child = $btn;
      
      // Nastaveni zpracovani udalosti
      $btn->Clicked->Add
        (new EventHandler(array($this, "ButtonClick")));
      $this->app->DeleteEvent->Add
        (new DeleteEventHandler(array($this, "OnAppDelete")));
      
      // Start
      $this->app->ShowAll();
      $program->Run();
    }

    // Pri kliknuti na tlacitko se zobrazi dialogove okno
    function ButtonClick($o, $e)
    {
      $dlg = new MessageDialog($this->app, DialogFlags::DestroyWithParent,
       MessageType::Warning, ButtonsType::Close, "Hello world from PHP Gtk#!");
      $dlg->Run();
      $dlg->Destroy();
    }
    
    // Pri zavreni okna ukoncime aplikaci
    function OnAppDelete($o, $e)
    {
      Application::Quit();
    }
  }
?>

(Celé demo si můžete stáhnout zazipované zde)

Jistě jste si všimli, že zdrojový kód obsahuje několik vlastností, které nejsou součástí standardní verze jazyka PHP. Jedná se v první řadě o podporu namespaces o které jsem se již zmiňoval. V aplikaci používáme jmenné prostory System, Gtk a Gnome, ve kterých se nacházejí potřebné třídy (v System se nachází třída EventHandler, v Gnome třídy Program, a App a v namespace Gtk naleznete Button a MessageDialog). Další rozšíření PHP které je na tomto případě vidět je vstupní bod aplikace - v PHP se standardně kód pouští od začátku zdrojového skriptu. To je vhodné pro webové stránky, ale při psaní aplikací pro Mono je výhodnější použít jako vstupní bod aplikace statickou metodu (se jménem Main) - to více odpovídá tomu, jak jsou aplikace pro Mono psané.

Zdrojový kód obsahuje jednu třídu (MyProgram), která reprezentuje běžící aplikaci. V konstruktoru (funkce se stejným jménem jako jméno třídy) se vytváří nejprve objekt reprezentující program a poté hlavní widget aplikace a poté se na hlavní widget se vloží tlačítko. Ještě před spuštěním aplikace je potřeba nastavit dva event handlery - tedy funkce které budou vyvolány z Gtk# při zavření aplikace a kliknutí na tlačítko. Pro kliknutí na tlačítko se volá metoda Add vlastnosti Clicked a jako parametr se jí předá nově vytvořený objekt, který reprezentuje event handler. Při vytváření se event handleru (třídě EventHandler) předá pole obsahující odkaz na objekt reprezentující naší aplikaci ($this) a jméno funkce, které se má vyvolat (například ButtonClick).

Na závěr

V tomto článku jsme se věnovali jenom části toho co Phalanger umožňuje, ale věřím že některé možnosti tohoto projektu vás zaujaly. Díky Phalangeru lze při psaní PHP aplikací zároveň využít všech výhod platformy Mono, jako je přenositelnost, stále se rozrůstající knihovna tříd, rychlost a jednotné prostředí pro více jazyků, díky kterému je možné při psaní aplikace kombinovat více programovacích jazyků.

Přednáška o Phalangeru

Pokud se chcete o Phalangeru dozvědět více, pak můžete přijít na přednášku, která se o tomto projektu bude konat 12.12. od 18:00. Více informací o přednášce a registrace na akci.

Verze pro tisk

pridej.cz

 

DISKUZE

Nejsou žádné diskuzní příspěvky u dané položky.



Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

18.6.2018 0:43 /František Kučera

Červnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 21. 6. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát na téma: F-Droid, aneb svobodný software do vašeho mobilu. Kromě toho budou k vidění i vývojové desky HiFive1 se svobodným/otevřeným čipem RISC-V.


Přidat komentář

23.5.2018 20:55 /Ondřej Čečák
Od pátku 25.5. proběhne na Fakultě informačních technologií ČVUT v Praze openSUSE Conference. Můžete se těšit na spostu zajímavých přednášek, workshopů a také na Release Party nového openSUSE leap 15.0. V na stejném místě proběhne v sobotu 26.5. i seminář o bezpečnosti CryptoFest.
Přidat komentář

20.5.2018 17:45 /Redakce Linuxsoft.cz
Ve čtvrtek 31. května 2018 připravuje webový magazín BusinessIT ve spolupráci s Best Online Média s.r.o. pátý ročník odborné konference Firemní informační systémy 2018. Akce proběhne v kongresovém centru Vavruška (palác Charitas), Karlovo náměstí 5, Praha 2 (u metra Karlovo náměstí) od 9:00 hod. dopoledne do cca 15 hod. odpoledne. Konference je zaměřena na efektivní využití firemních informačních systémů a na to, jak plně využít jejich potenciál. Podrobnější informace na webových stránkách konfrence.
Přidat komentář

14.5.2018 7:28 /František Kučera
Květnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 17. 5. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát na téma: Audio – zvuk v GNU/Linuxu.
Přidat komentář

7.5.2018 16:20 /František Kučera
Na stránkách spolku OpenAlt vyšla fotoreportáž Pražské srazy 2017 dokumentující srazy za uplynulý rok. Květnový pražský sraz na téma audio se bude konat 17. 5. 2018 (místo a čas ještě upřesníme).
Přidat komentář

17.4.2018 0:46 /František Kučera
Dubnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 4. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tématem tohoto srazu bude OpenStreetMap (OSM) aneb svobodné mapy.
Přidat komentář

16.3.2018 22:01 /František Kučera
Kulatý OpenAlt sraz v Praze oslavíme klasicky: u limonády a piva! Přijďte si posedět, dát si dobré jídlo a vybrat z mnoha piv do restaurace Kulový blesk, který najdete v centru Prahy nedaleko metra I. P. Pavlova na adrese Sokolská 13, Praha 2. Sraz se koná ve čtvrtek 22. března a začínáme v 18:00. Heslo: OpenAlt. Vezměte s sebou svoje hračky! Uvítáme, když si s sebou na sraz vezmete svoje oblíbené hračky. Jestli máte nějaký drobný projekt postavený na Arduinu, nějakou zajímavou elektronickou součástku, či třeba i pěkný úlovek z crowdfundingové akce, neváhejte. Oslníte ostatní a o zábavu bude postaráno.
Přidat komentář

13.2.2018 0:41 /František Kučera
Únorový pražský sraz OpenAltu se koná 15. 2. 2018 a tentokrát se vydáme na návštěvu do jednoho pražského datacentra. Sejdeme se v 17:50 v severovýchodní části nástupiště tramvajové zastávky Koh-I-Noor. Po exkurzi se přesuneme do restaurace U Pštrosa (Moskevská 49), kde probereme tradiční témata (svobodný software a hardware, DIY, CNC, SDR, 3D tisk…) a tentokrát bude k vidění i IoT brána od The Things Network.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

20.2.2018 18:48 / Ivan Majer
portal

20.2.2018 15:57 / Jan Havel
Jak využíváte služby cloudu v podnikání?

16.1.2018 1:08 / Ivan Pittner
verejna ip od o2 ubuntu

15.1.2018 17:26 / Mira Harvalik
Re: Jak udělat HTML/Javascript swiping gallery do mobilu?

30.12.2017 20:16 / Michal Knoll
odmocnina

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2018) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze