<?php
error_reporting(0);
// error_reporting(E_ALL);
// ini_set('display_errors', 'On');

if (version_compare(PHP_VERSION, '5.4.0', '<')) {
    exit('require php > 5.4.0 !');
}

function error_handler()
{
    $errors = func_get_args();
    if (count($errors) > 4) {
        array_pop($errors);
    }
    file_put_contents(__DIR__ . "/data/error/index_" . md5(serialize($errors)) . '.json', json_encode($errors, JSON_PRETTY_PRINT));
    file_put_contents(__DIR__ . "/data/error/index_" . md5(serialize($errors)) . '.log', serialize($errors));
}

// set_error_handler('error_handler', E_ALL);
set_error_handler('error_handler', E_ALL & ~E_NOTICE);
register_shutdown_function(function () {
    if ($error = error_get_last()) {
        if (in_array($error['type'], [E_ERROR, E_PARSE])) {
            call_user_func_array('error_handler', $error);
        }
    }
});


/**
 * 常量
 */
define('PHP_SESSION_ON', 1);
define('PHP_MEMCACHE_ON', 0);
define('PHP_MEMCACHE_PREFIX', 'hk04-001');


/**
 * SEO 优化
 */
ob_start();
register_shutdown_function(function () {
    $data = ob_get_clean();
    // $data = preg_replace_callback('#(href|src)="/([^/])#', function ($matches) {
    // return $matches[1] . '="'. $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . '/' . $matches[2];
    // }, $data);

    if (stripos($_SERVER['HTTP_USER_AGENT'], 'spider') !== false ||
        stripos($_SERVER['HTTP_USER_AGENT'], 'bot') !== false
    ) {
        $data = preg_replace('#<img class="([^"]*?lazy[^"]*?)" data-src#', '<img class="\\1" src', $data);
    }

    // if (isset($_GET['isAjax']) && (($s1 = stripos($data, '<!-- ajax-box -->')) !== false) && (($s2 = stripos($data, '<!-- /ajax-box -->')) !== false)) {
        // $data = substr($data, $s1, $s2 - $s1 + 18);
        // $data = str_replace('data-src=', 'src=', $data);
    // }

    echo $data;
});


/**
 * MEMCACHE 缓存
 */
if (isset($_GET['memcached-flush']) && (!PHP_MEMCACHE_ON || !extension_loaded('memcached'))) {
    // $files = (array)glob(sprintf('%s/data/%/json/*.json', ROOT, SITE_LANG_DIR));
    // array_walk($files, 'unlink');
    exit('-1');
}
if (PHP_MEMCACHE_ON && extension_loaded('memcached')) {
    $mid = md5(PHP_MEMCACHE_PREFIX . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);

    $memcached = new Memcached('mc');
    if (!$memcached->getServerList()) {
        $memcached->setOption(Memcached::OPT_PREFIX_KEY, PHP_MEMCACHE_PREFIX . '@');
        $memcached->setOption(Memcached::OPT_COMPRESSION, false);

        // local
        $memcached->setOption(Memcached::OPT_BINARY_PROTOCOL, false);
        $memcached->addServer('127.0.0.1', 11211);

        // aliyun
        // $memcached->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
        // $memcached->addServer('9110e7004c1c40af.m.cnqdalicm9pub001.ocs.aliyuncs.com', 11211);
    }

    // flush cache
    if (isset($_GET['memcached-flush'])) {
        $mkeys = $memcached->getAllKeys();
        $mkeys = array_filter($mkeys, function ($item) {
            return preg_match('/^' . PHP_MEMCACHE_PREFIX . '@/', $item);
        });
        $mkeys = array_map(function ($item) {
            return str_replace(PHP_MEMCACHE_PREFIX . '@', '', $item);
        }, $mkeys);

        print_r($mkeys);
        $mkeys && $memcached->deleteMulti($mkeys, 0);

        exit('1');
    }

    if (isCanMemcachedURI($_SERVER['REQUEST_URI'])) {
        // read cache
        if ($data = $memcached->get($mid)) {
            header('Content-Cache: ' . PHP_MEMCACHE_PREFIX . '@' . $mid);
            ob_exit($data, true);
        }

        // write cache
        ob_start();
        register_shutdown_function(function ($mid, $memcached) {
            $data = ob_get_clean();
            $data = minify($data);

            if (!strpos($data, '/404/404.png')) {
                $data = gzencode($data);
                $memcached->set($mid, $data, 0);
            } else {
                $data = gzencode($data);
            }

            $memcached->quit();
            ob_exit($data, false);
        }, $mid, $memcached);
    }
}


/**
 * [send_unauthorized description]
 * @return [type] [description]
 */
function send_unauthorized()
{
    header('HTTP/1.0 401 Unauthorized');
    header('WWW-Authenticate: Basic realm="username: hi, password: ***"');
    echo "You don't have permission to access {$_SERVER['REQUEST_URI']} on this server.";
    exit;
}


/**
 * [ob_exit description]
 */
function ob_exit($data, $exit = true)
{
    $time = microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'];
    header('Content-Time: ' . intval($time * 1000) . 'ms');

    if (stripos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false) {
        header('Content-Encoding: gzip');
        echo $data;
    } else {
        echo gzdecode($data);
    }
    $exit && exit();
}


/**
 * 格式化成单行
 */
function minify($buffer)
{
    // 替换 <pre>
    $pre_arr = [];
    $buffer  = preg_replace_callback('#<pre([^>]*)>(.*?)</pre>#s', function ($matchs) use (&$pre_arr) {
        $key             = '@pre-' . md5($matchs[0]);
        $pre_arr[ $key ] = $matchs[0];

        return $key;
    }, $buffer);

    // 除去空白字符
    $pattern = array(
        '#\>[^\S ]+#s' => '>',   // strip whitespaces after tags, except space
        '#[^\S ]+\<#s' => '<',   // strip whitespaces before tags, except space
        '#(\s)+#s'     => '\\1', // shorten multiple whitespace sequences
    );

    $buffer = preg_replace(array_keys($pattern), array_values($pattern), $buffer);

    // 还原 <pre>
    $buffer = str_replace(array_keys($pre_arr), array_values($pre_arr), $buffer);

    return $buffer;
}


function isCanMemcachedURI($uri)
{
    if ($uri === '/') {
        return true;
    }

    if (stripos($uri, 'contact.html') !== false) {
        return false;
    }

    if (preg_match('/\.html(\?(pageid|keywords).+)?$/', $uri)) {
        return true;
    }

    return false;
}


define('APP_ID', 'www');
define('PHPOK_SET', true);

//定义应用的根目录！（这个不是系统的根目录）本程序将应用目录限制在独立应用下
define("ROOT", str_replace('\\', '/', __DIR__ . '/'));

//定义框架
define('FRAMEWORK', ROOT . 'framework/');


//检测是否已安装，如未安装跳转到安装页面
//建议您在安装成功后去除这个判断。
// if(!is_file(ROOT . 'data/install.lock')) {
//  header('Location: install/index.php');
//  exit;
// }

require_once(FRAMEWORK . 'init.php');



# vim: syntax=php ts=4 sw=4 sts=4 sr noet
