php使用mysql_query查詢超大結果集超記憶體的解決方案,phpmysql_query_PHP教程

來源:互聯網
上載者:User

php使用mysql_query查詢超大結果集超記憶體的解決方案,phpmysql_query


再使用mysql_query查詢超大結果集的時候會出現超出記憶體限制的致命錯誤,這是因為mysql_query採用的是查詢全部結果然後把結果集全部緩衝到記憶體中的方式。

mysql的查詢還提供了另外一種查詢方式,函數名為mysql_unbuffered_query,這個函數採用的是查出結果後立即操作結果集,並不會把結果集緩衝到記憶體中,這樣就避免了超出記憶體的情況發生。但是使用這個方法的代價就是不能再查詢的時候使用擷取總行之類的方法,因為這種方法是便查詢邊返回結果。同時在使用該方法的時候不能在同一資料庫連結上執行其他的操作,想要執行其他動作的時候必須先終止當前操作,釋放所有未緩衝的sql查詢所產生的結果行,或者重新執行個體化一個資料庫連接,使用新連結進行其他動作。

以下是使用緩衝和不使用緩衝的對比(所查詢的表中有1000多萬行資料):

function selecttest()    {        try {            $pdo = new PDO("mysql:host=localhost;dbname=test", 'root', '123456');//            不使用緩衝結果集方式//            $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);            $sth = $pdo->prepare('select * from test');            $sth->execute();            echo '最初佔用記憶體大小:' . memory_get_usage() . "\n";            $i = 0;            while ($result = $sth->fetch(PDO::FETCH_ASSOC)) {                $i += 1;                if ($i > 10) {                    break;                }                sleep(1);                print_r($result);                echo '佔用記憶體大小:' . memory_get_usage() . "\n";            }        } catch (Exception $e) {            echo $e->getMessage();        }    }

上面使用到的是緩衝所有結果集的方式,運行該函數時將會報超記憶體的錯誤,如下所示:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 204800000 bytes) in E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php on line 57Call Stack:    0.0005     135392   1. {main}() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:0    0.0005     135568   2. test->selecttest() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:86    0.0055     142528   3. PDOStatement->execute() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:57

在執行$sth->execute();時超出記憶體限制;

將// $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);這行的注釋去掉後將使用不緩衝結果集的方式,運行該函數將輸出以下內容:

最初佔用記憶體大小:144808Array(    [id] => 1    [a] => v    [b] => w    [c] => i)佔用記憶體大小:145544Array(    [id] => 2    [a] => b    [b] => l    [c] => q)佔用記憶體大小:145544Array(    [id] => 3    [a] => m    [b] => p    [c] => h)佔用記憶體大小:145536Array(    [id] => 4    [a] => j    [b] => i    [c] => b)佔用記憶體大小:145536Array(    [id] => 5    [a] => q    [b] => g    [c] => g)佔用記憶體大小:145536

可以看到,使用不緩衝結果集的方式擷取一行結果所佔用的記憶體是極少的。這樣就結局了超出記憶體限制的問題。

http://www.bkjia.com/PHPjc/1108860.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1108860.htmlTechArticlephp使用mysql_query查詢超大結果集超記憶體的解決方案,phpmysql_query 再使用mysql_query查詢超大結果集的時候會出現超出記憶體限制的致命錯誤,這是...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.