Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

Translate to English… Ins Deutsche übersetzen…

Jak zredukovat PHP skripty?

Občas je třeba zmenšit PHP skripty na minimum. Odstranit komentáře, zredukovat bílé místo. Zkrátí se doba nahrávání na server, mírně zrychlí provádění a program se stane hůře čitelný pro nepovolané osoby.

Existují sice nástroje, které tento úkol řeší téměř dokonale (Zend Encoder, SourceGuardian atd.), mají však svá „ale“. Buď v podobě závratné ceny, specifických nároků na hosting, nebo v prostém zatajení faktu, že existují i zpětné dekodéry.

Ukážu vám jeden směšně jednoduchý postup, jak vypustit ze skriptů zbytečné znaky. Používám jej pro texy-compact.php, kde dosahuji úspory cca 50% velikosti. A v žádném případě to neovlivní jeho funkčnost.

// Dgx's PHP shrinker

// PHP 4 & 5 compatibility
if (!defined('T_DOC_COMMENT'))
  define ('T_DOC_COMMENT', -1);

if (!defined('T_ML_COMMENT'))
  define ('T_ML_COMMENT', -1);

// read input file
$input = file_get_contents('script.php');

$space = $output = '';
$set = '!"#$&\'()*+,-./:;<=>?@[\]^`{|}';
$set = array_flip(preg_split('//',$set));

foreach (token_get_all($input) as $token)  {
  if (!is_array($token))
    $token = array(0, $token);

  switch ($token[0]) {
    case T_COMMENT:
    case T_ML_COMMENT:
    case T_DOC_COMMENT:
    case T_WHITESPACE:
      $space = ' ';
      break;

    default:
      if (isset($set[substr($output, -1)]) ||
          isset($set[$token[1]{0}])) $space = '';
      $output .= $space . $token[1];
      $space = '';
  }
}


// write shrinked file
fwrite(
  fopen('output.php', 'w'),
  $output
);

Nevím, jestli to potřebuje podrobnější komentář, každopádně hlavní magie se skrývá ve funkci token_get_all, kterou doporučuji nastudovat.

Online PHP shrinker

Komentáře RSS 2.0 komentářů » přidat

avatar

#1 Adam Hošek http://mamuf.webik.info/ nový

Nešlo by odstranit whitespace úplně? Totiž, jestli by to nevadilo tomu sešrinkovanýmu skriptu. Ještě více by se ušetřilo na velikosti a bylo by to snad ještě méně čitelnější.

Posláno 19. 5. 2005 ve 12.18 | Odpovědět
Na komentář reagoval [4] David Grudl

#2 Leo nový

No nevim, neni to uz trochu uchylarna? :-) Nepovolane osoby nemaji co zdrojaku koukat, jak se k nemu dostanou tak je pozde. Komentare a bila mista ve zdrojaku podle me nejsou pro rychlost zpravovani vubec rozhodujici, a nahravani na server… bez komentare, Leo

Posláno 19. 5. 2005 ve 12.23 | Odpovědět
Na komentář reagoval [4] David Grudl

#3 votok nový

Podle me je to pekna blbina. Daleko lepsi je prehlednejsi zdrojak nez nejaka milimili uspora mista nebo casu.

Posláno 19. 5. 2005 ve 12.53 | Odpovědět
Na komentář reagoval [4] David Grudl
avatar

#4 David Grudl http://davidgrudl.com nový

#1 Adam Hošek: úplně ne, ale algoritmus jsem lehce upravil a je o něco účinnější

#2 Leo: #3 votok: tak to prostě nepoužívejte! Pokud tě Votoku nenapadá uplatnění, proč hned označuješ nástroj za blbinu? To sis mohl v dětství klidně ustřihnout koule ;)

Posláno 19. 5. 2005 ve 13.00 | Odpovědět
avatar

#5 llook http://llook.wz.cz/weblog/ nový

Když nastane chyba v redukovaném zdroji, tak se dost blbě hledá – všechno je na jedné řádce.

Ideál bych viděl takový:

  • Místo mezery by se použil LF.
  • Kromě výsledného zredukovaného souboru by se vygeneroval jakýsi index obsahující čísla řádek nového souboru a umístění jejich obsahu ve starém souboru.
  • Když by PHP zahlásilo chybu, měl bych někde na localhostu skript, který by mi to pomohl najít ve velkém (zdrojovém) kódu podle toho indexu.

Kdysi jsem něco podobného zkoušel implementovat, redukovalo to i názvy proměnných a funkcí, ale tehdy jsem o PHP věděl tak strašně málo, že je z toho použitelný už jen ten nápad.

Posláno 19. 5. 2005 ve 13.54 | Odpovědět
Na komentář reagoval [8] David Grudl

#6 rony nový

hm a Ctrl-A, Del nepomaha?

Posláno 19. 5. 2005 ve 14.08 | Odpovědět
Na komentář reagoval [8] David Grudl

#7 Llaik http://llaik.blogspot.com nový

Spis VGd, ne? :)

Posláno 19. 5. 2005 ve 14.33 | Odpovědět
avatar

#8 David Grudl http://davidgrudl.com nový

#5 llook: vůbec nepředpokládám, že by ten redukovaný soubor ještě někdo editoval. Já to používám u kompaktní varianty Texy, protože nahrát na web 160kB ve 25 souborech je něco jiného, než jeden 75kB soubor. Během uploadu je totiž chování webu nedefinovatelné, jde o kritické místo. Měřením jsem si ověřil, že mírně naroste i výkon, což bylo pro mě překvapením a považuji to spíš za perličku.

Jako prostředek utajení bych spíš použil Zend Encoder (legálně i za cenu hostingu). Tento nástroj jen čtení ztíží, ale natolik, že bez nějakého ‚source beautifuleru‘ je nemožné. Nicméně komentáře už nevrátí nic.

Tímto skriptem jsem chtěl spíš ukázat, že úkol lze efektně řešit i bez napsání složitého parseru.

#6 rony: Zkusil jsem, je to velmi efektivní, ale nezachovalo mi to původní funčnost :-)

Posláno 19. 5. 2005 ve 14.46 | Odpovědět
Na komentář reagoval [12] votok

#9 hvge http://hvge.sk nový

Pekne, predpokladam, ze tam uz staci len dopisat case pre T_REQUIRE_ONCE a rekurzivne dosadit obsah toho file (pokial nie je zrovna variabilny)…

Posláno 19. 5. 2005 v 15.16 | Odpovědět
Na komentář reagoval [11] David Grudl [21] David Grudl

#10 hvge http://hvge.sk nový

[13] Teda, myslel som variabilny parameter pre require, aby bolo jasne :)

Posláno 19. 5. 2005 v 15.29 | Odpovědět
avatar

#11 David Grudl http://davidgrudl.com nový

#9 hvge: přesně tak :-)

Posláno 19. 5. 2005 v 15.45 | Odpovědět

#12 votok nový

#8 David Grudl: dgx: No to bych nerad! Takze jestli to chapu, zdrojaky mas porad velky, akorat pred nahranim na ostrou to prozenes timhle filtrem. To se muze hodit. Ja chtel jen zachranit mlade vyvojare pred odstranovanim svych komentaru :)

Posláno 19. 5. 2005 v 15.58 | Odpovědět
avatar

#13 martinpav martinpav@centrum.sk nový

No niekde som videl obfuscator pre PHP v php. Myslim ze ho mam aj odlozeny ale nemal by byt problem najst ho znova. Mal nejake chybicky (nezvladal HEREDOC) ale pouzit sa dal.

Inak pred casom som tiez skusal aky vlyv ma velkost scriptu na jeho beh a dospel som k podobnemu vysledku ako dgx. Da sa tam trosicka usetrit na case ale jedna zla query to v pohode dozene.

Posláno 19. 5. 2005 v 17.14 | Odpovědět

#14 Nai Dzet Quiv nový

Hmm. Možná se to pro Texy! a podobné nástroje hodí, ale pro „normální“ (;-) ) skripty ASI ne. Musím souhlasit s Leem. Editace bude problematická. A do skriptů mi nebude (snad) nikdo čumět.

Posláno 19. 5. 2005 v 17.44 | Odpovědět
Na komentář reagoval [15] benny

#15 benny nový

#14 Nai Dzet Quiv: ach jo, to nechápeš, že už to editovat nepůjde? A zajímalo by mě, jak víš, že ti nikdo (třeba správce hostingu) do skriptů nekouká. hehe :-)

Posláno 19. 5. 2005 v 19.13 | Odpovědět

#16 OttY http://blog.ziak.sk/ nový

Mne sa páči riešenie menom TruckMM cache, ktorý ma na hostingu na starosti to, ze drží v RAM server posledne spustené PHP skripty. Keď som posledne pozeral server kde hostujem, tak v cache boli 195 skriptov. Zrýchlenie je zjavné, keď sú skripty v RAM :-)

Posláno 19. 5. 2005 ve 20.27 | Odpovědět
Na komentář reagoval [27] Ladis

#17 gregor http://crimson.elepha.info nový

ja to dobra vec, hlavne ak to znizy rychlost skriptov…Ale ked php suborov mam co ja viem 50 tak osobitne robit kazdy subor, je dost o drzku…
Mozno by som tam pridal moznost urcit nieco ako document root (napr. /) a spustit skript.
Ten by prehladal vsetky podzlozky a kazdy subor s koncovkov php by upravil a ulozil do urcenej zlozky pricom by zachoval stromove poradie suborov… mozno velmi zlozite ale dobre…

Posláno 19. 5. 2005 ve 20.48 | Odpovědět

#18 lukas nový

Je to hezky, diky za tip na tu funkci (a vubec cely tokenizer), ale IMHO je to k nicemu.

>> Zrychlí se nahrávání na server

Nahravani na server trva nejakou dobu? Osobne krome zdrojaku posilam na server i graficke navrhy ve Photoshopu a Corelu (tak 10MB) a to jen proto, ze jsem liny v Total Commanderu odoznacit slozku „podklady“.

>> mírně i provádění

To velmi pochybuji. Nedela to PHP tak, ze vezme zdrojak preparsuje si ho a ulozi nekam v citelnejsi podobne (kde uz treba mezery roli nehraji)? Krk bych za to nedal, ale proc by mi jinak prvni vykonani skriptu vzdycky trvalo o neco dele nez vsechny nasledujici?

>> a program se stane hůře čitelný pro nepovolané osoby.

Automaticke zformatovani snad maji vsechny editory.

Posláno 20. 5. 2005 v 17.16 | Odpovědět
Na komentář reagoval [21] David Grudl

#19 LLaik http://llaik.blogspot.com nový

No porovnej si rychlost Smarty a nasledne Smarty orezane o komentare.

Zalezi na konfiguraci PHP, ale v nejake „ciste“ podobe to vliv jednoznacne ma.

PHP neni cecko :)

Posláno 20. 5. 2005 ve 21.17 | Odpovědět

#20 lukas nový

Ja se ptal na PHP, ne na sablony. I kdyby to nejaky vliv melo (jako ze nevim), tak by to bylo porad jen linearni zrychleni s mizivym koeficientem.

Posláno 20. 5. 2005 ve 22.42 | Odpovědět
avatar

#21 David Grudl http://davidgrudl.com nový

#18 lukas: nahrávání na server je velmi kritická záležitost. Už jsem to tu psal jednou – pokud aktualizuji knihovnu, který má třeba 20 souborů, při nahrání části z nich je chování aplikace nepředvídatelné. A co když v tuto chvíli spojení klekne a třeba hodinu nepojede?

Proto jsem u Texy přišel s jednosouborovou „zminimalizovanou“ verzí. A jak správně vytušil #9 hvge:, ke generování používam upravený algoritmus ze článku. Nebudu jej tu uvádět, ať si každý naprogramuje sám, nemám zájem o další spršku komentářů jako „je to k ničemu“, „je to blbost“ a podobně.

Posláno 22. 5. 2005 ve 22.51 | Odpovědět
Na komentář reagoval [22] llook
avatar

#22 llook http://llook.wz.cz/weblog/ nový

#21 David Grudl: Tohle ale musím potvrdit. Taky už jsem se dostal do situace, kdy jsem měl připojení jen z počítače se špatně nastaveným firewallem, takže FTP nefungovalo.

Nahrávat 20 souborů přes formulář je fakt na sebevraždu. Přemýšlel jsem o napsání něčeho na způsob shar archívů, ale v PHP. Jenže mezitím se moje konektivitní problémy vyřešily.

Posláno 23. 5. 2005 v 10.33 | Odpovědět
Na komentář reagoval [28] spaze

#23 Gagarin nový

… „(velmi, velmi) mírně zrychlí provádění“…

U PHP skriptu dejme tomu o sto řádcích se provádění nezrychlí více než o jednu stotisícinu vteřiny, to jen aby nějaká lama nezačla takto komprimovat skripty jen a pouze za účelem zrychlení.

Posláno 26. 5. 2005 ve 22.13 | Odpovědět

#24 von Banhoff http://vfb.bloguje.cz nový

vždycky když si dovolím smáznout nějakou prázdnou řádku našemu coderovi, tak se může – to nevidí rád – prohnat mu to tou tvojí fcí, tak ho asi na místě :)

Posláno 10. 6. 2005 ve 21.21 | Odpovědět

#25 Llaik http://llaik.blogspot.com nový

Ja mluvim o PHP. Nemluvil jsem o parsovani sablony, ale o parsovani ktere dela PHP interpret s php skriptem. Smarty jsem jako priklad pouzil proto, ze je to vcelku velky skript a jeho opravdu nezanedbatelnou casti jsou komentare – tj. pokud je odstranis, vyrazne tim snizis velikost skriptu.

Ted jsem si na lokalni masine profil jednoduchy php skript pouzivajici jako priklad Smarty – naparsovani skriptu trvalo 75%, zbylych 25% celkoveho casu pak trvalo uz samotne provadeni skriptu.

Tj. cas vynalozeny interpretem PHP na pouhe naparsovani vasich php skriptu (aby mohly byt provedeny) neni v zadnem pripadne zanedbatelny.

Posláno 15. 6. 2005 ve 14.15 | Odpovědět

#26 LLaik http://llaik.blogspot.com nový

Jinak vtipna praxe – mel jsem nejaky pomaly skript, trval cca 0.2s vteriny. Kdyz jsem zrusil odsazeni cca 200 radku, trval 0.002s. Vratil jsem odsazeni, trval 0.2s…

vzal jsem jiny skript a odsadil kazdy z 200 radku o 1000 mezer doprava – zadna zmena.

Doted je to pro me hezka zahada, kde asi co preteklo (?), ze to trvalo tak dlouho? Kazdopadne muj instalacni skriptik rusi vsechny prebytecne blank znaky, at ma duse klid :)

Posláno 21. 6. 2005 ve 21.45 | Odpovědět

#27 Ladis http://php.blog.cz nový

#16 OttY: TruckMM cache umí nejen to. Umí taky spouštět (vlastním algoritmem) zakódované PHP soubory jako Zend Safeguard, ale navic je ZDARMA!
BTW. uz to neni TruckMM cache ale EAccelerator.

Posláno 26. 9. 2005 ve 20.48 | Odpovědět

#28 spaze http://exploited.cz nový

#22 llook: nejaky arxivz pro PHP jsou.. bud v PEAR, bo v PECL se neco najde.

Posláno 12. 10. 2005 v 16.24 | Odpovědět
avatar

#29 medden michal.sustr@gmail.com nový

Mimochodom, akurát som si v php manuáli všimol funkcie php_strip_whi­tespace, ktorá fakticky robí to, čo uvedený zdroj, aj keď si niečo myslím o tom takýto balast dávať do php…

Posláno 6. 3. 2006 v 18.14 | Odpovědět
Na komentář reagoval [30] David Grudl
avatar

#30 David Grudl http://davidgrudl.com nový

#29 medden: ano, od PHP5 na to existuje funkce. Kupodivu však neredukuje tak účinně, jako tento skript.

Posláno 6. 3. 2006 v 18.38 | Odpovědět

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře ani hlasovat

Výtah na začátek článku na první komentář

Názory čtenářů v diskusích nejsou názory provozovatele webu, a ten za jejich obsah neodpovídá.

phpFashion © 2004, 2010 David Grudlo webu

Pokud není uvedeno jinak, podléhá obsah těchto stránek licenci Creative Commons BY-NC-ND Creative Commons License BY-NC-ND

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.