summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2016-10-26 15:17:09 +0300
committerDmitry Stogov <dmitry@zend.com>2016-10-26 15:17:09 +0300
commit3fb0a1a4e75f1049afe6f6950a4b7171b81ba8b0 (patch)
tree6f1381b637deec6c1671d72ae09f7a7776b21a0f
parent0f9a4af90bbaf35db41f2c5c9cfeb239e0576f7e (diff)
downloadphp-git-3fb0a1a4e75f1049afe6f6950a4b7171b81ba8b0.tar.gz
Fixded bug #72736 (Slow performance when fetching large dataset with mysqli / PDO)
-rw-r--r--NEWS4
-rw-r--r--Zend/zend_alloc.c11
2 files changed, 14 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index 20411a64ce..be6738ae74 100644
--- a/NEWS
+++ b/NEWS
@@ -2,7 +2,9 @@ PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? ??? 2016 PHP 7.0.14
-
+- Core:
+ . Fixded bug #72736 (Slow performance when fetching large dataset with mysqli
+ / PDO). (Dmitry)
10 Nov 2016 PHP 7.0.13
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c
index 40eb10046f..937340d9c9 100644
--- a/Zend/zend_alloc.c
+++ b/Zend/zend_alloc.c
@@ -897,6 +897,7 @@ static void *zend_mm_alloc_pages(zend_mm_heap *heap, int pages_count ZEND_FILE_L
{
zend_mm_chunk *chunk = heap->main_chunk;
int page_num, len;
+ int steps = 0;
while (1) {
if (UNEXPECTED(chunk->free_pages < pages_count)) {
@@ -1073,10 +1074,20 @@ get_chunk:
goto found;
} else {
chunk = chunk->next;
+ steps++;
}
}
found:
+ if (steps > 2 && pages_count < 8) {
+ /* move chunk into the head of the linked-list */
+ chunk->prev->next = chunk->next;
+ chunk->next->prev = chunk->prev;
+ chunk->next = heap->main_chunk->next;
+ chunk->prev = heap->main_chunk;
+ chunk->prev->next = chunk;
+ chunk->next->prev = chunk;
+ }
/* mark run as allocated */
chunk->free_pages -= pages_count;
zend_mm_bitset_set_range(chunk->free_map, page_num, pages_count);