سؤال

بالنسبة للعبتنا على الإنترنت، قمنا بكتابة الكثير من فئات PHP ووظائفها مجمعة حسب الموضوع في الملفات ثم المجلدات.في النهاية، لدينا الآن جميع أكواد الواجهة الخلفية (طبقات الوصول المنطقية وقاعدة البيانات) في مجموعة من الملفات التي نسميها libs ونقوم بتضمين مكتباتنا في واجهة المستخدم الرسومية (صفحات الويب، وطبقة العرض التقديمي) باستخدام include_once('pathtolib/file.inc').

المشكلة هي أننا كنا كسالى فيما يتعلق بالتضمينات ومعظم عبارات التضمين يتم إجراؤها داخل ملف libs الخاص بنا، مما يؤدي إلى أنه من كل صفحة ويب، في كل مرة نقوم فيها بتضمين أي ملف libs، نقوم بالفعل بتحميل libs بالكامل، ملفًا تلو الآخر.

وهذا له تأثير كبير على الأداء.إذن ما هو الحل الأفضل؟

  • هل تريد إزالة جميع عبارات التضمين من ملف libs واستدعاء البيانات الضرورية فقط من صفحات الويب؟
  • افعل شيئا اخر ؟

يستخدم الخادم مكدس LAMP كلاسيكي (PHP5).

يحرر:لدينا مزيج من الوظائف البسيطة (السبب القديم وأغلبية الكود) والفئات.لذا فإن التحميل التلقائي لن يكون كافياً.

هل كانت مفيدة؟

المحلول

  • إدارة جميع التضمينات يدويًا، عند الحاجة فقط
  • قم بتعيين مسار include_path على المكان الذي يجب أن يكون فيه فقط، والإعداد الافتراضي هو شيء من هذا القبيل .:/usr/lib/pear/:/usr/lib/php، قم بتوجيهه فقط إلى المكان الذي يجب أن يكون فيه، php.net/set_include_path
  • لا تستخدم التحميل التلقائي، فهو بطيء ويجعل وظائف APC وذاكرة التخزين المؤقت المكافئة أكثر صعوبة
  • يمكنك إيقاف تشغيل عملية "stat" في APC، ولكن بعد ذلك يتعين عليك مسح ذاكرة التخزين المؤقت يدويًا في كل مرة تقوم فيها بتحديث الملفات

نصائح أخرى

إذا كنت قد قمت ببرمجتك بطريقة موجهة للكائنات، فيمكنك الاستفادة من تحميل تلقائى وظيفة، والتي ستقوم بتحميل الفئات من ملفات المصدر الخاصة بها عند الطلب كما تسميها.

يحرر:لقد لاحظت أن شخصًا ما قام بالتصويت السلبي لكلا الإجابتين اللتين تشيران إلى التحميل التلقائي.هل نحن مخطئون؟هل الحمل الزائد لوظيفة __autoload مرتفع جدًا بحيث لا يمكن استخدامه لأغراض الأداء؟إذا كان هناك شيء لا أدركه بشأن هذه التقنية، سأكون مهتمًا حقًا بمعرفة ما هو.

إذا كنت تريد أن تصبح متشددًا حقًا، فقم بإجراء بعض التحليلات الثابتة، واكتشف بالضبط ما هي المكتبات المطلوبة ومتى، وقم بتضمينها فقط.

إذا كنت تستخدم include و لا include_once, ، ثم هناك القليل من التوفير في السرعة أيضًا.

بعد كل ما قيل، فإن إجابة مات بشأن Zend Optimizer صحيحة فيما يتعلق بالمال.إذا كنت تريد، جرّب Advanced PHP Cache (APC)، وهو عبارة عن ذاكرة تخزين مؤقت لشفرة التشغيل، ومجانية.يجب أن يكون في مستودع PECL.

يمكنك استخدام spl_autoload_register() أو __autoload() لإنشاء أي قواعد تحتاجها لتضمين الملفات التي تحتاجها للفئات، إلا أن التحميل التلقائي يقدم نفقات الأداء الخاصة به.ستحتاج إلى التأكد من أن كل ما تستخدمه مُلحق بجميع صفحات واجهة المستخدم الرسومية باستخدام إعداد php.ini أو تكوين Apache.

بالنسبة لملفاتك ذات الوظائف العامة، أقترح أن تقوم بتغليفها في فئة أداة مساعدة وإجراء عملية بحث واستبدال بسيطة لاستبدال جميع استدعاءات الدالة() الخاصة بك بـ util::function()، مما سيمكنك بعد ذلك من التحميل التلقائي لهذه الوظائف (مرة أخرى، هناك حمل يتم تقديمه لاستدعاء أسلوب بدلاً من دالة عمومية).

أفضل ما يمكنك فعله هو الرجوع إلى التعليمات البرمجية الخاصة بك وسداد ديون التصميم الخاصة بك عن طريق إصلاح مشكلات التضمين.سيمنحك هذا أقصى استفادة من الأداء، وسيسمح لك بتحقيق أقصى استفادة من أدوات التحسين مثل eAccelerator وZend Platform وAPC

إليك طريقة نموذجية لتحميل الأشياء ديناميكيًا

public static function loadClass($class)
{
    if (class_exists($class, false) ||
        interface_exists($class, false))
    {
        return;
    }

    $file = YOUR_LIB_ROOT.str_replace('_', DIRECTORY_SEPARATOR, $class).'.php';

    if (file_exists($file))
    {
        include_once $file;
        if (!class_exists($class, false) &&
            !interface_exists($class, false))
        {
            throw new Exception('File '.$file.' was loaded but class '.$class.' was not found');
        }
    }
}

ما تبحث عنه هو امتداد Automap PECL.

فهو يسمح بشكل أساسي بالتحميل التلقائي مع عبء بسيط فقط لتحميل ملف خريطة محسوب مسبقًا.يمكنك أيضًا تقسيم ملف الخريطة فرعيًا إذا كنت تعلم أن دليلًا محددًا سوف يتم سحبه فقط من ملفات PHP معينة.

يمكنك قراءة المزيد عنها هنا.

لقد مر وقت طويل منذ أن استخدمت PHP، ولكن ألا يجب أن يساعد Zend Optimizer أو Cache في هذه الحالة؟هل لا يزال PHP يقوم بتحميل وتجميع كل ملف مضمن مرة أخرى لكل طلب؟

لست متأكدًا مما إذا كان التحميل التلقائي هو الحل.إذا تم تضمين هذه الملفات، فمن المحتمل أن تكون هناك حاجة إليها في الفصل الذي يتضمنه، لذلك سيتم تحميلها تلقائيًا على أي حال.

استخدم ذاكرة تخزين مؤقت لرمز البايت (من الناحية المثالية APC) بحيث لا تحتاج PHP إلى تحليل المكتبات في كل تحميل للصفحة.كن على علم بأن استخدام التحميل التلقائي سوف يلغي فوائد استخدام ذاكرة التخزين المؤقت لرمز البايت (يمكنك قراءة المزيد عن هذا هنا).

إستخدم ملف التعريف.إذا حاولت التحسين دون وجود تدابير، فأنت تعمل بشكل أعمى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top