1. sfProjectOptimizeTask.class.php
  2. /** * Optimizes a project for better performance. * * @package symfony * @subpackage task * @author Fabien Potencier * @version SVN: $Id: sfProjectOptimizeTask.class.php 27511 2010-02-03 19:39:44Z FabianLange $ */
  3. class sfProjectOptimizeTask extends sfBaseTask
  4. {
  5. /**
  6. * @see sfTask
  7. */
  8. protected function configure()
  9. {
  10. $this->addArguments(array(
  11. new sfCommandArgument('application', sfCommandArgument::REQUIRED, 'The application name'),
  12. new sfCommandArgument('env', sfCommandArgument::OPTIONAL, 'The environment name', 'prod'),
  13. ));
  14. $this->namespace = 'project';
  15. $this->name = 'optimize';
  16. $this->briefDescription = 'Optimizes a project for better performance';
  17. $this->detailedDescription = <<<EOF
  18. The [project:optimize|INFO] optimizes a project for better performance:
  19. [./symfony project:optimize frontend prod|INFO]
  20. This task should only be used on a production server. Don't forget to re-run
  21. the task each time the project changes.
  22. EOF;
  23. }
  24. /**
  25. * @see sfTask
  26. */
  27. protected function execute($arguments = array(), $options = array())
  28. {
  29. $data = array();
  30. $modules = $this->findModules();
  31. $target = sfConfig::get('sf_cache_dir').'/'.$arguments['application'].'/'.$arguments['env'].'/config/configuration.php';
  32. // remove existing optimization file
  33. if (file_exists($target))
  34. {
  35. $this->getFilesystem()->remove($target);
  36. }
  37. // recreate configuration without the cache
  38. $this->setConfiguration($this->createConfiguration($this->configuration->getApplication(), $this->configuration->getEnvironment()));
  39. // initialize the context
  40. sfContext::createInstance($this->configuration);
  41. // force cache generation for generated modules
  42. foreach ($modules as $module)
  43. {
  44. $this->configuration->getConfigCache()->import('modules/'.$module.'/config/generator.yml', false, true);
  45. }
  46. $templates = $this->findTemplates($modules);
  47. $data['getTemplateDir'] = $this->optimizeGetTemplateDir($modules, $templates);
  48. $data['getControllerDirs'] = $this->optimizeGetControllerDirs($modules);
  49. $data['getPluginPaths'] = $this->configuration->getPluginPaths();
  50. $data['loadHelpers'] = $this->optimizeLoadHelpers($modules);
  51. if (!file_exists($directory = dirname($target)))
  52. {
  53. $this->getFilesystem()->mkdirs($directory);
  54. }
  55. $this->logSection('file+', $target);
  56. file_put_contents($target, '<?php return '.var_export($data, true).';');
  57. }
  58. protected function optimizeGetControllerDirs($modules)
  59. {
  60. $data = array();
  61. foreach ($modules as $module)
  62. {
  63. $data[$module] = $this->configuration->getControllerDirs($module);
  64. }
  65. return $data;
  66. }
  67. protected function optimizeGetTemplateDir($modules, $templates)
  68. {
  69. $data = array();
  70. foreach ($modules as $module)
  71. {
  72. $data[$module] = array();
  73. foreach ($templates[$module] as $template)
  74. {
  75. if (null !== $dir = $this->configuration->getTemplateDir($module, $template))
  76. {
  77. $data[$module][$template] = $dir;
  78. }
  79. }
  80. }
  81. return $data;
  82. }
  83. protected function optimizeLoadHelpers($modules)
  84. {
  85. $data = array();
  86. $finder = sfFinder::type('file')->name('*Helper.php');
  87. // module helpers
  88. foreach ($modules as $module)
  89. {
  90. $helpers = array();
  91. $dirs = $this->configuration->getHelperDirs($module);
  92. foreach ($finder->in($dirs[0]) as $file)
  93. {
  94. $helpers[basename($file, 'Helper.php')] = $file;
  95. }
  96. if (count($helpers))
  97. {
  98. $data[$module] = $helpers;
  99. }
  100. }
  101. // all other helpers
  102. foreach ($this->configuration->getHelperDirs() as $dir)
  103. {
  104. foreach ($finder->in($dir) as $file)
  105. {
  106. $helper = basename($file, 'Helper.php');
  107. if (!isset($data[''][$helper]))
  108. {
  109. $data[''][$helper] = $file;
  110. }
  111. }
  112. }
  113. return $data;
  114. }
  115. protected function findTemplates($modules)
  116. {
  117. $files = array();
  118. foreach ($modules as $module)
  119. {
  120. $files[$module] = sfFinder::type('file')->follow_link()->relative()->in($this->configuration->getTemplateDirs($module));
  121. }
  122. return $files;
  123. }
  124. protected function findModules()
  125. {
  126. // application
  127. $dirs = array(sfConfig::get('sf_app_module_dir'));
  128. // plugins
  129. foreach ($this->configuration->getPluginPaths() as $path)
  130. {
  131. $dirs[] = $path.'/modules';
  132. }
  133. // core modules
  134. $dirs[] = sfConfig::get('sf_symfony_lib_dir').'/controller';
  135. return array_unique(sfFinder::type('dir')->maxdepth(0)->follow_link()->relative()->in($dirs));
  136. }
  137. }

Debug toolbar