*/ class Response { /** * @var */ protected static $type; /** * @var array */ protected static $types = ['html', 'json', 'xml', 'jsonp', 'png', 'gif', 'jpg', 'jpeg']; /** * @var bool */ protected static $autoRender = true; /** * @return string */ public static function getType(): string { if (self::$type) { return self::$type; } elseif (Request::isAjax()) { return 'json'; } else { return 'html'; } } /** * @param $type * @return bool */ public static function setType(string $type) { if (in_array($type, self::$types)) { return self::$type = $type; } else { return false; } } /** * @return string */ protected static function getMime(): string { switch (self::$type) { case 'json': return 'application/json'; case 'xml': return 'text/xml'; case 'html': return 'text/html'; case 'png': return 'image/png'; case 'jpg': case 'jpeg': return 'image/jpg'; case 'gif': return 'image/gif'; default: return 'text/html'; } } /** * */ public static function setHeader(): void { if (!headers_sent()) { //设置系统的输出字符 $charset = in_array(self::getType(), ['json', 'jsonp', 'xml']) ? 'utf-8' : (Config::get('template.output_charset', 'utf-8') == 'big5' ? 'utf-8' : Config::get('template.output_charset')); header("Content-Type: " . self::getMime() . "; charset={$charset}"); if (self::getType() == 'html') { // 支持页面回跳 header("Cache-control: private"); // 防止被框架引用 header('X-Frame-Options: sameorigin'); } //版权标识 header("X-Powered-By: PTcms Studio (www.ptcms.com)"); // 跨域 暂时不做统一处理 // if (self::$type == 'json') { // header('Access-Control-Allow-Origin:*'); // header('Access-Control-Allow-Headers:accept, content-type'); // } } } /** * @param string $content */ public static function setBody($content = ''): void { if (!headers_sent()) { self::setHeader(); } echo $content; } /** * 终止相应 */ public static function finish() { exit(); } /** * */ public static function disableRender(): void { self::$autoRender = false; } /** * */ public static function enableRender(): void { self::$autoRender = true; } /** * @return bool */ public static function isAutoRender(): bool { return self::$autoRender; } /** * @param $url * @param int $code */ public static function redirect(string $url, $code = 302): void { if (!headers_sent()) { if ($code == 302) { header('HTTP/1.1 302 Moved Temporarily'); header('Status:302 Moved Temporarily'); // 确保FastCGI模式下正常 } else { header('HTTP/1.1 301 Moved Permanently'); header('Status:301 Moved Permanently'); } header('Location: ' . $url); exit; } else { echo ''; } } /** * @return mixed|string */ public static function runInfo() { if (Config::get('is_gen_html')) { return ''; } $tpl = Config::get('runinfo', 'Power by PTCMS, Processed in {time}(s), Memory usage: {mem}MB.'); $from[] = '{time}'; $to[] = number_format(microtime(true) - Registry::get('_startTime'), 3); $from[] = '{mem}'; $to[] = number_format((memory_get_usage() - Registry::get('_startUseMems')) / 1024 / 1024, 3); if (strpos($tpl, '{net}')) { $from[] = '{net}'; $to[] = Registry::get('_apinum', 0); } if (strpos($tpl, '{file}')) { $from[] = '{file}'; $to[] = count(get_included_files()); } if (strpos($tpl, '{sql}')) { $from[] = '{sql}'; $to[] = Registry::get('_sqlnum', 0); } if (strpos($tpl, '{cacheread}')) { $from[] = '{cacheread}'; $to[] = Registry::get('_cacheRead', 0); } if (strpos($tpl, '{cachewrite}')) { $from[] = '{cachewrite}'; $to[] = Registry::get('_cacheWrite', 0); } if (strpos($tpl, '{cachehit}')) { $from[] = '{cachehit}'; $to[] = Registry::get('_cacheHit', 0); } $runtimeinfo = str_replace($from, $to, $tpl); return $runtimeinfo; } /** * 下载文件 * * @param $con * @param $name * @param string $type */ public static function download(string $con, string $name, $type = 'str') { $length = ($type == 'file') ? filesize($con) : strlen($con); header("Content-type: application/octet-stream"); header("Accept-Ranges: bytes"); header("Content-Length: " . $length); header('Pragma: cache'); header('Cache-Control: public, must-revalidate, max-age=0'); header('Content-Disposition: attachment; filename="' . urlencode($name) . '"; charset=utf-8'); //下载显示的名字,注意格式 header("Content-Transfer-Encoding: binary "); if ($type == 'file') { readfile($con); } else { echo $con; } } /** * 屏幕输出 * * @param $text * @param $type * @param $line * @return mixed */ public static function screen(string $text, string $type, bool $line = true) { switch ($type) { case 'success': $color = 'green'; break; case 'error': $color = 'red'; break; case 'warning': $color = "orangered"; break; case 'info': $color = 'darkblue'; break; default: $color = $type; } $line = $line ? '
' . PHP_EOL : ''; $text = nl2br($text); if ($color) { echo "{$text}{$line}"; } else { echo "{$text}{$line}"; } if (Config::get('app.fastcgi_buffer_fill')) { echo str_repeat(' ', 1024 * Config::get('app.fastcgi_buffer_size', 128)); } ob_flush(); flush(); } /** * 终端输出 * * @param string $text * @param string $type * @param bool $line * @return mixed */ public static function terminal(string $text, string $type = '', $line = true) { $end = chr(27) . "[0m"; switch (strtolower($type)) { case "success": $pre = chr(27) . "[32m"; //Green break; case "error": $pre = chr(27) . "[31m"; //Red break; case "warning": $pre = chr(27) . "[33m"; //Yellow break; case 'info': $pre = chr(27) . '[36m'; //蓝色 break; default: $pre = ""; $end = ''; } $line = $line ? PHP_EOL : ''; if (stripos($text, '
', '

', '
', '
'], PHP_EOL, $text); } $text = strip_tags($text); $text = preg_replace("#" . PHP_EOL . "+?#", PHP_EOL, $text); return $pre . $text . $end . $line; } public static function error(string $message, string $file, int $line) { if (PHP_SAPI == 'cli') { debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); echo PHP_EOL; $debug = debug_backtrace(); $traces = end($debug); if (isset($traces['args']['0']->xdebug_message)) { exit(PHP_EOL . trim($traces['args']['0']->xdebug_message) . PHP_EOL); } else { exit($message . '[' . $file . ':' . $line . ']' . PHP_EOL); } } else { if (Config::get('app.debug')) { $e['message'] = $message; $e['file'] = $file; $e['line'] = $line; include KX_ROOT . '/kuxin/tpl/error.php'; } else { header('HTTP/1.1 404 Not Found'); header("status: 404 Not Found"); Log::record(sprintf("%s [%s:%s]", $message, $file, $line)); $file = KX_ROOT . (Config::get('system.spider_error_page') && Request::isSpider() ? '/spider.html' : '/error.html'); if (is_file($file)) { $content = file_get_contents($file); $content = str_replace(['{$sitename}', '{$siteurl}', '{$msg}', '{$tongji}'], [Config::get('sitename'), Config::get('siteurl'), $message, Config::get('tongji.pc')], $content); } else { $content = '页面出现错误'; } self::setBody($content); } self::finish(); } } /** * @param $arr */ public static function debug($arr) { echo '
';
        print_r($arr);
        echo '
', PHP_EOL; } public static function nocache() { header('Expires: Thu, 01 Jan 1970 00:00:01 GMT'); header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); header('Cache-Control: no-cache, must-revalidate, max-age=0'); header('Pragma: no-cache'); } }