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.

69 lines
1.9 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. * @static
  28. * @return CliController
  29. */
  30. public static function getInstance()
  31. {
  32. if (!isset(self::$instance)) {
  33. self::$instance = new self();
  34. }
  35. return self::$instance;
  36. }
  37. /**
  38. * @param iCli $cli_class
  39. * @throws ErrorException
  40. */
  41. public function execute($cli_class)
  42. {
  43. try {
  44. if (!in_array('iCli', class_implements($cli_class))) {
  45. throw new ErrorException('Runner "' . get_class($cli_class) . '" need implement of "iCli" interface.');
  46. }
  47. $cli_class->run();
  48. if (Config::get('PROFILER')) {
  49. $profile = Profiler::getInstance()->getCli();
  50. if (Config::get('LOGGING')) {
  51. Logger::getInstance()->log($profile);
  52. } else {
  53. echo $profile;
  54. }
  55. }
  56. } catch (Exception $e) {
  57. $code = $e->getCode();
  58. if ($e instanceof ErrorException) {
  59. $code = $e->getSeverity();
  60. }
  61. file_put_contents($this->error_stream, PHP_EOL . 'Error ' . '#' . $code . ': ' . $e->getMessage() . PHP_EOL, FILE_APPEND);
  62. file_put_contents($this->error_stream, PHP_EOL . 'Stack trace: ' . PHP_EOL . $e->getTraceAsString() . PHP_EOL, FILE_APPEND);
  63. }
  64. }
  65. }