में क्वेरी परिणाम कैसे संग्रहीत किए जाते हैं जब मैंने डेटाबेस में कोई प्रश्न किया और परिणामों को mysqli_result में पुनर्प्राप्त किया, तो स्मृति उपयोग बहुत छोटा है। हालांकि, जब मैं क्वेरी परिणामों में सभी पंक्तियों को एक सहयोगी सरणी में लाता हूं, तो स्मृति उपयोग बहुत अधिक हो जाता है।PHP: mysqli_result
<?php
require_once("../config.php"); //db connection config
$db = new mysqli(DB_HOST,DB_USER,DB_PASSWORD,DB_DBASE);
$query ="select * from table_name";
if($r = $db->query($query)){
echo "MEMORY USAGE before : ". memory_get_usage()."<br><br>";
$rows = array();
while($row = $r->fetch_assoc()){
$rows[]= $row;
}
echo "MEMORY USAGE after : ". memory_get_usage()."<br><br>";
//before: 660880
//after: 114655768
// # of records: around 30 thousands
?>
यह मेरे लिए समझ में आता है कि इस सारे परिणाम भंडारण बहुत स्मृति लेने वाली है, लेकिन मैं अभी कैसे आ mysqli_result इतना छोटा है सोच रहा हूँ। ऐसा नहीं हो सकता है कि हर बार fetch_assoc कहलाता है जब परिणाम dbase के लिए पूछताछ की जाती है। तो फिर स्मृति में संग्रहीत परिणाम कहां हैं।
मैंने कहीं पढ़ा है कि 'mysql_ *' फ़ंक्शंस सर्वर से सभी परिणाम पंक्तियों को एक साथ लाता है। हालांकि पीडीओ (और संभवतः mysqli) मांग पर प्रत्येक पंक्ति को पुनः प्राप्त करें। इसलिए प्रत्येक कॉल लाने के लिए, आप थोड़ी मेमोरी का उपयोग करने जा रहे हैं। लेकिन आप प्रत्येक पंक्ति को सरणी में संग्रहीत करते हैं, इसलिए यह समझ में आता है कि आपकी मेमोरी उपयोग जमा हो जाएगी। –
क्या आपका मतलब है कि प्रत्येक कॉल लाने के साथ, mysqli परिणाम के लिए डेटाबेस से पूछेगा? – spchuang
मेरी समझ से, जब आप 'क्वेरी()' MySQL कॉल करते हैं तो क्वेरी निष्पादित करता है और सभी परिणाम पंक्तियों को PHP पर वापस करने के लिए तैयार करता है। हालांकि, अगर mysqli पीडीओ (कम से कम पीडीओ का डिफ़ॉल्ट) की तरह है, तो जब तक आप कॉल नहीं करते हैं तब तक पंक्तियां प्राप्त करना शुरू नहीं होगा। जब तक आप 'fetchAll() 'को कॉल नहीं करते हैं, तब तक प्रत्येक पंक्ति एक बार में पुनर्प्राप्त की जाएगी। इसका मतलब है कि आपका मेमोरी उपयोग इसलिए है क्योंकि आपने परिणामों को सरणी में सहेजा है, न कि mysqli के कारण। –