IndexController.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. <?php
  2. namespace ImiApp\ApiServer\Controller;
  3. use Imi\Db\Db;
  4. use Imi\RequestContext;
  5. use ImiApp\Model\World;
  6. use ImiApp\Model\Fortune;
  7. use Imi\Redis\RedisManager;
  8. use Imi\Util\Stream\MemoryStream;
  9. use Imi\Controller\HttpController;
  10. use Imi\Server\View\Annotation\View;
  11. use Imi\Server\Route\Annotation\Route;
  12. use Imi\Server\Route\Annotation\Action;
  13. use Imi\Server\Route\Annotation\Controller;
  14. /**
  15. * @Controller("/")
  16. */
  17. class IndexController extends HttpController
  18. {
  19. /**
  20. * @Action
  21. *
  22. * @return void
  23. */
  24. public function json()
  25. {
  26. return ['message' => 'Hello, World!'];
  27. }
  28. /**
  29. * @Action
  30. * @View(renderType="html")
  31. *
  32. * @return void
  33. */
  34. public function plaintext()
  35. {
  36. return RequestContext::get('response')->withHeader('Content-Type', 'text/plain; charset=utf-8')->write('Hello, World!');
  37. }
  38. /**
  39. * @Action
  40. *
  41. * @return void
  42. */
  43. public function dbModel()
  44. {
  45. return World::find(\mt_rand(1, 10000));
  46. }
  47. /**
  48. * @Action
  49. *
  50. * @return void
  51. */
  52. public function dbQueryBuilder()
  53. {
  54. return Db::query()->from('World')->field('id', 'randomNumber')->where('id', '=', \mt_rand(1, 10000))->limit(1)->select()->get();
  55. }
  56. /**
  57. * @Action
  58. *
  59. * @return void
  60. */
  61. public function dbRaw()
  62. {
  63. $db = Db::getInstance();
  64. $stmt = $db->prepare('SELECT id, randomNumber FROM World WHERE id = ? LIMIT 1');
  65. $stmt->execute([\mt_rand(1, 10000)]);
  66. return $stmt->fetch();
  67. }
  68. /**
  69. * @Action
  70. *
  71. * @return void
  72. */
  73. public function queryModel($queries)
  74. {
  75. $queries = (int)$queries;
  76. if($queries > 1)
  77. {
  78. $queryCount = \min($queries, 500);
  79. }
  80. else
  81. {
  82. $queryCount = 1;
  83. }
  84. $list = [];
  85. while ($queryCount--)
  86. {
  87. $list[] = World::find(\mt_rand(1, 10000));
  88. }
  89. return $list;
  90. }
  91. /**
  92. * @Action
  93. *
  94. * @return void
  95. */
  96. public function queryQueryBuilder($queries)
  97. {
  98. $queries = (int)$queries;
  99. if($queries > 1)
  100. {
  101. $queryCount = \min($queries, 500);
  102. }
  103. else
  104. {
  105. $queryCount = 1;
  106. }
  107. $list = [];
  108. while ($queryCount--)
  109. {
  110. $list[] = Db::query()->from('World')->field('id', 'randomNumber')->where('id', '=', \mt_rand(1, 10000))->limit(1)->select()->get();
  111. }
  112. return $list;
  113. }
  114. /**
  115. * @Action
  116. *
  117. * @return void
  118. */
  119. public function queryRaw($queries)
  120. {
  121. $queries = (int)$queries;
  122. if($queries > 1)
  123. {
  124. $queryCount = \min($queries, 500);
  125. }
  126. else
  127. {
  128. $queryCount = 1;
  129. }
  130. $list = [];
  131. $db = Db::getInstance();
  132. $stmt = $db->prepare('SELECT id, randomNumber FROM World WHERE id = ? LIMIT 1');
  133. while ($queryCount--)
  134. {
  135. $stmt->execute([\mt_rand(1, 10000)]);
  136. $list[] = $stmt->fetch();
  137. }
  138. return $list;
  139. }
  140. /**
  141. * @Action
  142. * @View(renderType="html")
  143. *
  144. * @return void
  145. */
  146. public function fortunes()
  147. {
  148. RequestContext::use(function(&$context){
  149. $context['response'] = $context['response']->withHeader('Content-Type', 'text/html; charset=UTF-8');
  150. });
  151. $list = Fortune::select();
  152. $rows = [];
  153. foreach($list as $item)
  154. {
  155. $rows[$item->id] = $item->message;
  156. }
  157. $rows[0] = 'Additional fortune added at request time.';
  158. \asort($rows);
  159. return [
  160. 'rows' => $rows,
  161. ];
  162. }
  163. /**
  164. * @Action
  165. * @View(renderType="html")
  166. *
  167. * @return void
  168. */
  169. public function fortunesRaw()
  170. {
  171. $rows = [];
  172. foreach(Db::getInstance()->query('SELECT id, message FROM Fortune')->fetchAll() as $item)
  173. {
  174. $rows[$item['id']] = $item['message'];
  175. }
  176. $rows[0] = 'Additional fortune added at request time.';
  177. \asort($rows);
  178. $html = '';
  179. foreach ($rows as $id => $message)
  180. {
  181. $message = \htmlspecialchars($message, ENT_QUOTES, 'UTF-8');
  182. $html .= "<tr><td>{$id}</td><td>{$message}</td></tr>";
  183. }
  184. return RequestContext::get('response')->withHeader('Content-Type', 'text/html; charset=UTF-8')
  185. ->withBody(new MemoryStream("<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>{$html}</table></body></html>"));
  186. }
  187. /**
  188. * @Action
  189. *
  190. * @return void
  191. */
  192. public function updateModel($queries)
  193. {
  194. $queries = (int)$queries;
  195. if($queries > 1)
  196. {
  197. $queryCount = \min($queries, 500);
  198. }
  199. else
  200. {
  201. $queryCount = 1;
  202. }
  203. $list = [];
  204. while ($queryCount--)
  205. {
  206. $list[] = $row = World::find(\mt_rand(1, 10000));
  207. $row->randomNumber = \mt_rand(1, 10000);
  208. $row->update();
  209. }
  210. return $list;
  211. }
  212. /**
  213. * @Action
  214. *
  215. * @return void
  216. */
  217. public function updateQueryBuilder($queries)
  218. {
  219. $queries = (int)$queries;
  220. if($queries > 1)
  221. {
  222. $queryCount = \min($queries, 500);
  223. }
  224. else
  225. {
  226. $queryCount = 1;
  227. }
  228. $list = [];
  229. while ($queryCount--)
  230. {
  231. $id = \mt_rand(1, 10000);
  232. $row = Db::query()->from('World')->field('id', 'randomNumber')->where('id', '=', $id)->limit(1)->select()->get();
  233. $row['randomNumber'] = $randomNumber = \mt_rand(1, 10000);
  234. Db::query()->from('World')->where('id', '=', $id)->limit(1)->update([
  235. 'randomNumber' => $randomNumber,
  236. ]);
  237. $list[] = $row;
  238. }
  239. return $list;
  240. }
  241. /**
  242. * @Action
  243. *
  244. * @return void
  245. */
  246. public function updateRaw($queries)
  247. {
  248. $queries = (int)$queries;
  249. if($queries > 1)
  250. {
  251. $queryCount = \min($queries, 500);
  252. }
  253. else
  254. {
  255. $queryCount = 1;
  256. }
  257. $list = [];
  258. $db = Db::getInstance();
  259. $stmtSelect = $db->prepare('SELECT id, randomNumber FROM World WHERE id = ? LIMIT 1');
  260. $stmtUpdate = $db->prepare('UPDATE World SET randomNumber = ? WHERE id = ? LIMIT 1');
  261. while ($queryCount--)
  262. {
  263. $id = \mt_rand(1, 10000);
  264. $stmtSelect->execute([$id]);
  265. $row = $stmtSelect->fetch();
  266. $row['randomNumber'] = $randomNumber = \mt_rand(1, 10000);
  267. $stmtUpdate->execute([$randomNumber, $id]);
  268. $list[] = $row;
  269. }
  270. return $list;
  271. }
  272. /**
  273. * @Action
  274. * @Route("cached-worlds")
  275. *
  276. * @return void
  277. */
  278. public function cachedWorlds($count)
  279. {
  280. $count = (int)$count;
  281. if($count > 1)
  282. {
  283. $queryCount = \min($count, 500);
  284. }
  285. else
  286. {
  287. $queryCount = 1;
  288. }
  289. $ids = [];
  290. while ($queryCount--)
  291. {
  292. $ids[] = 'world:' . \mt_rand(1, 10000);
  293. }
  294. return RedisManager::getInstance()->mget($ids);
  295. }
  296. }