لقد كنت أعمل على تحسين أداء البرنامج منذ فترة، ولدي فكرة مثيرة للاهتمام أود مشاركتها معك.
تعد ذاكرة التخزين المؤقت وضع تطبيق نموذجي لاستراتيجية "المساحة مقابل الوقت" وطريقة مهمة لتحسين أداء النظام. يمكن أن يؤدي استخدام ذاكرة التخزين المؤقت إلى تقليل عدد عمليات قاعدة البيانات بشكل كبير في حالة أحجام الوصول الكبيرة، مما يقلل بشكل كبير من تحميل النظام ويحسن أداء النظام. بالمقارنة مع التخزين المؤقت للصفحة، فإن مجموعة النتائج هي نوع من "البيانات الأولية" التي لا تحتوي على معلومات التنسيق، وكمية البيانات صغيرة نسبيًا ويمكن تنسيقها مرة أخرى، لذا فهي مرنة تمامًا. نظرًا لأن PHP هي لغة برمجة نصية "تجمع وتنفذ في نفس الوقت"، فهي توفر أيضًا طريقة مريحة جدًا لاستخدام التخزين المؤقت لمجموعة النتائج إلى حد معين - باستخدام ذاكرة التخزين المؤقت عن طريق تضمين مقطع كود تعريف البيانات المقابل ديناميكيًا. إذا تم إنشاء ذاكرة تخزين مؤقت على "RamDisk"، فيجب تحسين الكفاءة بشكل أكبر. فيما يلي رمز عينة صغير للرجوع إليه.
// تحميل البيانات مع ذاكرة التخزين المؤقت
وظيفة تحميل_البيانات($id,$cache_lifetime) {
// بيانات الإرجاع
$data = array();
// إنشاء اسم ملف ذاكرة التخزين المؤقت
$cache_filename = 'cache_'.$id.'.php';
// التحقق من وقت التعديل الأخير لملف ذاكرة التخزين المؤقت
$cache_filetime = filemtime($cache_filename);
إذا (الوقت () - $cache_filetime <= $cache_lifetime) {
//** ذاكرة التخزين المؤقت لم تنته صلاحيتها
include($cache_filename);
} آخر {
//** انتهت صلاحية ذاكرة التخزين المؤقت
// تحميل البيانات من قاعدة البيانات
// ...
بينما ($dbo->nextRecord()) {
// $data[] = ...
}
// تنسيق البيانات كملف PHP
$data_cache = "
بينما (قائمة($مفتاح، $val) = كل($data)) {
$data_cache .= "$data['$key']=array('";
$data_cache .= "'NAME'=>"".qoute($val['NAME']).""،
$data_cache .= "'VALUE'=>"".qoute($val['VALUE'])."""
$data_cache .= ";);rn";
}
$data_cache = "?>rn";
// احفظ البيانات في ملف ذاكرة التخزين المؤقت
إذا ($fd = fopen($cache_filename,'w+')) {
fputs($fd,$data_cache);
فكلوز($fd);
}
}
إرجاع بيانات $؛
}
?>
الحالات المطبقة:
1. البيانات مستقرة نسبيا، وخاصة عمليات القراءة.
2. عمليات الملفات أسرع من عمليات قاعدة البيانات.
3. الوصول إلى البيانات المعقدة، والوصول إلى حجم البيانات الكبير، والوصول المكثف للبيانات، والحمل الثقيل للغاية على قاعدة بيانات النظام.
4. هيكل فصل الويب/قاعدة البيانات أو هيكل قاعدة بيانات فردية متعددة الويب.
سؤال غير مؤكد:
1. ما إذا كانت قراءة الملفات وكتابتها أثناء الوصول المتزامن ستتسبب في حدوث مشكلات في القفل.
2. ما هو الأداء عندما يكون هناك عدد كبير جدًا من ملفات البيانات المعنية؟
أفكار التمديد:
1. قم بإنشاء كود تعريف بيانات JavaScript واستدعائه على العميل.
2. لم أفكر في الأمر بعد ...
نأمل أن نناقش معا.
مخبأ
إذا كنت تريد أن تجعل تطبيق PHP الضخم الخاص بك يتمتع بأداء أفضل، فإن استخدام التخزين المؤقت يعد أيضًا طريقة جيدة. هناك العديد من حلول التخزين المؤقت المتاحة، بما في ذلك: Zend Cache، وAPC، وAfterburner Cache.
جميع هذه المنتجات عبارة عن "وحدات تخزين مؤقت". عند حدوث طلب لملف .php لأول مرة، يقومون بحفظ كود PHP الوسيط في ذاكرة خادم الويب، ثم يستجيبون للطلبات اللاحقة بالإصدار "المجمع". يمكن لهذا الأسلوب تحسين أداء التطبيق بالفعل لأنه يقلل من الوصول إلى القرص إلى الحد الأدنى (تمت قراءة التعليمات البرمجية وتحليلها)، ويتم تشغيل التعليمات البرمجية مباشرة في الذاكرة، مما يجعل الخادم يستجيب للطلبات بشكل أسرع بكثير. بالطبع، ستقوم وحدة التخزين المؤقت أيضًا بمراقبة التغييرات في ملفات مصدر PHP وإعادة تخزين الصفحة مؤقتًا إذا لزم الأمر، وبالتالي منع المستخدم من الحصول على الصفحات التي لا تزال يتم إنشاؤها بواسطة كود PHP قديم. نظرًا لأن وحدات التخزين المؤقت يمكنها تقليل الحمل على الخادم بشكل كبير وتحسين كفاءة استجابة تطبيقات PHP، فهي مناسبة جدًا لمواقع الويب ذات الأحمال الثقيلة.
كيفية اختيار منتجات التخزين المؤقت هذه
Zend Cache هو برنامج تجاري من شركة Zend Technologies، الشركة المذكورة سابقًا والتي توفر لنا محرك PHP وZend Optimizer مجانًا. Zend Cache يستحق بالفعل! بالنسبة لصفحات PHP الكبيرة، يمكنك أن تشعر أن السرعة ستزداد بعد التشغيل الأول، وسيكون لدى الخادم المزيد من الموارد المتاحة. لسوء الحظ، هذا المنتج ليس مجانيًا، ولكن في بعض الحالات يمكن أن يظل ذا قيمة كبيرة.
Afterburner Cache عبارة عن وحدة تخزين مؤقت مجانية من Bware Technologies. هذا المنتج موجود حاليًا في الإصدار التجريبي. تبدو Afterburner Cache مشابهة لـ Zend Cache، ولكنها لا تعمل على تحسين الأداء بقدر Zend Cache (حتى الآن)، ولا تعمل مع Zend Optimizer.
APC هو اختصار لـ Alternative PHP Cache، وهو وحدة تخزين مؤقت مجانية أخرى من Community Connect. المنتج مستقر بالفعل بدرجة كافية للاستخدام الرسمي، ويبدو أنه يحسن سرعة الاستجابة للطلبات إلى حد كبير.
حول الضغط
تتمتع وحدة Apache mod_gzip المجانية من Remote Communications بالقدرة على ضغط محتوى الويب الثابت للمتصفحات التي تدعم هذا النوع من ترميز المحتوى. بالنسبة للغالبية العظمى من محتوى الويب الثابت، يعمل mod_gzip بشكل جيد للغاية. يمكن تجميع mod_gzip بسهولة في Apache ويمكن استخدامه أيضًا كـ DSO. وفقًا للاتصالات عن بعد، يمكن لـ mod_gzip أيضًا ضغط المحتوى الديناميكي من mod_php وmod_perl وما إلى ذلك. لقد حاولت مراراً وتكراراً، لكن يبدو أن الأمر لم ينجح. لقد قرأت العديد من المنتديات والمقالات حول mod_gzip، ويبدو أنه من المتوقع أن يتم حل هذه المشكلة في الإصدار التالي من mod_gzip (ربما 1.3.14.6f). حتى ذلك الحين، يمكننا استخدام mod_gzip على الأجزاء الثابتة من الموقع.
ومع ذلك، في بعض الأحيان لا نرغب حقًا في ضغط المحتوى الديناميكي، لذلك يجب علينا إيجاد طرق أخرى. إحدى الطرق هي استخدام class.gzip_encode.php، وهي فئة PHP يمكن استخدامها لضغط محتوى الصفحة عن طريق استدعاء وظائف معينة للفئة في بداية ونهاية برنامج PHP النصي. إذا كنت تريد تنفيذ هذا الحل على مستوى موقع الويب، فيمكنك استدعاء هذه الوظائف من توجيهات auto_prepend وauto_append في ملف php.ini. على الرغم من أن هذه الطريقة فعالة، إلا أنها بلا شك تجلب المزيد من الحمل لمواقع الويب ذات التحميل العالي. للحصول على إرشادات مفصلة حول كيفية استخدام هذه الفئة، راجع التعليمات البرمجية المصدر الخاصة بها. وصف الكود المصدري الخاص به مكتمل تمامًا، ويخبرك المؤلف بكل ما تحتاج إلى معرفته.
يحتوي PHP 4.0.4 على معالج جديد لذاكرة التخزين المؤقت للمخرجات ob_gzhandler، وهو مشابه للفئة السابقة ولكن له استخدام مختلف. يجب إضافة المحتوى التالي إلى php.ini عند استخدام ob_gzhandler:
input_handler = ob_gzhandler;
يؤدي هذا السطر من التعليمات البرمجية إلى قيام PHP بتنشيط التخزين المؤقت للمخرجات وضغط كل ما يرسله. إذا كنت لا ترغب لسبب ما في إضافة هذا السطر من التعليمات البرمجية إلى php.ini، فيمكنك أيضًا تغيير سلوك الخادم الافتراضي (بدون ضغط) من خلال ملف .htaccess في الدليل الذي يوجد به ملف PHP المصدر على النحو التالي:
php_value Output_handler ob_gzhandler
أو نسميها من كود PHP كما يلي: ob_start("ob_gzhandler");
إن طريقة استخدام مقابض ذاكرة التخزين المؤقت للإخراج فعالة جدًا ولا تضع أي حمل خاص على الخادم. ومع ذلك، يجب ملاحظة أن Netscape Communicator لديه دعم ضعيف للرسومات المضغوطة، لذا ما لم تتمكن من التأكد من أن جميع المستخدمين يستخدمون متصفح IE، فيجب عليك تعطيل رسومات JPEG وGIF المضغوطة. بشكل عام، يعمل هذا الضغط مع جميع الملفات الأخرى، ولكن يوصى باختباره بشكل منفصل لكل متصفح، خاصة إذا كنت تستخدم مكونات إضافية خاصة أو برامج عرض البيانات، وهذا مهم بشكل خاص.