|
|
<?php |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace think\console\command\optimize; |
|
|
|
|
|
use think\console\Command; |
|
|
use think\console\Input; |
|
|
use think\console\Output; |
|
|
|
|
|
class Route extends Command |
|
|
{ |
|
|
|
|
|
protected $output; |
|
|
|
|
|
protected function configure() |
|
|
{ |
|
|
$this->setName('optimize:route') |
|
|
->setDescription('Build route cache.'); |
|
|
} |
|
|
|
|
|
protected function execute(Input $input, Output $output) |
|
|
{ |
|
|
|
|
|
if (!is_dir(RUNTIME_PATH)) { |
|
|
@mkdir(RUNTIME_PATH, 0755, true); |
|
|
} |
|
|
|
|
|
file_put_contents(RUNTIME_PATH . 'route.php', $this->buildRouteCache()); |
|
|
$output->writeln('<info>Succeed!</info>'); |
|
|
} |
|
|
|
|
|
protected function buildRouteCache() |
|
|
{ |
|
|
$files = \think\Config::get('route_config_file'); |
|
|
foreach ($files as $file) { |
|
|
if (is_file(CONF_PATH . $file . CONF_EXT)) { |
|
|
$config = include CONF_PATH . $file . CONF_EXT; |
|
|
if (is_array($config)) { |
|
|
\think\Route::import($config); |
|
|
} |
|
|
} |
|
|
} |
|
|
$rules = \think\Route::rules(true); |
|
|
array_walk_recursive($rules, [$this, 'buildClosure']); |
|
|
$content = '<?php ' . PHP_EOL . 'return '; |
|
|
$content .= var_export($rules, true) . ';'; |
|
|
$content = str_replace(['\'[__start__', '__end__]\''], '', stripcslashes($content)); |
|
|
return $content; |
|
|
} |
|
|
|
|
|
protected function buildClosure(&$value) |
|
|
{ |
|
|
if ($value instanceof \Closure) { |
|
|
$reflection = new \ReflectionFunction($value); |
|
|
$startLine = $reflection->getStartLine(); |
|
|
$endLine = $reflection->getEndLine(); |
|
|
$file = $reflection->getFileName(); |
|
|
$item = file($file); |
|
|
$content = ''; |
|
|
for ($i = $startLine - 1; $i <= $endLine - 1; $i++) { |
|
|
$content .= $item[$i]; |
|
|
} |
|
|
$start = strpos($content, 'function'); |
|
|
$end = strrpos($content, '}'); |
|
|
$value = '[__start__' . substr($content, $start, $end - $start + 1) . '__end__]'; |
|
|
} |
|
|
} |
|
|
} |
|
|
|