my_echo("PHP-P array serialized", strlen($serialized), "bytes"); $f = function () use($serialized) { $stmts = unserialize($serialized); }; my_echo("PHP-P array unserialize time", $b->timeIt($f), "sec"); $xref = new XRef(); // init autoload etc $parser = new XRef_Parser_PHP(); $f = function () use($parser, $code, $filename) { $pf = $parser->parse($code, $filename); $pf->release(); }; my_echo("XRef internal parser", $b->timeIt($f, 30), "sec"); $slices = array(); $pf = $parser->parse($code, $filename); $project_database = new XRef_ProjectDatabase(); foreach ($xref->getPlugins("XRef_IProjectLintPlugin") as $id => $plugin) { $slices[$id] = $plugin->createFileSlice($pf); } $slices['_db'] = $project_database->createFileSlice($pf); $pf->release(); $serialized = serialize($slices); my_echo("XRef serialized size", strlen($serialized), "bytes"); $compressed = gzcompress($serialized); my_echo("XRef compressed size", strlen($compressed), "bytes"); $f = function () use($serialized) { $slices = unserialize($serialized); }; my_echo("XRef unserialize time", $b->timeIt($f), "sec"); function my_echo($prefix, $data, $suffix = null) {
/** * @param ReflectionClass $rc * @return XRef_Class */ private function getClassByReflection(ReflectionClass $rc) { $class_name = $rc->getName(); if (!isset(self::$hasTraits)) { $rrc = new ReflectionClass("ReflectionClass"); self::$hasTraits = $rrc->hasMethod("isTrait"); } $c = new XRef_Class(); $c->index = -1; $c->nameIndex = -1; $c->bodyStarts = -1; $c->bodyEnds = -1; if ($rc->isInterface()) { $c->kind = T_INTERFACE; } elseif (self::$hasTraits && $rc->isTrait()) { $c->kind = T_TRAIT; } else { $c->kind = T_CLASS; } $c->name = $class_name; $parent_class = $rc->getParentClass(); $c->extends = $parent_class ? array($parent_class->getName()) : array(); $c->implements = $rc->getInterfaceNames(); $c->uses = self::$hasTraits ? $rc->getTraitNames() : array(); foreach ($rc->getMethods() as $rm) { $method_name = $rm->getName(); if (isset(self::$overrideInternalClasses[$class_name]) && isset(self::$overrideInternalClasses[$class_name][$method_name])) { $m = $this->getFunctionFromString(self::$overrideInternalClasses[$class_name][$method_name]); } else { $m = $this->getMethodByReflection($rm); } $m->className = $class_name; $c->methods[] = $m; } foreach ($rc->getConstants() as $name => $value) { $const = $this->getConstantByReflection($name); $const->className = $class_name; $c->constants[] = $const; } foreach ($rc->getProperties() as $rp) { $p = $this->getPropertyByReflection($rp); $p->className = $class_name; $c->properties[] = $p; } return $c; }