You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
2.2 KiB

  1. <?php
  2. /**
  3. * @copyright NetMonsters <team@netmonsters.ru>
  4. * @link http://netmonsters.ru
  5. * @package Majestic
  6. * @subpackage App
  7. * @since 27.06.12
  8. *
  9. */
  10. /**
  11. * @desc CliController (run cli_class, end profiler)
  12. * @author Aleksandr Demidov
  13. */
  14. class CliController
  15. {
  16. /**
  17. * @var CliController
  18. */
  19. protected static $instance;
  20. protected $error_stream;
  21. protected function __construct()
  22. {
  23. ErrorHandler::init();
  24. $this->error_stream = Config::get('ErrorStream', 'php://stderr');
  25. }
  26. /**
  27. * Refuse cloning
  28. * @codeCoverageIgnoreStart
  29. */
  30. private function __clone()
  31. {
  32. }
  33. /**
  34. * @codeCoverageIgnoreEnd
  35. */
  36. /**
  37. * @static
  38. * @return CliController
  39. */
  40. public static function getInstance()
  41. {
  42. if (!isset(self::$instance)) {
  43. self::$instance = new self();
  44. }
  45. return self::$instance;
  46. }
  47. /**
  48. * @param iCli|string $cli
  49. * @throws ErrorException|GeneralException
  50. */
  51. public function execute($cli)
  52. {
  53. try {
  54. if (is_string($cli)) {
  55. if (!class_exists($cli)) {
  56. throw new GeneralException('Action class "' . $cli . '" not found.');
  57. }
  58. $cli = new $cli;
  59. }
  60. if (!in_array('iCli', class_implements($cli))) {
  61. throw new ErrorException('Runner "' . get_class($cli) . '" need implement of "iCli" interface.');
  62. }
  63. $cli->run();
  64. if (Config::get('PROFILER')) {
  65. $profile = Profiler::getInstance()->getCli();
  66. if (Config::get('LOGGING')) {
  67. Logger::getInstance()->log($profile);
  68. } else {
  69. echo $profile;
  70. }
  71. }
  72. }
  73. catch (Exception $e) {
  74. $code = $e->getCode();
  75. if ($e instanceof ErrorException) {
  76. $code = $e->getSeverity();
  77. }
  78. file_put_contents($this->error_stream, PHP_EOL . 'Error ' . '#' . $code . ': ' . $e->getMessage() . PHP_EOL, FILE_APPEND);
  79. file_put_contents($this->error_stream, PHP_EOL . 'Stack trace: ' . PHP_EOL . $e->getTraceAsString() . PHP_EOL, FILE_APPEND);
  80. }
  81. }
  82. }