pdo_mysql_pconnect.phpt 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. --TEST--
  2. MySQL PDO->__construct(), PDO::ATTR_PERSISTENT
  3. --SKIPIF--
  4. <?php
  5. require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc');
  6. require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
  7. MySQLPDOTest::skip();
  8. ?>
  9. --FILE--
  10. <?php
  11. require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
  12. try {
  13. $dsn = MySQLPDOTest::getDSN();
  14. $user = PDO_MYSQL_TEST_USER;
  15. $pass = PDO_MYSQL_TEST_PASS;
  16. $db1 = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));
  17. $db2 = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));
  18. $db1->exec('SET @pdo_persistent_connection=1');
  19. $stmt = $db2->query('SELECT @pdo_persistent_connection as _pers');
  20. $tmp = $stmt->fetch(PDO::FETCH_ASSOC);
  21. if ($tmp['_pers'] !== '1')
  22. printf("[001] Both handles should use the same connection.");
  23. $stmt = $db1->query('SELECT CONNECTION_ID() as _con1');
  24. $tmp = $stmt->fetch(PDO::FETCH_ASSOC);
  25. $con1 = $tmp['_con1'];
  26. $stmt = $db2->query('SELECT CONNECTION_ID() as _con2');
  27. $tmp = $stmt->fetch(PDO::FETCH_ASSOC);
  28. $con2 = $tmp['_con2'];
  29. if ($con1 !== $con2)
  30. printf("[002] Both handles should report the same MySQL thread ID");
  31. $db1 = NULL; /* should be equal to closing to my understanding */
  32. $db1 = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));
  33. $stmt = $db1->query('SELECT CONNECTION_ID() as _con1');
  34. $tmp = $stmt->fetch(PDO::FETCH_ASSOC);
  35. $con1 = $tmp['_con1'];
  36. if ($con1 !== $con2)
  37. printf("[003] Both handles should report the same MySQL thread ID");
  38. $affected = $db1->exec(sprintf('KILL %d', $con1));
  39. // Server needs some think-time sometimes
  40. sleep(1);
  41. if ('00000' == $db1->errorCode()) {
  42. // looks like KILL has worked ? Or not... TODO: why no warning with libmysql?!
  43. @$db1->exec("SET @pdo_persistent_connection=2");
  44. // but now I want to see some error...
  45. if ('HY000' != $db1->errorCode())
  46. printf("[004] Wrong error code %s\n", $db1->errorCode());
  47. $tmp = implode(' ', $db1->errorInfo());
  48. if (!strstr($tmp, '2006'))
  49. printf("[005] Wrong error info %s\n", $tmp);
  50. }
  51. $db1 = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => false));
  52. $stmt = $db1->query('SELECT CONNECTION_ID() as _con1');
  53. $tmp = $stmt->fetch(PDO::FETCH_ASSOC);
  54. $con1 = $tmp['_con1'];
  55. @$db2 = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));
  56. $stmt = $db2->query('SELECT CONNECTION_ID() as _con2');
  57. $tmp = $stmt->fetch(PDO::FETCH_ASSOC);
  58. $con2 = $tmp['_con2'];
  59. if ($con1 == $con2)
  60. printf("[006] Looks like the persistent and the non persistent connection are using the same link?!\n");
  61. // lets go crazy and create a few pconnections...
  62. $connections = array();
  63. for ($i = 0; $i <= 20; $i++) {
  64. $connections[$i] = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));
  65. }
  66. do {
  67. $i = mt_rand(0, 20);
  68. if (isset($connections[$i]))
  69. unset($connections[$i]);
  70. } while (!empty($connections));
  71. } catch (PDOException $e) {
  72. printf("[001] %s, [%s] %s [%s] %s\n",
  73. $e->getMessage(),
  74. (is_object($db1)) ? $db1->errorCode() : 'n/a',
  75. (is_object($db1)) ? implode(' ', $db1->errorInfo()) : 'n/a',
  76. (is_object($db2)) ? $db2->errorCode() : 'n/a',
  77. (is_object($db2)) ? implode(' ', $db2->errorInfo()) : 'n/a');
  78. }
  79. print "done!";
  80. ?>
  81. --EXPECT--
  82. done!