The bufferred and unbuffered queries can be used for a limited amount of records.
For example; while implementing download CSV for a query using buffered way, memory limit issues comes up above 30,000 records to be buffered.
Similarly, For unbuffered the load switched to database server.
This load on both the web (buffered) and MySQL (unbuffered) servers can be reduced as below supporting download CSV for 30,000+ records.
<?php
// Shell command.
$shellCommand = 'mysql '
. '--host='.escapeshellarg($hostname).' '
. '--user='.escapeshellarg($username).' '
. '--password='.escapeshellarg($password).' '
. '--database='.escapeshellarg($database).' '
. '--execute='.escapeshellarg($sql).' '
. '| sed -e \'s/"/""/g ; s/\t/","/g ; s/^/"/g ; s/$/"/g\'';
// CSV headers
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename={$csvFilename}");
header("Pragma: no-cache");
header("Expires: 0");
// Execute command via shell and echo the complete output as a string
echo shell_exec($shellCommand);
?>
There will be a bit of CPU consumption for the sed regex.Види:
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Види:
Референца за `mysqlinfo.concepts.buffering.php` со подобрена типографија и навигација.
Види:
Запитите по дифолт користат тампониран режим. Ова значи дека резултатите од запитот веднаш се пренесуваат од MySQL Server до PHP и потоа се чуваат во меморијата на PHP процесот. Ова овозможува дополнителни операции како броење на бројот на редови и поместување (прескокнување) на покажувачот на тековниот резултат. Исто така, овозможува издавање дополнителни запити на истата врска додека се работи на множеството резултати. Недостаток на тампонираниот режим е што поголемите множества резултати може да бараат доста меморија. Меморијата ќе биде окупирана додека не се отстранат сите референци за множеството резултати или додека множеството резултати не биде експлицитно ослободено, што најдоцна ќе се случи автоматски при крајот на барањето. Терминологијата „store result“ (зачувај резултат) исто така се користи за тампониран режим, бидејќи целиот сет на резултати се чува одеднаш.
Забелешка: Кога се користи libmysqlclient како библиотека, меморискиот лимит на PHP нема да ја брои меморијата искористена за множествата резултати, освен ако податоците не се преземени во PHP променливи. Со mysqlnd, меморијата што се зема предвид ќе го вклучува целиот сет на резултати.
Нетампонираните MySQL запити го извршуваат запитот, а потоа чекаат податоците од MySQL серверот да бидат преземени. Ова користи помалку меморија од страна на PHP, но може да го зголеми оптоварувањето на серверот. Освен ако целиот сет на резултати не е преземен од серверот, не можат да се испратат дополнителни запити преку истата врска. Нетампонираните запити може да се наречат и „use result“ (користи резултат). Откако ќе се преземат сите редови во множеството резултати, множеството резултати исчезнува и не може повторно да се итерира.
Следејќи ги овие карактеристики, нетампонираните запити треба да се користат само кога се очекува големо множество резултати што ќе се обработува последователно. Нетампонираните запити содржат голем број стапици што ги отежнуваат нивното користење, на пр. бројот на редови во множеството резултати не е познат додека не се преземе последниот ред. Тампонираните запити се полесен и пофлексибилен начин за обработка на множествата резултати.
Бидејќи тампонираните запити се стандардни, примерите подолу ќе покажат како да се извршуваат нетампонирани запити со секое API.
Пример #1 Пример за нетампониран запит: mysqli
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$unbufferedResult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT);
foreach ($unbufferedResult as $row) {
echo $row['Name'] . PHP_EOL;
}
?>Пример #2 Пример за нетампониран запит: pdo_mysql
<?php
$pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_password');
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$unbufferedResult = $pdo->query("SELECT Name FROM City");
foreach ($unbufferedResult as $row) {
echo $row['Name'] . PHP_EOL;
}
?>