| <?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__]'; |
| } |
| } |
| } |
|
|