1 內存耗盡問題
Allowed memory size of xxx bytes exhausted
查詢大量數(shù)據(jù)的,如果出現(xiàn)如下情況,就說明最大內存已經(jīng)耗盡:
普通解決方案
可臨時修改腳本使用內存大小進行處理:
ini_set ( 'memory_limit' , '2048M' );
2 內存到達瓶頸之后就需要考慮采用非緩沖模式了
緩沖模式
默認情況下,查詢使用緩沖模式
數(shù)據(jù)庫的查詢結果會從Mysql服務器傳輸?shù)絇HP,保存在進程內存中.而且結果集在沒有釋放之前需要相當多的內存來保存,空間換速度.
緩沖模式由于整個結果集一次存儲,所以很方便的進行計數(shù),遍歷,指針移動等操作.
注意:
當使用libmysqlclient作為庫時肠骆,PHP的內存限制將不會計算用于結果集的內存,除非將數(shù)據(jù)讀入PHP變量。與mysqlnd的內存占用將包括完整的結果集蟹腾。
無緩沖模式
- 無緩沖的MySQL查詢執(zhí)行查詢,同時數(shù)據(jù)等待從MySQL服務器進行獲取铺敌。
- PHP端使用較少的內存,但增加服務器上的負載踢涌。
由于緩沖查詢是默認的黔龟,下面的示例將演示如何使用每個API執(zhí)行無緩沖的查詢历等。
無緩沖查詢示例: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;
}
}
?>