/** * Prepare for statement and execute query * * @param string|Charcoal_String $sql SQL statement(placeholders can be included) * @param array|Charcoal_HashMap $params Parameter values for prepared statement * @param array|Charcoal_HashMap $driver_options Driver options * * @return PDOStatement */ private function _prepareExecute($sql, $params, $driver_options) { Charcoal_ParamTrait::validateString(1, $sql); Charcoal_ParamTrait::validateHashMap(2, $params, TRUE); Charcoal_ParamTrait::validateHashMap(3, $driver_options, TRUE); $params = um($params); $driver_options = um($driver_options); $params = $params ? $params : array(); $driver_options = $driver_options ? $driver_options : array(); $timer_handle = Charcoal_Benchmark::start(); $command_id = $this->command_id++; $params_disp = $params ? implode(',', $params) : ''; log_debug('data_source,sql,debug', "[ID]{$command_id} [SQL]{$sql}", self::TAG); log_debug('data_source,sql,debug', "[ID]{$command_id} [params]{$params_disp}", self::TAG); /** @var PDOStatement $stmt */ $stmt = $this->getConnection()->prepare($sql, $driver_options); $this->sql_histories->push(new Charcoal_SQLHistory($sql, $params)); $success = $stmt->execute($params); if (!$success) { list($sqlstate, $err_code, $err_msg) = $stmt->errorInfo(); $msg = "PDO#execute failed. [ID]{$command_id} [SQL]{$sql} [params]{$params_disp} [SQLSTATE]{$sqlstate} [ERR_CODE]{$err_code} [ERR_MSG]{$err_msg}"; log_error('data_source,sql,debug', "...FAILED: {$msg}", self::TAG); _throw(new Charcoal_DBDataSourceException($msg)); } $this->num_rows = $rows = $stmt->rowCount(); log_info('data_source,sql,debug', "[ID]{$command_id} ...success(numRows={$rows})", self::TAG); // ログ $elapse = Charcoal_Benchmark::stop($timer_handle); log_debug('data_source,sql,debug', "[ID]{$command_id} _prepareExecute() end. time=[{$elapse}]msec.", self::TAG); // SQL benchmark ini_set('serialize_precision', 16); log_debug('sql_bench', var_export(array($sql, $rows, $elapse), true), self::TAG); return $stmt; }
public function query(Charcoal_String $sql) { $flag = new Charcoal_ErrorReportingSwitcher(0, E_DEPRECATED); // 接続処理 $this->connect(); $timer_handle = Charcoal_Benchmark::start(); // SQLを実行して結果セットを得る $resultset = $this->_query($sql); // ログ $elapse = Charcoal_Benchmark::stop($timer_handle); log_debug('sql', "query() end. time=[{$elapse}]sec."); // 結果セットを返却 return $resultset; }
public function execute($request, $response, $session = NULL) { $timer_handle = Charcoal_Benchmark::start(); // Charcoal_ParamTrait::validateImplements( 1, 'Charcoal_IRequest', $request ); // Charcoal_ParamTrait::validateImplements( 2, 'Charcoal_IResponse', $response ); // Charcoal_ParamTrait::validateIsA( 3, 'Charcoal_Session', $session, TRUE ); $proc_path = $this->getObjectPath(); $proc_name = $proc_path->toString(); // log_info( "system", "procedure", "プロシージャ[$proc_name]を実行します。" ); //======================================= // タスクマネージャの作成 // // タスクマネージャを作成 $task_manager_name = $this->task_manager; $task_manager = $this->getSandbox()->createObject($task_manager_name, 'task_manager'); // log_info( "system", "procedure", "タスクマネージャ[$task_manager_name]を作成しました。" ); //======================================= // modules以下にクラスファイルがあればロードする // // log_info( "system", "procedure", 'loading module at procedure path:' . $proc_path ); Charcoal_ModuleLoader::loadModule($this->getSandbox(), $proc_path, $task_manager); // log_info( "system", "procedure", 'loaded module at procedure path:' . $proc_path ); //======================================= // 追加モジュールのロード // if ($this->modules) { // log_info( "system", "procedure", 'loading additional modules: ' . $this->modules . " of procedure: " . $proc_path ); foreach ($this->modules as $module_name) { if (strlen($module_name) === 0) { continue; } // load module Charcoal_ModuleLoader::loadModule($this->getSandbox(), $module_name, $task_manager); } // log_info( "system", "procedure", 'loaded additional modules.' ); } //======================================= // ステートフルタスクの復帰 // $use_session = b($this->getSandbox()->getProfile()->getBoolean('USE_SESSION')); if ($use_session->isTrue()) { // log_info( "system", "procedure", 'ステートフルタスクの復元を開始します。' ); $task_manager->restoreStatefulTasks($session); // log_info( "system", "procedure", 'ステートフルタスクを復元しました。' ); } //======================================= // シーケンスの復帰 // $sequence = NULL; $globalsequence = NULL; $localsequence = NULL; if ($use_session->isTrue()) { $seq_name = us($this->sequence); $seq_name = strlen($seq_name) > 0 ? $seq_name : 'local'; // restore global sequence // log_info( "system,sequence", "sequence", "starting restoring global sequence." ); $data_id = 'sequence://global'; $global_seq = NULL; if (isset($_SESSION[$data_id])) { $data = $_SESSION[$data_id]; $data = unserialize($data); if ($data instanceof Charcoal_Sequence) { $global_seq = $data; // log_info( "debug,sequence", "sequence", "restored global sequence:" . print_r($globalsequence,true) ); } } // restore local sequence // log_info( "system,sequence", "sequence", "starting restoring local sequence." ); // 復元 $data_id = 'sequence://' . $seq_name; $local_seq = NULL; if (isset($_SESSION[$data_id])) { $data = $_SESSION[$data_id]; $data = unserialize($data); if ($data instanceof Charcoal_Sequence) { $local_seq = $data; // log_info( "debug,sequence", "restored local sequence:" . print_r($localsequence,true) ); } } // merge global and local sequence $global_seq = $global_seq ? $global_seq : new Charcoal_Sequence(); $local_seq = $local_seq ? $local_seq : new Charcoal_Sequence(); $sequence = new Charcoal_SequenceHolder($global_seq, $local_seq); } //======================================= // create system event(request event) // // log_info( "system,debug,event", 'creating reqyest event.', 'event' ); // create request event $event = $this->getSandbox()->createEvent('request', array($request)); $task_manager->pushEvent($event); // log_info( "system,debug,event", 'pushed reqyest event to the event queue.', 'event' ); //======================================= // ユーザイベントの作成 // // log_info( "system", "procedure", 'ユーザイベントの作成処理を開始します。' ); $event_list = array(); if ($this->events) { foreach ($this->events as $event_name) { if (strlen($event_name) === 0) { continue; } $event = $this->getSandbox()->createEvent($event_name); $task_manager->pushEvent($event); } } //======================================= // イベント処理 // // log_info( "system", "procedure", "タスクマネージャによるイベント処理を開始します。" ); $context = new Charcoal_EventContext($this->getSandbox()); $context->setProcedure($this); $context->setRequest($request); $context->setSequence($sequence); $context->setResponse($response); $context->setTaskManager($task_manager); $exit_code = $task_manager->processEvents($context); if (!is_int($exit_code) && !$exit_code instanceof Charcoal_Integer) { // log_info( "system", "procedure", "異常な終了コードを検知しました。(" . gettype($exit_code) . ")。タスクマネージャは終了コードとして整数値のみ返却することができます。" ); _throw(new Charcoal_BadExitCodeException($exit_code)); } // log_info( "system", "procedure", "タスクマネージャによるイベント処理が完了しました。終了コード($exit_code)" ); //======================================= // 終了処理 // if ($use_session->isTrue()) { $seq_name = us($this->sequence); $seq_name = strlen($seq_name) > 0 ? $seq_name : 'local'; // globalシーケンスの保存 $data_id = 'sequence://global'; $session->set(s($data_id), $global_seq); // log_info( "debug,sequence", "globalsequence:" . print_r($globalsequence,true) ); // log_info( "system,sequence", "globalシーケンスを保存しました。" ); // localシーケンスの保存 $data_id = 'sequence://' . $seq_name; $session->set(s($data_id), $local_seq); // log_info( "debug,sequence", "localsequence:" . print_r($localsequence,true) ); // log_info( "system,sequence", "localシーケンス[$seq_name]を保存しました。" ); } // セッション情報の保存 if ($use_session->isTrue()) { // ステートフルタスクの保存 $task_manager->saveStatefulTasks($session); } $score = Charcoal_Benchmark::stop($timer_handle); log_debug('system, debug', "procedure execute method end: [{$score}] msec"); // log_info( "system", "procedure", "プロシージャ[$proc_name]を実行しました。" ); }
/** * process events * * @param Charcoal_IEventContext $context * * @return int * * @throws Charcoal_BusinessException|Charcoal_RuntimeException */ public function processEvents($context) { $debug = $this->getSandbox()->isDebug() || $context->getProcedure()->isDebugMode(); if ($debug) { log_debug('system,event', "processEvents start."); } // $procedure = $context->getProcedure(); // $request = $context->getRequest(); // $sequence = $context->getSequence(); // $response = $context->getResponse(); $max_event_loop = $this->max_event_loop; $exit_code = 0; try { $queue = $this->queue; $timer_all = Charcoal_Benchmark::start(); $loop_id = 0; while (!$queue->isEmpty()) { if ($debug) { log_debug('system,event', "event queue(" . count($queue) . "): {$queue}"); } // increment loop counter $loop_id++; // イベント一覧を優先度でソートする $queue->sortByPriority(); /** @var Charcoal_IEvent $event */ $event = $queue->dequeue(); /** @var string $event_name */ $event_name = $event->getObjectName(); /** @var Charcoal_ObjectPath $event_id */ $event_id = $event->getObjectPath(); $delete_event = FALSE; $context->setEvent($event); // if this event loop exceeds [max_event_loop], thro exception if ($loop_id > $max_event_loop) { log_warning("system,event", "[loop:{$loop_id}/{$event_name}] aborting by overflow maximum loop count[{$max_event_loop}].", "task_manager"); log_warning("system,event", "[loop:{$loop_id}/{$event_name}] event queue=[{$queue}].", "task_manager"); _throw(new Charcoal_EventLoopCounterOverflowException($max_event_loop)); } if ($debug) { log_debug('system,event', "[loop:{$loop_id}/{$event_name}] event loop start."); } // タスク一覧を優先度でソートする $key_priority = array(); foreach ($this->tasks as $key => $task) { $key_priority[$key] = ui($task->getPriority()); } $a_task_list = uv($this->tasks); array_multisort($key_priority, SORT_DESC, $a_task_list); $this->tasks = v($a_task_list); // task list to remove on end of this loop $remove_tasks = NULL; // すべてのタスクにイベントをディスパッチする if ($debug) { log_debug('system,event', "[loop:{$loop_id}/{$event_name}] task list: [{$this->tasks}]"); } foreach ($this->tasks as $task) { $task_name = $task->getObjectName(); $task_id = $task->getObjectPath(); if ($debug) { log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] event[{$event_name}] is dispatching to task[{$task_name}]."); } // イベントフィルタ $process = FALSE; $event_filters = $task->getEventFilters(); if ($debug) { log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] task event filter: " . $event_filters); } foreach ($event_filters as $filter) { if ($event_id->getObjectPathString() == us($filter)) { $process = TRUE; break; } } if (!$process) { if ($debug) { log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] event[{$event_name}] is NOT found in task's event filters: [{$event_filters}]. Passing this task."); } continue; } if ($debug) { log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] event[{$event_name}] is found in task's event filters: [{$event_filters}]."); } // task timer start $timer_task = Charcoal_Benchmark::start(); $result = NULL; try { $result = $task->processEvent($context); if ($debug) { log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] returned from processEvent with result:" . print_r($result, true)); } } catch (Charcoal_BusinessException $e) { // just handle the exception $exception_handled = $task->handleException($e, $context); if (b($exception_handled)->isFalse()) { // just re-throw the exception, if the exception was not handled by the task throw $e; } } catch (Charcoal_RuntimeException $e) { // write log and handle the exception _catch($e); $exception_handled = $task->handleException($e, $context); if (b($exception_handled)->isFalse()) { // write log and re-throw the exception, if the exception was not handled by the task _throw($e); } } // result value handling $result_str = NULL; if ($result === NULL) { $result_str = 'NULL'; } elseif ($result === FALSE || $result instanceof Charcoal_Boolean && $result->isFalse()) { $result_str = 'FALSE'; $result = FALSE; } elseif ($result === TRUE || $result instanceof Charcoal_Boolean && $result->isTrue()) { $result_str = 'TRUE'; $result = TRUE; } else { $msg = "processEvent() must return a [boolean] value. but returned:" . print_r($result, true); log_error('system,event,error', $msg, self::TAG); _throw(new Charcoal_ProcessEventAtTaskException($event, $task, $result, $msg)); } // task timer stop $elapse = Charcoal_Benchmark::stop($timer_task); log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] event was processed by task. result=[{$result_str}] time=[{$elapse}]msec."); // ポストアクション $post_actions = $task->getPostActions(); if ($debug) { log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] task post actions: {$post_actions}"); } if ($result && $post_actions) { foreach ($post_actions as $key => $action) { $target = NULL; $action = us($action); if (strpos(":", $action) !== FALSE) { list($action, $target) = explode(":", trim($action)); if ($debug) { log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] post action[{$action}] with target[{$target}]."); } } else { $action = trim($action); if ($debug) { log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] post action[{$action}]."); } } switch ($action) { case "remove_task": // タスク実行リストからタスクを削除 if (!$target) { $target = $task_id; } if ($target == $task_id) { if ($debug) { log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] task[{$target}] is marked to remove."); } $remove_tasks[] = $task_id; } break; case "remove_event": // イベントを削除 if (!$target) { $target = $event_id; } if ($target == $event_id) { if ($debug) { log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] event[{$target}] is marked to remove."); } $delete_event |= TRUE; } break; case "continue_event": // イベントをキューに再投入 break; } } } else { if ($debug) { log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] no post action is defined for event."); } } if ($debug) { log_debug('system,event', "[loop:{$loop_id}/{$event_name}] task loop end."); } } // task loop end // remove tasks if ($remove_tasks) { foreach ($remove_tasks as $task_id) { unset($this->tasks["{$task_id}"]); if ($debug) { log_debug('system,event', "[loop:{$loop_id}/{$event_name}] removed task: {$task_id}"); } } if ($debug) { log_debug('system,event', "[loop:{$loop_id}/{$event_name}] next task list: [{$this->tasks}]"); } } if (!$delete_event) { // push back the event into our event queue $this->pushEvent($event); } else { if ($debug) { log_debug('system,event', "[loop:{$loop_id}/{$event_name}] event[{$event}] is removed."); } } if ($debug) { log_debug('system,event', "[loop:{$loop_id}/{$event_name}] event loop end."); } } // event loop end if ($queue->isEmpty()) { if ($debug) { log_debug('system,event', "event queue is empty."); } $exit_code = Charcoal_Event::EXIT_CODE_OK; } // ログ $elapse = Charcoal_Benchmark::stop($timer_all); if ($debug) { log_debug('system,event', "event loop end. time=[{$elapse}]msec."); } } catch (Charcoal_RuntimeException $e) { _catch($e, true); if ($debug) { log_debug('system,event,debug', "an exception occured while processing event."); } _throw(new Charcoal_ProcessEventAtTaskManagerException($e)); } if ($debug) { log_debug('system,event', "processEvents end: exit_code=" . print_r($exit_code, true)); } return $exit_code; }
/** * Process core hook message */ public function processMessage($stage, $data) { $stage_name = parent::getCoreHookStageName($stage); switch ($stage) { case Charcoal_EnumCoreHookStage::START_OF_BOOTSTRAP: // starting message echo "[core stage:{$stage_name}] Starting framework bootstrap process." . eol(); echo "[core stage:{$stage_name}] ===============================================" . eol(); $ver = Charcoal_Framework::getVersion(); echo "[core stage:{$stage_name}] CharcoalPHP Framwrork version: {$ver}" . eol(); echo "[core stage:{$stage_name}] PHP version: " . PHP_VERSION . eol(); echo "[core stage:{$stage_name}] default_timezone: " . date_default_timezone_get() . eol(); echo "[core stage:{$stage_name}] ===============================================" . eol(); echo "[core stage:{$stage_name}] profile=[" . CHARCOAL_PROFILE . "]" . eol(); break; case Charcoal_EnumCoreHookStage::BEFORE_INIT_FRAMEWORK: echo "[core stage:{$stage_name}] Starting framework initialization process." . eol(); break; case Charcoal_EnumCoreHookStage::AFTER_INIT_FRAMEWORK: echo "[core stage:{$stage_name}] Finished framework initialization process." . eol(); break; case Charcoal_EnumCoreHookStage::BEFORE_REG_CLASS_LOADERS: echo "[core stage:{$stage_name}] Starting registering class loaders." . eol(); break; case Charcoal_EnumCoreHookStage::CREATE_FRAMEWORK_CLASS_LOADER: echo "[core stage:{$stage_name}] Created framework class loader." . eol(); break; case Charcoal_EnumCoreHookStage::REG_FRAMEWORK_CLASS_LOADER: echo "[core stage:{$stage_name}] Registered framework class loader." . eol(); break; case Charcoal_EnumCoreHookStage::CREATE_CLASS_LOADER: echo "[core stage:{$stage_name}] Created class loader: [{$data}]" . eol(); break; case Charcoal_EnumCoreHookStage::REG_CLASS_LOADER: echo "[core stage:{$stage_name}] Registered class loader: [{$data}]" . eol(); break; case Charcoal_EnumCoreHookStage::AFTER_REG_CLASS_LOADERS: echo "[core stage:{$stage_name}] Finished registering class loaders." . eol(); break; /* case Charcoal_EnumCoreHookStage::BEFORE_REG_EXCEPTION_HANDLERS: echo "[core stage:$stage_name] Starting registering exception handlers.". eol(); break; case Charcoal_EnumCoreHookStage::CREATE_EXCEPTION_HANDLER: echo "[core stage:$stage_name] Registered exception handler: [$data]". eol(); break; case Charcoal_EnumCoreHookStage::AFTER_REG_EXCEPTION_HANDLERS: echo "[core stage:$stage_name] Finished registering exception handlers.". eol(); break; case Charcoal_EnumCoreHookStage::BEFORE_REG_USER_LOGGERS: echo "[core stage:$stage_name] Starting registering loggers.". eol(); break; case Charcoal_EnumCoreHookStage::CREATE_USER_LOGGER: echo "[core stage:$stage_name] Registered logger: [" . $data . "]"); break; case Charcoal_EnumCoreHookStage::AFTER_REG_USER_LOGGERS: echo "[core stage:$stage_name] Finished registering loggers.". eol(); break; */ /* case Charcoal_EnumCoreHookStage::BEFORE_REG_EXCEPTION_HANDLERS: echo "[core stage:$stage_name] Starting registering exception handlers.". eol(); break; case Charcoal_EnumCoreHookStage::CREATE_EXCEPTION_HANDLER: echo "[core stage:$stage_name] Registered exception handler: [$data]". eol(); break; case Charcoal_EnumCoreHookStage::AFTER_REG_EXCEPTION_HANDLERS: echo "[core stage:$stage_name] Finished registering exception handlers.". eol(); break; case Charcoal_EnumCoreHookStage::BEFORE_REG_USER_LOGGERS: echo "[core stage:$stage_name] Starting registering loggers.". eol(); break; case Charcoal_EnumCoreHookStage::CREATE_USER_LOGGER: echo "[core stage:$stage_name] Registered logger: [" . $data . "]"); break; case Charcoal_EnumCoreHookStage::AFTER_REG_USER_LOGGERS: echo "[core stage:$stage_name] Finished registering loggers.". eol(); break; */ case Charcoal_EnumCoreHookStage::BEFORE_REG_EXTLIB_DIR: echo "[core stage:{$stage_name}] Starting registering external library paths." . eol(); break; case Charcoal_EnumCoreHookStage::ADD_EXTLIB_DIR: echo "[core stage:{$stage_name}] Registered external library path: [{$data}]" . eol(); break; case Charcoal_EnumCoreHookStage::AFTER_REG_EXTLIB_DIR: echo "[core stage:{$stage_name}] Finished registering external library paths." . eol(); break; case Charcoal_EnumCoreHookStage::BEFORE_SET_SESSION_HANDLER: echo "[core stage:{$stage_name}] Starting registering session handlers." . eol(); break; case Charcoal_EnumCoreHookStage::AFTER_SET_SESSION_HANDLER: echo "[core stage:{$stage_name}] Finished registering session handlers." . eol(); break; case Charcoal_EnumCoreHookStage::BEFORE_START_SESSION: echo "[core stage:{$stage_name}] Starting session." . eol(); break; case Charcoal_EnumCoreHookStage::AFTER_START_SESSION: echo "[core stage:{$stage_name}] Session started." . eol(); break; case Charcoal_EnumCoreHookStage::BEFORE_ROUTING_RULE: echo "[core stage:{$stage_name}] Starting creating routing rules." . eol(); break; case Charcoal_EnumCoreHookStage::AFTER_ROUTING_RULE: echo "[core stage:{$stage_name}] Finished creating routing rules." . eol(); break; case Charcoal_EnumCoreHookStage::BEFORE_ROUTER: echo "[core stage:{$stage_name}] Starting routing." . eol(); break; case Charcoal_EnumCoreHookStage::AFTER_ROUTER: echo "[core stage:{$stage_name}] Finished routing." . eol(); break; case Charcoal_EnumCoreHookStage::BEFORE_CREATE_PROCEDURE: echo "[core stage:{$stage_name}] Creating procedure: [{$data}]" . eol(); break; case Charcoal_EnumCoreHookStage::AFTER_CREATE_PROCEDURE: echo "[core stage:{$stage_name}] Created procedure: [{$data}]" . eol(); break; case Charcoal_EnumCoreHookStage::BEFORE_PROCEDURE_FORWARD: echo "[core stage:{$stage_name}] Starting procedure forwarding process." . eol(); break; case Charcoal_EnumCoreHookStage::PRE_PROCEDURE_FORWARD: echo "[core stage:{$stage_name}] Executing procedure forwarding." . eol(); break; case Charcoal_EnumCoreHookStage::POST_PROCEDURE_FORWARD: echo "[core stage:{$stage_name}] Executed procedure forwarding." . eol(); break; case Charcoal_EnumCoreHookStage::AFTER_PROCEDURE_FORWARD: echo "[core stage:{$stage_name}] Finished procedure forwarding process." . eol(); break; case Charcoal_EnumCoreHookStage::END_OF_BOOTSTRAP: $elapse = Charcoal_Benchmark::score(); echo "[core stage:{$stage_name}] Finished framework bootstrap process." . eol(); echo "[core stage:{$stage_name}] bootstrap processing time: [{$elapse}] msec" . eol(); break; case Charcoal_EnumCoreHookStage::PRE_EXECUTE_PROCEDURE: $proc_stack = Charcoal_Framework::getProcedureStack(); echo "[core stage:{$stage_name}] Executing procedure: [{$data}]" . eol(); echo "[core stage:{$stage_name}] procedure stack: [ " . Charcoal_System::implodeArray(",", $proc_stack) . " ]" . eol(); break; case Charcoal_EnumCoreHookStage::POST_EXECUTE_PROCEDURE: echo "[core stage:{$stage_name}] Executed procedure: [{$data}]" . eol(); break; case Charcoal_EnumCoreHookStage::AFTER_EXECUTE_PROCEDURES: echo "[core stage:{$stage_name}] Finished procedure executing process." . eol(); break; case Charcoal_EnumCoreHookStage::START_OF_SHUTDOWN: echo "[core stage:{$stage_name}] Started framework shutdown process." . eol(); break; case Charcoal_EnumCoreHookStage::BEFORE_SAVE_SESSION: echo "[core stage:{$stage_name}] Starting saving session data." . eol(); break; case Charcoal_EnumCoreHookStage::AFTER_SAVE_SESSION: echo "[core stage:{$stage_name}] Finished saving session data." . eol(); break; case Charcoal_EnumCoreHookStage::BEFORE_DESTROY_CONTAINER: echo "[core stage:{$stage_name}] Starting destroying container." . eol(); break; case Charcoal_EnumCoreHookStage::AFTER_DESTROY_CONTAINER: echo "[core stage:{$stage_name}] Finished destroying container." . eol(); break; /* case Charcoal_EnumCoreHookStage::BEFORE_TERMINATE_LOGGERS: echo "[core stage:$stage_name] Starting terminating loggers."); break; case Charcoal_EnumCoreHookStage::AFTER_TERMINATE_LOGGERS: echo "[core stage:$stage_name] Finished terminating loggers."); break; */ /* case Charcoal_EnumCoreHookStage::BEFORE_TERMINATE_LOGGERS: echo "[core stage:$stage_name] Starting terminating loggers."); break; case Charcoal_EnumCoreHookStage::AFTER_TERMINATE_LOGGERS: echo "[core stage:$stage_name] Finished terminating loggers."); break; */ case Charcoal_EnumCoreHookStage::END_OF_SHUTDOWN: echo "[core stage:{$stage_name}] Finished framework shutdown process." . eol(); if ($this->getSandbox()->isDebug()) { $peak_usage = memory_get_peak_usage(FALSE); $real_usage = memory_get_peak_usage(TRUE); $unit_peak = Charcoal_System::formatByteSize($peak_usage, 5); $unit_real = Charcoal_System::formatByteSize($real_usage, 5); echo "[core stage:{$stage_name}] memory peak usage: [{$unit_peak}] bytes" . eol(); echo "[core stage:{$stage_name}] memory real usage: [{$unit_real}] bytes" . eol(); } break; } }
/** * execute framework main code * * @param boolean $debug * @param Charcoal_Sandbox $sandbox */ public static function run($debug = NULL, $sandbox = NULL) { $th_run = Charcoal_Benchmark::start(); $mh_run = Charcoal_MemoryBenchmark::start(); // Charcoal_ParamTrait::validateBoolean( 1, $debug, TRUE ); // Charcoal_ParamTrait::validateSandbox( 2, $sandbox, TRUE ); if ($sandbox === NULL) { $sandbox = new Charcoal_Sandbox(CHARCOAL_PROFILE, $debug); } try { try { //ob_start(); self::_run($sandbox); //ob_end_flush(); } catch (Charcoal_ProcedureNotFoundException $ex) { _catch($ex); switch (CHARCOAL_RUNMODE) { // ランモードがhttpの時は404エラー case 'http': throw new Charcoal_HttpStatusException(404, $ex); break; // それ以外の場合はリスロー // それ以外の場合はリスロー default: _throw($ex); break; } } catch (Exception $ex) { _catch($ex); switch (CHARCOAL_RUNMODE) { // ランモードがhttpの時は500エラー case 'http': throw new Charcoal_HttpStatusException(500, $ex); break; // それ以外の場合はリスロー // それ以外の場合はリスロー default: _throw($ex); break; } } } catch (Charcoal_ProfileLoadingException $e) { echo 'profile loading failed:' . $e->getMessage(); exit; } catch (Exception $e) { _catch($e); // restore error handlers for avoiding infinite loop restore_error_handler(); restore_exception_handler(); self::handleException($e); // display debugtrace if ($debug || $sandbox->isDebug()) { self::$debugtrace_renderers->render($e); } self::$loggers->flush(); } catch (Throwable $e) { _catch($e); // restore error handlers for avoiding infinite loop restore_error_handler(); restore_exception_handler(); self::handleException($e); // display debugtrace if ($debug || $sandbox->isDebug()) { self::$debugtrace_renderers->render($e); } self::$loggers->flush(); } // finally process $timer_score = Charcoal_Benchmark::stop($th_run); log_debug('system, debug', sprintf("total framework process time: [%0.4f] msec", $timer_score)); // memory usage list($usage_1, $usage_2) = Charcoal_MemoryBenchmark::stop($mh_run); log_debug('system, debug', sprintf("used memory: [%d] bytes / [%d] bytes", $usage_1, $usage_2)); // memory peak usage $peak_usage_1 = Charcoal_MemoryUtil::convertSize(memory_get_peak_usage(true), Charcoal_EnumMemoryUnit::UNIT_B); $peak_usage_2 = Charcoal_MemoryUtil::convertSize(memory_get_peak_usage(false), Charcoal_EnumMemoryUnit::UNIT_B); log_debug('system, debug', sprintf("peak memory: [%d] bytes / [%d] bytes", $peak_usage_1, $peak_usage_2)); //Charcoal_Object::dump(); self::terminate(); }