我有一個使用PHP(5.6.28)和Mysql編寫的休息API。我試圖實現的目標是從數據庫中提取135k條記錄。mysql statement-> fetch()循環失敗
查詢執行得很好,我可以得到好的行數。但是,在循環遍歷結果並將它們添加到數組中時,php會停止執行而不會出錯。我查了php錯誤(沒有錯誤記錄btw),增加最大執行時間(300secs),內存(256M)數量等。當從MySQL工作臺執行SQL查詢工作(完成15secs)。 PHP腳本死亡像16secs。
我們該如何調試?或者你的解決方案是什麼?您可以在下面找到代碼。
set_time_limit(300); //allow php to run until query completes
ini_set('max_execution_time', 300);
$sql = "SELECT client_delivery_item_dest_address1, client_delivery_item_dest_address3, client_delivery_item_volume,
client_delivery_item_transport_charge, client_delivery_item_waybill_number,client_deliveries.client_delivery_insert_date,
client_delivery_item_barcode
FROM client_deliveries
INNER JOIN client_delivery_items ON client_deliveries.client_delivery_id = client_delivery_items.client_delivery_id
WHERE " . $date_where . " " . $branch_where . "
AND client_deliveries.source_branch_id=3 AND client_deliveries.is_transfer=0
ORDER BY client_delivery_insert_date ASC";
$statement = $this->prepare($sql);
$statement->bind_result($client_delivery_item_dest_address1, $client_delivery_item_dest_address3, $client_delivery_item_volume,
$client_delivery_item_transport_charge, $client_delivery_item_waybill_number, $client_delivery_insert_date, $client_delivery_item_barcode);
//return array('sql' => $sql); used this to get the actual that is running
if (!$statement->execute()) {
return array('error' => "Execute failed: (" . $stmt->errno . ") " . $stmt->error); //execution doesnt fail apparently
}
$statement->store_result();
//return array('rowcount' => $statement->num_rows); returns 134411 it is the correct number of rows
while ($statement->fetch()) {
$delivery_item = array();
$delivery_item['store_code'] = $client_delivery_item_dest_address1;
$delivery_item['store_city'] = $client_delivery_item_dest_address3;
$delivery_item['volume'] = $client_delivery_item_volume;
$delivery_item['price'] = $client_delivery_item_transport_charge;
$delivery_item['waybill_number'] = $client_delivery_item_waybill_number;
$delivery_item['delivery_date'] = $client_delivery_insert_date;
$delivery_item['barcode'] = $client_delivery_item_barcode;
array_push($delivery_items, $delivery_item);
//return $delivery_items; returns first row correctly
}
//the execution dies before here
$statement->close();
return $delivery_items;
在處理了一定數量的行後,使用迭代器檢查內存使用量,結果發現腳本使用像285mb的ram,腳本因此失敗。我增加了內存限制,並解決了問題。有關如何減少內存消耗的任何想法? –