<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
namespace Behavior;

/**
 * 系统行为扩展：运行时间信息显示
 */
class ShowRuntimeBehavior
{

    // 行为扩展的执行入口必须是run
    public function run(&$content)
    {
        if (C('SHOW_RUN_TIME')) {
            if (false !== strpos($content, '{__NORUNTIME__}')) {
                $content = str_replace('{__NORUNTIME__}', '', $content);
            } else {
                $runtime = $this->showTime();
                if (strpos($content, '{__RUNTIME__}')) {
                    $content = str_replace('{__RUNTIME__}', $runtime, $content);
                } else {
                    $content .= $runtime;
                }

            }
        } else {
            $content = str_replace(array('{__NORUNTIME__}', '{__RUNTIME__}'), '', $content);
        }
    }

    /**
     * 显示运行时间、数据库操作、缓存次数、内存使用信息
     * @access private
     * @return string
     */
    private function showTime()
    {
        // 显示运行时间
        G('beginTime', $GLOBALS['_beginTime']);
        G('viewEndTime');
        $showTime = 'Process: ' . G('beginTime', 'viewEndTime') . 's ';
        if (C('SHOW_ADV_TIME')) {
            // 显示详细运行时间
            $showTime .= '( Load:' . G('beginTime', 'loadTime') . 's Init:' . G('loadTime', 'initTime') . 's Exec:' . G('initTime', 'viewStartTime') . 's Template:' . G('viewStartTime', 'viewEndTime') . 's )';
        }
        if (C('SHOW_DB_TIMES')) {
            // 显示数据库操作次数
            $showTime .= ' | DB :' . N('db_query') . ' queries ' . N('db_write') . ' writes ';
        }
        if (C('SHOW_CACHE_TIMES')) {
            // 显示缓存读写次数
            $showTime .= ' | Cache :' . N('cache_read') . ' gets ' . N('cache_write') . ' writes ';
        }
        if (MEMORY_LIMIT_ON && C('SHOW_USE_MEM')) {
            // 显示内存开销
            $showTime .= ' | UseMem:' . number_format((memory_get_usage() - $GLOBALS['_startUseMems']) / 1024) . ' kb';
        }
        if (C('SHOW_LOAD_FILE')) {
            $showTime .= ' | LoadFile:' . count(get_included_files());
        }
        if (C('SHOW_FUN_TIMES')) {
            $fun = get_defined_functions();
            $showTime .= ' | CallFun:' . count($fun['user']) . ',' . count($fun['internal']);
        }
        return $showTime;
    }
}
