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