mirror of
https://github.com/php/php-src.git
synced 2024-10-04 16:26:13 +00:00
150 lines
4.1 KiB
PHP
150 lines
4.1 KiB
PHP
--TEST--
|
|
mysqli_fetch_array() - large packages (to test compression)
|
|
--SKIPIF--
|
|
<?php
|
|
require_once('skipif.inc');
|
|
require_once('skipifconnectfailure.inc');
|
|
?>
|
|
--FILE--
|
|
<?php
|
|
include "connect.inc";
|
|
|
|
function mysqli_fetch_array_large($offset, $link, $package_size) {
|
|
|
|
/* we are aiming for maximum compression to test MYSQLI_CLIENT_COMPRESS */
|
|
$random_char = str_repeat('a', 255);
|
|
$sql = "INSERT INTO test(label) VALUES ";
|
|
|
|
while (strlen($sql) < ($package_size - 259))
|
|
$sql .= sprintf("('%s'), ", $random_char);
|
|
|
|
$sql = substr($sql, 0, -2);
|
|
assert(strlen($sql) < $package_size);
|
|
|
|
if (!@mysqli_query($link, $sql)) {
|
|
if (1153 == mysqli_errno($link) || stristr(mysqli_error($link), 'max_allowed_packet'))
|
|
/* [1153] Got a packet bigger than 'max_allowed_packet' bytes */
|
|
return false;
|
|
|
|
printf("[%03d + 1] [%d] %s\n", $offset, mysqli_errno($link), mysqli_error($link));
|
|
return false;
|
|
}
|
|
|
|
/* buffered result set - let's hope we do not run into PHP memory limit... */
|
|
if (!$res = mysqli_query($link, "SELECT id, label FROM test")) {
|
|
printf("[%03d + 2] [%d] %s\n", $offset, mysqli_errno($link), mysqli_error($link));
|
|
return false;
|
|
}
|
|
|
|
while ($row = mysqli_fetch_assoc($res)) {
|
|
if ($row['label'] != $random_char) {
|
|
printf("[%03d + 3] Wrong results - expecting '%s' got '%s', [%d] %s\n",
|
|
$offset, $random_char, $row['label'], mysqli_errno($link), mysqli_error($link));
|
|
return false;
|
|
}
|
|
}
|
|
mysqli_free_result($res);
|
|
|
|
if (!$stmt = mysqli_prepare($link, "SELECT id, label FROM test")) {
|
|
printf("[%03d + 4] [%d] %s\n", $offset, mysqli_errno($link), mysqli_error($link));
|
|
return false;
|
|
}
|
|
|
|
/* unbuffered result set */
|
|
if (!mysqli_stmt_execute($stmt)) {
|
|
printf("[%03d + 5] [%d] %s\n", $offset, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
|
|
return false;
|
|
}
|
|
|
|
$id = $label = NULL;
|
|
if (!mysqli_stmt_bind_result($stmt, $id, $label)) {
|
|
printf("[%03d + 6] [%d] %s\n", $offset, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
|
|
return false;
|
|
}
|
|
|
|
while (mysqli_stmt_fetch($stmt)) {
|
|
if ($label != $random_char) {
|
|
printf("[%03d + 7] Wrong results - expecting '%s' got '%s', [%d] %s\n",
|
|
$offset, $random_char, $label, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
|
|
return false;
|
|
}
|
|
}
|
|
|
|
mysqli_stmt_free_result($stmt);
|
|
mysqli_stmt_close($stmt);
|
|
|
|
return true;
|
|
}
|
|
|
|
function parse_memory_limit($limit) {
|
|
|
|
$val = trim($limit);
|
|
$last = strtolower($val[strlen($val)-1]);
|
|
|
|
switch($last) {
|
|
// The 'G' modifier is available since PHP 5.1.0
|
|
case 'g':
|
|
$val *= 1024;
|
|
case 'm':
|
|
$val *= 1024;
|
|
case 'k':
|
|
$val *= 1024;
|
|
default:
|
|
break;
|
|
}
|
|
return $val;
|
|
}
|
|
|
|
|
|
if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) {
|
|
printf("[001] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
|
|
$host, $user, $db, $port, $socket);
|
|
}
|
|
|
|
if (!mysqli_query($link, "DROP TABLE IF EXISTS test") ||
|
|
!mysqli_query($link, sprintf("CREATE TABLE test(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, label VARCHAR(255)) ENGINE = %s", $engine)))
|
|
printf("[002] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
|
|
|
|
$package_size = 524288;
|
|
$offset = 3;
|
|
$limit = (ini_get('memory_limit') > 0) ? parse_memory_limit(ini_get('memory_limit')) : pow(2, 32);
|
|
|
|
/* try to respect php.ini but make run time a soft limit */
|
|
$max_runtime = (ini_get('max_execution_time') > 0) ? ini_get('max_execution_time') : 30;
|
|
set_time_limit(0);
|
|
|
|
do {
|
|
if ($package_size > $limit) {
|
|
printf("stop: memory limit - %s vs. %s\n", $package_size, $limit);
|
|
break;
|
|
}
|
|
|
|
$start = microtime(true);
|
|
if (!mysqli_fetch_array_large($offset++, $link, $package_size)) {
|
|
printf("stop: packet size - %d\n", $package_size);
|
|
break;
|
|
}
|
|
|
|
$duration = microtime(true) - $start;
|
|
$max_runtime -= $duration;
|
|
if ($max_runtime < ($duration * 3)) {
|
|
/* likely the next iteration will not be within max_execution_time */
|
|
printf("stop: time limit - %2.2fs\n", $max_runtime);
|
|
break;
|
|
}
|
|
|
|
$package_size += $package_size;
|
|
|
|
} while (true);
|
|
|
|
|
|
mysqli_close($link);
|
|
print "done!";
|
|
?>
|
|
--CLEAN--
|
|
<?php
|
|
require_once("clean_table.inc");
|
|
?>
|
|
--EXPECTF--
|
|
stop: %s
|
|
done!
|