清理注释、换行、空格。可能有bug。
<?php
header('Content-Type: text/html; charset=utf-8');
$source = './demo/src';
$destination = './demo/dst';
$path = array($source);
$file = array();
while ($path){
$path_cur = array_pop($path);
@mkdir(str_replace($source, $destination, $path_cur));
$file = array_merge($file, glob($path_cur.'/*.php'));
$path = array_merge($path, glob($path_cur.'/*', GLOB_ONLYDIR));
}
foreach ($file as $src){
$dst = str_replace($source, $destination, $src);
$content = file_get_contents($src);
$code = compress($content);
file_put_contents ($dst, $code, LOCK_EX);
echo sprintf("%s : %s -> %s\n", $dst, filesize($src), filesize($dst));
}
function compress($content){
$code = array();
$tokens = token_get_all($content);
foreach ($tokens as $i => $token) {
if (is_string($token)){
$code[$i] = $token;
} else {
switch ($token[0]) {
case T_OPEN_TAG:
//case T_CLOSE_TAG:
$code[$i] = '<?php ';
break;
case T_COMMENT:
case T_DOC_COMMENT:
case T_WHITESPACE:
break;
case T_CASE:
case T_CLASS:
case T_CLONE:
case T_CONST:
case T_ECHO:
case T_FUNCTION:
case T_GLOBAL:
case T_IMPLEMENTS:
case T_INTERFACE:
case T_INCLUDE:
case T_INCLUDE_ONCE:
case T_INSTANCEOF:
case T_NEW:
case T_PRIVATE:
case T_PUBLIC:
case T_PROTECTED:
case T_REQUIRE:
case T_REQUIRE_ONCE:
case T_RETURN:
case T_STATIC:
case T_THROW:
case T_VAR:
$code[$i] = $token[1].' ';
break;
case T_EXTENDS:
case T_AS:
case T_LOGICAL_AND:
case T_LOGICAL_OR:
case T_LOGICAL_XOR:
$code[$i] = ' '.$token[1].' ';
break;
default:
$code[$i] = $token[1];
}
}
}
return implode('', $code);
}
?>