English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
سيظهر رسالة غير كافية عند استعلام البيانات الكبيرة من قاعدة البيانات:
PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted
هذه المشكلة تُسمى على موقع PHP الرسمي بـ "البحث المميز والغير مميز" (Buffered and Unbuffered queries). نمط البحث الافتراضي في PHP هو البحث المميز. هذا يعني أن نتيجة البحث يتم جمعها جميعًا في الذاكرة مرة واحدة لتقديمها للبرنامج PHP للمعالجة. مما يمنح البرنامج المزيد من المزايا مثل حساب عدد الصفوف، تحريك السهم إلى صف معين، وما إلى ذلك. والأهم من ذلك، يمكن للبرنامج التحقق من مجموعة البيانات مرة أخرى وتطبيق الفلاتر والمعالجات المختلفة. ولكن عيوب نمط البحث المميز هو استهلاك الذاكرة، أي استبدال السرعة بالفضاء.
على العكس من ذلك، النمط الآخر للبحث في PHP هو البحث غير المميز، حيث يرجع الخادم للبيانات خطوة بخطوة بدلاً من إرجاعها جميعًا دفعة واحدة، مما يؤدي إلى استهلاك أقل للذاكرة من قبل برنامج PHP، ولكن زيادة في ضغط الخادم لأن قاعدة البيانات ستنتظر إلى أن يأخذ PHP البيانات حتى يتم جمعها جميعًا.
من الواضح أن نمط البحث المميز يناسب البحث في كميات بسيطة من البيانات، بينما يناسب البحث غير المميز كميات كبيرة من البيانات.
بالطبع، جميعنا نعرف نمط البحث المميز في PHP، لكن سأقوم بتقديم أمثلة على كيفية تنفيذ API البحث غير المميز.
الطريقة الأولى للبحث غير الم缓冲: mysqli
<?php $mysqli = new mysqli("localhost", "my_user", "my_password", "world"); $uresult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT); if ($uresult) { while ($row = $uresult->fetch_assoc()) { echo $row['Name'] . PHP_EOL; } } $uresult->close(); ?>
الطريقة الثانية للبحث غير الم缓冲: pdo_mysql
<?php $pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass'); $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); $uresult = $pdo->query("SELECT Name FROM City"); if ($uresult) { while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) { echo $row['Name'] . PHP_EOL; } } ?>
طريقة الاستعلام غير المخزن الثالث: mysql
<?php $conn = mysql_connect("localhost", "my_user", "my_pass"); $db = mysql_select_db("world"); $uresult = mysql_unbuffered_query("SELECT Name FROM City"); if ($uresult) { while ($row = mysql_fetch_assoc($uresult)) { echo $row['Name'] . PHP_EOL; } } ?>
هذا هو نهاية محتوى هذا المقال، نأمل أن يكون قد ساعدكم في التعلم، ونأمل أن تدعموا دائمًا دليل التدريب.
بيان: محتويات هذا المقال تم جمعها من الإنترنت، حقوق النشر تخص المالك الأصلي، المحتوى تم إضافته من قبل مستخدمي الإنترنت بشكل تلقائي، هذا الموقع لا يملك حقوق الملكية، لم يتم تعديل المحتوى بشكل يدوي، ولا يتحمل أي مسؤولية قانونية. إذا كنت قد وجدت محتوى يشتبه في انتهاك حقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) لإبلاغنا، وقدم الدليل على الأدلة، إذا تم التحقق من ذلك، فإن هذا الموقع سيرحل على الفور عن المحتوى المزعوم.