缓冲和非缓冲查询可用于有限数量的记录。
例如,在使用缓冲方式实现查询的下载 CSV 时,在缓冲超过 30,000 条记录时会出现内存限制问题。
类似地,对于非缓冲,负载切换到数据库服务器。
如下所示,可以通过以下方式减少 Web(缓冲)和 MySQL(非缓冲)服务器上的这种负载,以支持 30,000+ 条记录的下载 CSV。
<?php
// Shell 命令。
$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 头部
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename={$csvFilename}");
header("Pragma: no-cache");
header("Expires: 0");
// 通过 shell 执行命令并回显整个输出作为字符串
echo shell_exec($shellCommand);
?>
对于 sed 正则表达式将会有少量的 CPU 消耗。