1 内存耗尽问题
Allowed memory size of xxx bytes exhausted
查询大量数据的,如果出现如下情况,就说明最大内存已经耗尽:
普通解决方案
可临时修改脚本使用内存大小进行处理:
ini_set ( 'memory_limit' , '2048M' );
2 内存到达瓶颈之后就需要考虑采用非缓冲模式了
缓冲模式
默认情况下,查询使用缓冲模式
数据库的查询结果会从Mysql服务器传输到PHP,保存在进程内存中.而且结果集在没有释放之前需要相当多的内存来保存,空间换速度.
缓冲模式由于整个结果集一次存储,所以很方便的进行计数,遍历,指针移动等操作.
注意:
当使用libmysqlclient作为库时,PHP的内存限制将不会计算用于结果集的内存,除非将数据读入PHP变量。与mysqlnd的内存占用将包括完整的结果集。
无缓冲模式
- 无缓冲的MySQL查询执行查询,同时数据等待从MySQL服务器进行获取。
- PHP端使用较少的内存,但增加服务器上的负载。
由于缓冲查询是默认的,下面的示例将演示如何使用每个API执行无缓冲的查询。
无缓冲查询示例:mysqli
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$uresult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT);
if ($uresult) {
while ($row = $uresult->fetch_assoc()) {
echo $row['Name'] . PHP_EOL;
}
}
$uresult->close();
?>
无缓冲查询示例:pdo_mysql
<?php
$pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass');
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$uresult = $pdo->query("SELECT Name FROM City");
if ($uresult) {
while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) {
echo $row['Name'] . PHP_EOL;
}
}
?>
无缓冲查询示例:mysql
<?php
$conn = mysql_connect("localhost", "my_user", "my_pass");
$db = mysql_select_db("world");
$uresult = mysql_unbuffered_query("SELECT Name FROM City");
if ($uresult) {
while ($row = mysql_fetch_assoc($uresult)) {
echo $row['Name'] . PHP_EOL;
}
}
?>