PHP錯誤:Allowed memory size of xxx bytes(一)

來源:互聯網
上載者:User
在寫PHP程式的時候,需要處理的資料比較大的時候經常會出現“Allowed memory size of xxx bytes”這個問題,對這個問題一般也是去修改php.ini中的配置,那是一個很有效方法,但是有沒有其他的辦法來解決這個問題,當然是有,在這裡我會從資料庫查詢和讀檔案的兩個常用的例子來說說這個問題的解決思路。

文章中我使用的機器配置並不算高,是ubuntu 14.04的系統。

現有代碼是:

$sql = "select * from `user` order by `id`";$conn = mysql_connect($host, $user, $pwd);$db   = mysql_select_db($db_name);$result = mysql_query($sql);if ($result) {    while ($row = mysql_fetch_assoc($result)) {        // 一些操作的代碼        }}

果不其然,在我特意配置的小記憶體運行環境下出現了“Allowed memory size of xxx bytes” 的問題。

原文代碼處理是將所有資料先讀取資料進入記憶體,然後在進行處理,在資料超出配置的最大記憶體的時候,就出現了這個提示。

在php中這裡有個說法,一個是緩衝查詢,就是我們上面這種,另外一種就是非緩衝查詢,思路和處理流檔案的處理有些類似,只緩衝需要處理的資料,這樣雖然會增加一部分伺服器的負載,但是在記憶體上會有些最佳化。

比如在上面的範例中,我使用memory_get_usage();函數擷取的記憶體使用量為18973784 byte。下面我會展示三種寫法以及截取的他們記憶體的佔用情況,這樣的對比可能不是很準確,但是提供思路為主,拋磚引玉。

代碼1:

$conn = mysql_connect($host, $user, $pwd);$db   = mysql_select_db($db_name);$result = mysql_unbuffered_query($sql);if ($result) {    while ($row = mysql_fetch_assoc($result)) {            // 一些處理                }    }

這個和範例的區別在於mysql_unbuffered_query這個函數,計算的記憶體佔用為27392 byte。

代碼2:

$pdo = new PDO("mysql:host={$host};dbname={$db_name}", "{$user}", "{$pwd}");$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);$result = $pdo->query($sql);if ($result) {    while ($row = $result->fetch(PDO::FETCH_ASSOC)) {        // 一些處理的代碼        }}

代碼2使用了pdo,計算出來的記憶體佔用為 33672 byte

代碼3:

$mysqli  = new mysqli("{$host}", "{$user}", "{$pwd}", "{$db_name}");$result = $mysqli->query("{$sql}", MYSQLI_USE_RESULT);if ($result) {    while ($row = $result->fetch_assoc()) {           // 一些操作的代碼               }     }

代碼3使用的mysqli,記憶體的佔用是9008 byte

附:測試記憶體佔用使用的方法

$start = memory_get_usage();// 作業碼$end =  memory_get_usage();$used = $end - $limit;echo $used;

以上就是PHP錯誤:Allowed memory size of xxx bytes(一)的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.