*/
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'); } }