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

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

clock 19. 5. 2005 pencil PHP comments Komentáře: 30


PHP hádanka VII.: rovný a rovnější

Najdete všechny hodnoty, kterých může nabývat proměnná $value, aby byla následující podmínka vyhodnocena kladně?

$value = ???

if ($value=="ahoj") echo 'rovnost platí';

clock 18. 5. 2005 pencil PHP comments Komentáře: 27


PHP: soubor, cesta a URL přehledně

Aneb mohlo by se vám hodit.

Klasické URL pdf

AcceptPathInfo pdf

Obrázky ukazují, jak PHP parsuje URL a cestu k fyzickému souboru se skriptem do pole $_SERVER.

AcceptPathInfo je specialitka serveru Apache, díky které je možné používat pěkná URL i bez modulu mod_rewrite a také spoustu serverů rozhodit pouhým přidáním /x za koncovku .php.

Pokud objevíte nepřesnost nebo vás napadne vhodné doplnění, napište mi do komentářů.

clock 2. 4. 2005 pencil PHP comments Komentáře: 8


Silná konkurence pro GeSHi?

Pokud jste se někdy zajímali o zvýrazňování syntaxe u publikovaných zdrojových kódů, nejspíš jste narazili na knihovnu GeSHi. Tento počin dvacetiletého Novozélanďana Nigela McNie si získal velkou oblibu a také jsem jej použil pro zvýrazňování kódu v Texy a zde na La Trine.

Jak je z tohoto příkladů patrné, GeSHi má velké problémy s kódováním UTF-8 (bohužel, autorův nativní jazyk je angličtina). Někdy vyhodí zcela nevalidní UTF řetězec, což představuje smrt pro striktní XML parser. GeSHi také není žádný rychlík, což by mi zas tak nevadilo – kešuji, kudy chodím.

Narazil jsem ale na jiný zvýrazňovač FSHL, jehož autor je „soused“ Slovák Juraj ‚hvge‘ Ďurech. Už na první pohled je patrné, že FSHL toho umí opravdu hodně. Všimněte si, jak ladně přechází mezi ‚podzimním‘ PHP do ‚jarního‘ HTML a ‚zimního‘ CSS. Barevné ladění je velmi příjemné. I když o to tady nejde.

A rychlost? Podle prvních měření je FSHL cca 10× rychlejší než GeSHi. Zbývá jen zjistit, jak je to s podporou UTF. A pak FSHL nasadím.

Aktualizováno: FSHL jsem už nasadil. Podpora UTF-8 se zdá být ok, jen je třeba nahradit volání htmlEntities(...) za htmlEntities(..., ENT_COMPAT, 'UTF-8').

clock 18. 3. 2005 pencil PHP comments Komentáře: 3


Regulární korektura Intervalu.cz

Regulární výrazy jsou vynálezem amerického matematika Stephena Kleene a troufám si tvrdit, že jsou starší než většina čtenářů La Trine. Pro nezasvěcené působí jako tajemné formule s magickou silou. Zdrojů, ze kterých se dají vědomosti o výrazech získat, je dost. Od vyčerpávající nápovědy v PHP, přes články až po knihy.

Člověk omámený kouzlem regulárních výrazů často propadne jejich nadužívání. Proto je škoda, že neexistují i tituly jako „Deset případů, kde se regexp absolutně nehodí“ nebo „Zpověď programátora: Už týden jsem nepoužil regulární výraz“ :-)

Nebudu zde vysvětlovat principy regulárních výrazů – všechny zájemce bych rád odkázal na seriál Miroslava Pecky, který právě vychází na Intervalu. Protože jsme v něm narazil na určitou nesrovnalost, připojuji tuto svou korekturu.

Kde se vloudila chyba?

V části věnované subvýrazům a zpětným referencím autor uvádí, že zpětné reference se zapisují ve tvaru \\n, kde n je číslo subvýrazu. K tomu mám vážnou námitku: zapisují se ve tvaru \n.

Svá slova potvrzuji tímto příkladem. Jasně demonstruje, že při užití \2 \1 vše funguje dle očekávání, zatímco \\2 \\1 ke zdárnému cíli nevede. Tedy rozdíl v jednom lomítku je skutečně zásadní.

Poznámka: V regulárních výrazech nesmírně záleží na každém znaku, včetně mezer, a tudíž není možné tolerovat jakoukoliv nejasnost. Hledání chyb ve výrazech je mravenčí práce a může vést až k nervovým kolapsům včetně nepříjemného regurgitačního uvolnění organismu.

Něco tu nehraje

Co je zajímavé, příklady uvedené v článku Miroslava Pecky skutečně fungují, i s oním dvojitým lomítkem. Jak je to možné? Je to díky určité shodě okolností.

Každý programátor PHP by měl perfektně ovládat zápis řetězců. PHP k tomuto účelu nabízí hned tři způsoby, nejčastěji se používají tyto dva: uvození řetězce do jednoduchých a dvojitých uvozovek. Důležité je vědět, že takto zapsaný řetězec ještě PHP určitým způsobem transformuje do finální podoby.

V těchto transformacích hrají důležitou roli právě zpětná lomítka. Pohledem na příslušné místo v dokumentaci PHP zjistíte, že zápis "\50" podléhá transformaci (viz escapování) a PHP jej nahradí za znak s kódem 50 v osmičkové soustavě, což je mimochodem levá závorka. Naopak při použití jednoduchých uvozovek k transformaci nedojde:

echo "\50";   // vypíše (
echo "\\50";  // vypíše \50
echo '\50';   // vypíše \50

Z příkladu je vidět, že nechtěné transformaci se lze vyhnout zdvojením zpětného lomítka nebo (lépe) nahrazením dvojitých uvozovek za jednoduché.

A tím se dostáváme zpět ke kritizovaným zpětným referencím. Protože autor používá ve všech příkladech řetězce s dvojitými uvozovkami, musí zpětná lomítka zdvojovat. Tedy zdvojení si vynucuje vlastnost PHP, která s regulárními výrazy absolutně nesouvisí. Kdyby použil uvozovky jednoduché, zdvojovat lomítko není třeba (avšak nevadí to). Ve všech dalších případech (syntax heredoc, načítání z databáze nebo souborů, mnou uvedený příklad) už vadit bude a příklady přestanou fungovat.

Závěr: Doporučuji regulární výrazy zapisovat opatrně a nejlépe s použitím jednoduchých uvozovek.

clock 22. 2. 2005 pencil PHP comments Komentáře: 9


phpFashion © 2004, 2012 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í.