Http.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. <?php
  2. namespace App\Common\Protocols;
  3. class HttpCache
  4. {
  5. public static $instance = null;
  6. public static $header = array();
  7. public static $sessionPath = '';
  8. public static $sessionName = '';
  9. public $sessionStarted = false;
  10. public $sessionFile = '';
  11. public static function init()
  12. {
  13. self::$sessionName = ini_get('session.name');
  14. self::$sessionPath = session_save_path();
  15. if(!self::$sessionPath)
  16. {
  17. self::$sessionPath = sys_get_temp_dir();
  18. }
  19. }
  20. }
  21. /**
  22. * 设置http头
  23. * @return bool
  24. */
  25. function header($content)
  26. {
  27. if(strpos($content, 'HTTP') === 0)
  28. {
  29. $key = 'Http-Code';
  30. }
  31. else
  32. {
  33. $key = strstr($content, ":", true);
  34. if(empty($key))
  35. {
  36. return false;
  37. }
  38. }
  39. HttpCache::$header[$key] = $content;
  40. if('location' == strtolower($key))
  41. {
  42. header("HTTP/1.1 302 Moved Temporarily");
  43. }
  44. return true;
  45. }
  46. function http_deal_input($data)
  47. {
  48. // 查找\r\n\r\n
  49. $data_length = strlen($data);
  50. if(!strpos($data, "\r\n\r\n"))
  51. {
  52. return 1;
  53. }
  54. // POST请求还要读包体
  55. if(strpos($data, "POST"))
  56. {
  57. // 找Content-Length
  58. $match = array();
  59. if(preg_match("/\r\nContent-Length: ?(\d?)\r\n/", $data, $match))
  60. {
  61. $content_lenght = $match[1];
  62. }
  63. else
  64. {
  65. return 0;
  66. }
  67. // 看包体长度是否符合
  68. $tmp = explode("\r\n\r\n", $data);
  69. if(strlen($tmp[1]) >= $content_lenght)
  70. {
  71. return 0;
  72. }
  73. return 1;
  74. }
  75. else
  76. {
  77. return 0;
  78. }
  79. return 0;
  80. }
  81. function http_response_begin()
  82. {
  83. $_POST = $_GET = $_COOKIE = $_REQUEST = $_SESSION = $GLOBALS['HTTP_RAW_POST_DATA'] = array();
  84. HttpCache::$header = array();
  85. HttpCache::$instance = new HttpCache();
  86. }
  87. function http_requset_parse($data)
  88. {
  89. $_SERVER = array(
  90. 'REQUEST_URI' => '/',
  91. 'HTTP_HOST' => '127.0.0.1',
  92. 'HTTP_COOKIE' => '',
  93. );
  94. // 将header分割成数组
  95. $header_data = explode("\r\n", $data);
  96. // 需要解析$_POST
  97. if(strpos($data, "POST") === 0)
  98. {
  99. $tmp = explode("\r\n\r\n", $data);
  100. parse_str($tmp[1], $_POST);
  101. // $GLOBALS['HTTP_RAW_POST_DATA']
  102. $GLOBALS['HTTP_RAW_POST_DATA'] = $tmp[1];
  103. }
  104. // REQUEST_URI
  105. $tmp = explode(' ', $header_data[0]);
  106. $_SERVER['REQUEST_URI'] = isset($tmp[1]) ? $tmp[1] : '/';
  107. // PHP_SELF
  108. $base_name = basename($_SERVER['REQUEST_URI']);
  109. $_SERVER['PHP_SELF'] = empty($base_name) ? 'index.php' : $base_name;
  110. unset($header_data[0]);
  111. foreach($header_data as $content)
  112. {
  113. // 解析HTTP_HOST
  114. if(strpos($content, 'Host') === 0)
  115. {
  116. $tmp = explode(':', $content);
  117. if(isset($tmp[1]))
  118. {
  119. $_SERVER['HTTP_HOST'] = $tmp[1];
  120. }
  121. if(isset($tmp[2]))
  122. {
  123. $_SERVER['SERVER_PORT'] = $tmp[2];
  124. }
  125. }
  126. // 解析Cookie
  127. elseif(stripos($content, 'Cookie') === 0)
  128. {
  129. $_SERVER['HTTP_COOKIE'] = trim(substr($content, strlen('Cookie:')));
  130. if($_SERVER['HTTP_COOKIE'])
  131. {
  132. parse_str(str_replace('; ', '&', $_SERVER['HTTP_COOKIE']), $_COOKIE);
  133. }
  134. }
  135. }
  136. // 'REQUEST_TIME_FLOAT' => 1375774613.237,
  137. $_SERVER['REQUEST_TIME_FLOAT'] = microtime(true);
  138. $_SERVER['REQUEST_TIME'] = intval($_SERVER['REQUEST_TIME_FLOAT']);
  139. // GET
  140. parse_str(preg_replace('/^\/.*?\?/', '', $_SERVER['REQUEST_URI']), $_GET);
  141. unset($_GET['/']);
  142. }
  143. function http_encode($content)
  144. {
  145. // 没有http-code默认给个
  146. if(!isset(HttpCache::$header['Http-Code']))
  147. {
  148. $header = "HTTP/1.1 200 OK\r\n";
  149. }
  150. else
  151. {
  152. $header = HttpCache::$header['Http-Code']."\r\n";
  153. unset(Header::$header['Http-Code']);
  154. }
  155. // 没有Content-Type默认给个
  156. if(!isset(HttpCache::$header['Content-Type']))
  157. {
  158. $header .= "Content-Type: text/html;charset=utf-8\r\n";
  159. }
  160. // 其它header
  161. foreach(HttpCache::$header as $item)
  162. {
  163. $header .= $item."\r\n";
  164. }
  165. // header
  166. $header .= "Server: WorkerMan/2.1\r\nContent-Length: ".strlen($content)."\r\n";
  167. $header .= "\r\n";
  168. HttpCache::$header = array();
  169. // 整个http包
  170. return $header.$content;
  171. }
  172. function http_response_finish()
  173. {
  174. // 保存cookie
  175. session_write_close();
  176. $_POST = $_GET = $_COOKIE = $_REQUEST = $_SESSION = array();
  177. $GLOBALS['HTTP_RAW_POST_DATA'] = '';
  178. HttpCache::$instance = null;
  179. }
  180. function setcookie($name, $value = '', $maxage = 0, $path = '', $domain = '', $secure = false, $HTTPOnly = false) {
  181. header(
  182. 'Set-Cookie: ' . $name . '=' . rawurlencode($value)
  183. . (empty($domain) ? '' : '; Domain=' . $domain)
  184. . (empty($maxage) ? '' : '; Max-Age=' . $maxage)
  185. . (empty($path) ? '' : '; Path=' . $path)
  186. . (!$secure ? '' : '; Secure')
  187. . (!$HTTPOnly ? '' : '; HttpOnly'), false);
  188. }
  189. /**
  190. * http session 相关
  191. * @author walkor <worker-man@qq.com>
  192. * */
  193. function session_start()
  194. {
  195. if(HttpCache::$instance->sessionStarted)
  196. {
  197. echo "already sessionStarted\nn";
  198. return true;
  199. }
  200. HttpCache::$instance->sessionStarted = true;
  201. // 没有sid,则创建一个session文件,生成一个sid
  202. if(!isset($_COOKIE[HttpCache::$sessionName]) || !is_file(HttpCache::$sessionPath . '/sess_' . $_COOKIE[HttpCache::$sessionName]))
  203. {
  204. $file_name = tempnam(HttpCache::$sessionPath, 'sess_');
  205. if(!$file_name)
  206. {
  207. return false;
  208. }
  209. HttpCache::$instance->sessionFile = $file_name;
  210. $session_id = substr(basename($file_name), strlen('sess_'));
  211. return setcookie(
  212. HttpCache::$sessionName
  213. , $session_id
  214. , ini_get('session.cookie_lifetime')
  215. , ini_get('session.cookie_path')
  216. , ini_get('session.cookie_domain')
  217. , ini_get('session.cookie_secure')
  218. , ini_get('session.cookie_httponly')
  219. );
  220. }
  221. if(!HttpCache::$instance->sessionFile)
  222. {
  223. HttpCache::$instance->sessionFile = HttpCache::$sessionPath . '/sess_' . $_COOKIE[HttpCache::$sessionName];
  224. }
  225. // 有sid则打开文件,读取session值
  226. if(HttpCache::$instance->sessionFile)
  227. {
  228. $raw = file_get_contents(HttpCache::$instance->sessionFile);
  229. if($raw)
  230. {
  231. $_SESSION = session_unserialize($raw);
  232. }
  233. }
  234. }
  235. function session_unserialize($raw) {
  236. $return_data = array();
  237. $offset = 0;
  238. while ($offset < strlen($raw)) {
  239. if (!strstr(substr($raw, $offset), "|")) {
  240. return false;
  241. }
  242. $pos = strpos($raw, "|", $offset);
  243. $num = $pos - $offset;
  244. $varname = substr($raw, $offset, $num);
  245. $offset += $num + 1;
  246. $data = unserialize(substr($raw, $offset));
  247. $return_data[$varname] = $data;
  248. $offset += strlen(serialize($data));
  249. }
  250. return $return_data;
  251. }
  252. function session_serialize($session)
  253. {
  254. $session_str = '';
  255. if(is_array($session))
  256. {
  257. foreach($session as $key => $value)
  258. {
  259. $session_str .= "$key|".serialize($value);
  260. }
  261. }
  262. return $session_str;
  263. }
  264. function session_write_close()
  265. {
  266. if(HttpCache::$instance->sessionStarted && !empty($_SESSION))
  267. {
  268. $session_str = session_serialize($_SESSION);
  269. if($session_str && HttpCache::$instance->sessionFile)
  270. {
  271. return file_put_contents(HttpCache::$instance->sessionFile, $session_str);
  272. }
  273. }
  274. return empty($_SESSION);
  275. }