Automatická minifikace PHP scriptu

   13. 07. 2020

Občas potřebujeme zmenšit velký PHP script a stlačit jich několik do jednoho souboru. To se hodí třeba v případě, kdy vytváříme knihovnu, kterou budeme publikovat na internet a nechceme, aby nám do ní někdo zasahoval, nebo jde o užitečný script, který budeme často kopírovat a nechceme proto přenášet zbytečně mnoho dat.

Možným řešeným je minifikace kódu.

Připravil jsem pro to online nástroj (stačí vložit kód a ihned dostanete zpět jeho minifikovanou verzi).

Jádro minifikátoru lze po zestručnění zmenšit na toto minimum:

$file = 'StaticClass.php';

// 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($file);

$space = $output = '';
$set = '!"#$&\'()*+,-./:;<=>[email protected][\]^`{|}';
$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
file_put_contents('min_'.$file, $output);

Jádro tvoří funkce token_get_all(), která naparsuje PHP kód na jednotlivé "atomy" (tokeny), které lze už jednoznačně poznat a podle potřeby následně ignorovat.

Vygeneruje například (pro ukázku jsem použil metodu Nette\Utils\Images):

Minifikovaný kód
Nechte si posílat nové články do mailu:

Jan Barášek     Více o autorovi

Autor článku podniká jako fullstack senior developer v Praze. Spravuje 300 různě velkých webových projektů, fungujících dodnes. Během spolupráce nabral hluboké zkušenosti, které na tomto webu předává dál.

Rád vám pomůžu:

Kontakt Konzultace a služby Nabídka spolupráce