mysqli_poll_reference.phpt 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. --TEST--
  2. mysqli_poll() & references
  3. --EXTENSIONS--
  4. mysqli
  5. --SKIPIF--
  6. <?php
  7. require_once('connect.inc');
  8. require_once('skipifconnectfailure.inc');
  9. if (!$IS_MYSQLND)
  10. die("skip mysqlnd only feature, compile PHP using --with-mysqli=mysqlnd");
  11. if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
  12. die("skip cannot connect");
  13. if (mysqli_get_server_version($link) < 50012)
  14. die("skip Test needs SQL function SLEEP() available as of MySQL 5.0.12");
  15. ?>
  16. --FILE--
  17. <?php
  18. require_once('connect.inc');
  19. function get_connection() {
  20. global $host, $user, $passwd, $db, $port, $socket;
  21. if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
  22. printf("[001] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
  23. return $link;
  24. }
  25. $mysqli1 = get_connection();
  26. $mysqli2 = get_connection();
  27. var_dump(mysqli_query($mysqli1, "SELECT SLEEP(0.10)", MYSQLI_ASYNC | MYSQLI_USE_RESULT));
  28. var_dump(mysqli_query($mysqli2, "SELECT SLEEP(0.20)", MYSQLI_ASYNC | MYSQLI_USE_RESULT));
  29. $processed = $loops = 0;
  30. do {
  31. $loops++;
  32. if ($loops > 10) {
  33. printf("[002] The queries should have finished already\n");
  34. break;
  35. }
  36. // WARNING: All arrays point to the same object - this will give bogus results!
  37. // The behaviour is in line with stream_select(). Be warned, be careful.
  38. $links = $errors = $reject = array($mysqli1, $mysqli2);
  39. if (0 == ($ready = mysqli_poll($links, $errors, $reject, 0, 50000))) {
  40. continue;
  41. }
  42. foreach ($links as $link) {
  43. if ($res = mysqli_reap_async_query($link)) {
  44. mysqli_free_result($res);
  45. }
  46. $processed++;
  47. }
  48. } while ($processed < 2);
  49. mysqli_close($mysqli1);
  50. mysqli_close($mysqli2);
  51. $mysqli1 = get_connection();
  52. $mysqli2 = get_connection();
  53. var_dump(mysqli_query($mysqli1, "SELECT SLEEP(0.10)", MYSQLI_ASYNC | MYSQLI_USE_RESULT));
  54. var_dump(mysqli_query($mysqli2, "SELECT SLEEP(0.20)", MYSQLI_ASYNC | MYSQLI_USE_RESULT));
  55. $processed = $loops = 0;
  56. do {
  57. $loops++;
  58. if ($loops > 10) {
  59. printf("[003] The queries should have finished already\n");
  60. break;
  61. }
  62. // WARNING: All arrays point to the same object - this will give bogus results!
  63. $links = $errors = array($mysqli1, $mysqli2);
  64. $reject = array($mysqli1, $mysqli2);
  65. if (0 == ($ready = mysqli_poll($links, $errors, $reject, 0, 50000))) {
  66. continue;
  67. }
  68. foreach ($links as $link) {
  69. if ($res = mysqli_reap_async_query($link)) {
  70. mysqli_free_result($res);
  71. }
  72. $processed++;
  73. }
  74. } while ($processed < 2);
  75. mysqli_close($mysqli1);
  76. mysqli_close($mysqli2);
  77. $mysqli1 = get_connection();
  78. $mysqli2 = get_connection();
  79. var_dump(mysqli_query($mysqli1, "SELECT SLEEP(0.10)", MYSQLI_ASYNC | MYSQLI_USE_RESULT));
  80. var_dump(mysqli_query($mysqli2, "SELECT SLEEP(0.20)", MYSQLI_ASYNC | MYSQLI_USE_RESULT));
  81. $processed = $loops = 0;
  82. do {
  83. $loops++;
  84. if ($loops > 10) {
  85. printf("[004] The queries should have finished already\n");
  86. break;
  87. }
  88. // WARNING: All arrays point to the same object - this will give bogus results!
  89. $links = array($mysqli1, $mysqli2);
  90. $errors = $reject = array($mysqli1, $mysqli2);
  91. if (0 == ($ready = mysqli_poll($links, $errors, $reject, 0, 50000))) {
  92. continue;
  93. }
  94. foreach ($links as $link) {
  95. if ($res = mysqli_reap_async_query($link)) {
  96. mysqli_free_result($res);
  97. }
  98. $processed++;
  99. }
  100. } while ($processed < 2);
  101. mysqli_close($mysqli1);
  102. mysqli_close($mysqli2);
  103. // This is bogus code and bogus usage - OK to throw no errors!
  104. $mysqli1 = get_connection();
  105. $mysqli2 = get_connection();
  106. var_dump(mysqli_query($mysqli1, "SELECT SLEEP(0.10)", MYSQLI_ASYNC | MYSQLI_USE_RESULT));
  107. $thread_id = mysqli_thread_id($mysqli2);
  108. printf("Connection %d should be rejected...\n", $thread_id);
  109. $processed = $loops = 0;
  110. do {
  111. $loops++;
  112. if ($loops > 10) {
  113. printf("[005] The queries should have finished already\n");
  114. break;
  115. }
  116. $links = $errors = $reject = array($mysqli1, $mysqli2);
  117. if (0 == ($ready = mysqli_poll($links, $errors, $reject, 0, 50000))) {
  118. continue;
  119. }
  120. // WARNING: Due to the reference issue none of these should ever fire!
  121. foreach ($reject as $link) {
  122. printf("Connection %d was rejected...\n", mysqli_thread_id($link));
  123. if (mysqli_thread_id($link) != $thread_id) {
  124. printf("[006] Connector %d should have been rejected. But also %d has been rejected.",
  125. $thread_id, mysqli_thread_id($link));
  126. }
  127. $processed++;
  128. }
  129. foreach ($errors as $link) {
  130. printf("Connection %d has an error...\n", mysqli_thread_id($link));
  131. $processed++;
  132. }
  133. foreach ($links as $link) {
  134. if ($res = mysqli_reap_async_query($link)) {
  135. mysqli_free_result($res);
  136. $processed++;
  137. }
  138. }
  139. } while ($processed < 2);
  140. mysqli_close($mysqli1);
  141. mysqli_close($mysqli2);
  142. $mysqli1 = get_connection();
  143. $mysqli2 = get_connection();
  144. var_dump(mysqli_query($mysqli1, "SELECT SLEEP(0.10)", MYSQLI_ASYNC | MYSQLI_USE_RESULT));
  145. var_dump(mysqli_query($mysqli2, "SELECT SLEEP(0.20)", MYSQLI_ASYNC | MYSQLI_USE_RESULT));
  146. $processed = $loops = 0;
  147. $all = array($mysqli1, $mysqli2);
  148. do {
  149. $loops++;
  150. if ($loops > 10) {
  151. printf("[006] The queries should have finished already\n");
  152. break;
  153. }
  154. $links = $errors = $reject = $all;
  155. ob_start();
  156. if (0 == ($ready = mysqli_poll($links, $errors, $reject, 0, 50000))) {
  157. $tmp = ob_get_contents();
  158. ob_end_clean();
  159. if ($tmp != '') {
  160. printf("Expected error:\n%s\n", $tmp);
  161. break;
  162. }
  163. continue;
  164. }
  165. foreach ($links as $link) {
  166. if ($res = mysqli_reap_async_query($link)) {
  167. mysqli_free_result($res);
  168. }
  169. $processed++;
  170. }
  171. } while ($processed < 2);
  172. $ready = mysqli_poll($links, $errors, $reject, 0, 50000);
  173. mysqli_close($mysqli1);
  174. mysqli_close($mysqli2);
  175. print "done!";
  176. ?>
  177. --EXPECTF--
  178. bool(true)
  179. bool(true)
  180. bool(true)
  181. bool(true)
  182. bool(true)
  183. bool(true)
  184. bool(true)
  185. Connection %d should be rejected...
  186. Connection %d was rejected...
  187. bool(true)
  188. bool(true)
  189. Warning: mysqli_poll(): All arrays passed are clear in %s on line %d
  190. done!