Mirin webspace

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

24. 11. 2009 - Komentáře (1) PHP

Vlastní php extension - IncPath

Jak jsem si tak projížděl PHP třídy, které používám pro různé pomocné operace, narazil jsem na jednu, která dělá jednoduchý objektový statický wrapper nad manipulací s include_path. Nějak se mi zalíbilo mít pro include_path jednoduché přidání a odebrání cesty do/z include_path.

IncPath::add("/usr/local/new/path");
IncPath::remove("/usr/local/old/path");

Přímo v php jsou funkce set_include_path a get_include_path, které se mi moc nelíbí právě z toho důvodu, že pracují s include_path jako s celkem. Ano, userspace wrapper v PHP je v celku jednoduchá záležitost. Mě se ale moc nelíbí používat funkce a třídy, které patří spíš do PHP jako takového, nějakým způsobem se snaží řešit přímo něco z PHP jako prostředí/jazyka. Kromě include_path to často jsou funkce pro pole, různé simulátory properties přes __get/__set.

Nu, tak jsem si řekl, že to zkusím jako PHP extension, tedy přímo v C. Taková záležitost by nemusela být moc složitá. Trochu hodně jsem se seknul, byla a je to pro mě to velmi náročná věc, zejména když o tom, jak se píší PHP extension jsem neměl ani páru a o C jste se naposledy otřel tak před 8 lety a to jen na chvíli a ne nějak důkladně.

Nebudu to prozatím moc protahovat, nakonec jsem něco upatlal. Můžete se na to podívat u mě v repositáři. Zatím jsem to nikde přímo nenasadil (neinstaloval). Počítám, že to bude chtít ještě dost času na úpravy. Nicméně nějaké základní testy už projdou, takže můžete klidně odzkoušet případnou instalaci. Zkompilovat a nainstalovat (netestováno) by se to tedy mělo klasickou phpize metodou pro php extensions. Budete samozřejmě potřebovat zdrojáky PHP, dělal jsem to na 5.3 (web už jede na 5.3.1)

# cd /test/phpincpath
# phpize
# ./configure --with-incpath
# make
# make install

API by mělo být velmi jednoduché, v php by skeleton třídy vypadal asi takto:

class IncPath 
{
  /**
   * Add path into include_path
   * @param string $path
   * @return void
   */
  public static add($path);
 
  /**
   * Remove path from include_path
   * @param string $path
   * @return void
   */
  public static remove($path);
 
  /**
   * gets all path in include_path as array
   * @return array
   */
  public static getPathArray();
}

Trošku se mi nezdá to static, statické třídy nejsou úplně to pravé ořechové zejména kvůli testování. Je to v podstatě globální bordel jen v namespace. Ale zase pro manipulaci s include_path dělat dynamické API, nevím.

Během toho, co jsem extension dělal, jsem nasbíral trošku poznatků o tom, jak se php extension píší. Takže příští články budou asi o tomhle tématu. Samozřejmě uvítám poznatky někoho dalšího, kdo má s php extension API zkušenosti, protože i ve světě se o tomhle dozvíte poměrně málo informací.


Komentáře (1)

  1. snop - 24. 11. 2009 15:19

    Ahoj,

    tak toto si zada 5 hvezdickove oceneni za odvahu ;), jaky dalsi serial o psani PHP ext (aspon ten zaklad, jak co funguje a jak udelat nejakou jenoduchou ext napr. hello world je vitany)

    Uz se tesim na dalsi dil, diky

Komentáře jsou uzavřeny.