مقدمة: لماذا يتعطل سكريبت PHP الخاص بك؟
\n\nهل سبق لك أن رأيت شاشة بيضاء مع رسالة مرعبة «Fatal Error: Allowed Memory Size of 134217728 Bytes Exhausted»؟ إذا كان الأمر كذلك، فأنت لست وحدك. هذا السؤال على Stack Overflow حصل على آلاف المشاهدات، وكل مطور PHP ثاني واجهه مرة واحدة على الأقل في حياته.
\n\nالرقم 134217728 بايت هو بالضبط 128 ميغابايت (الحد الافتراضي للعديد من الاستضافات). عندما يحاول سكريبتك استخدام مساحة أكبر، يقول PHP «توقف» ويطرح خطأ فادحًا. لكن لا داعي للذعر! في هذه المقالة، سنشرح لماذا يحدث هذا، وكيفية إصلاحه، والأهم من ذلك، كيفية تحسين الأداء حتى لا يزعجك خطأ الذاكرة مرة أخرى.
\n\nالمقالة مكتوبة للموقع التعليمي PythonLib، لكن كل الكود والأمثلة بلغة PHP. هيا بنا!
\n\nما هو memory_limit ومن أين يأتي «134217728»؟
\n\nفي PHP، هناك توجيه memory_limit يحدد الحد الأقصى للذاكرة المتاحة لسكريبت واحد. بشكل افتراضي، في العديد من التكوينات (خاصة على الاستضافات المشتركة)، تكون القيمة 128M (أو 134217728 بايت).
يمكنك التحقق من الحد الحالي بهذه الطريقة:
\n\n<?php\necho ini_get('memory_limit'); // سيظهر، مثلاً، "128M"\n?>\n\nعندما يتجاوز سكريبتك هذا الحد، يقوم PHP بإنهاء التنفيذ فورًا بخطأ فادح. الأسباب قد تكون مختلفة: من كود غير مثالي إلى تحميل ملفات ضخمة في الذاكرة.
\n\nالسيناريوهات النموذجية المسببة للخطأ
\n\n- \n
- العمل مع مصفوفات كبيرة — مثل قراءة ملف CSV بالكامل في الذاكرة. \n
- حلقات مع تسريبات — نسيان تحرير المتغيرات أو استخدام مصفوفات عامة. \n
- مكتبات معالجة الصور — GD أو Imagick عند العمل مع صور عالية الدقة. \n
- الدوال التكرارية — بدون شرط أساسي، تصبح لا نهائية وتستهلك المكدس. \n
- ORM والتخزين المؤقت — بعض ORM (مثل Doctrine) قد تحمل الجدول بأكمله في الذاكرة. \n
كيفية إصلاح الخطأ: 3 طرق مجربة
\n\n1. زيادة الحد مؤقتًا عبر ini_set()
\n\nأسرع طريقة هي زيادة الحد مباشرة في السكريبت:
\n\n<?php\nini_set('memory_limit', '256M');\n// الآن يمكن للسكريبت استخدام حتى 256 MB\n?>\n\nمهم: هذا يعمل فقط إذا كانت استضافتك تسمح بإعادة تعريف التوجيه. في بعض الاستضافات، يكون ini_set() لـ memory_limit محظورًا.
\n\n2. تعديل php.ini أو .htaccess
\n\nإذا كان لديك وصول إلى الخادم، قم بتحرير php.ini:
memory_limit = 256M\n\nأو عبر .htaccess (على Apache):
php_value memory_limit 256M\n\nبعد التغييرات، أعد تشغيل خادم الويب أو PHP-FPM.
\n\n3. تحسين الكود — أفضل طريقة
\n\nزيادة الحد هو حل مؤقت. الحل الحقيقي هو كتابة كود فعال. دعنا نستعرض أمثلة.
\n\nمثال واقعي: معالجة ملف CSV كبير
\n\nلنفترض أن لديك ملف CSV يحتوي على 500,000 سطر. الكود الساذج قد يبدو هكذا:
\n\n<?php\n$rows = file('data.csv'); // يحمل الملف بأكمله في الذاكرة!\nforeach ($rows as $row) {\n // معالجة\n}\n?>\n\nعند حجم ملف 200 MB، سيتعطل السكريبت بخطأ ذاكرة.
\n\nالتحسين: القراءة سطرًا سطرًا
\n\n<?php\n$handle = fopen('data.csv', 'r');\nif ($handle) {\n while (($row = fgetcsv($handle)) !== false) {\n // معالجة سطر واحد في كل مرة\n // الذاكرة لا تزيد تقريبًا\n }\n fclose($handle);\n}\n?>\n\nالآن يستخدم السكريبت بضعة ميغابايت فقط، بغض النظر عن حجم الملف.
\n\n<