在寫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)!