سؤال

لا بد لي من الحفاظ على موقع ويب يعود إلى عصور ما قبل التاريخ يحتوي على الكثير من أكواد Perl.بعد الانتقال إلى خادم جديد، أصبحت الأمور غامضة:

عند تشغيل طلبات متعددة من نفس العميل على الصفحة (إنشاء صور باستخدام GD)، تقوم هذه البرامج النصية بالكتابة فوق متغيرات بعضها البعض، مما يؤدي إلى نتائج غريبة.

كحل بديل سريع، قمت بتعيين MaxRequestsPerChild=1 في Apache، مما أدى إلى إصلاح هذه المشكلة، ولكن الآن أصبحت الأمور بطيئة إلى حد الزحف ...

هل هناك طريقة لفصل الطلبات؟هل هناك أي معلمات mod_perl أو Apache يمكن أن تساعدني؟

أباتشي:

Server version: Apache/2.2.15 (Unix)
Server built:   Apr  3 2014 23:56:16
Server's Module Magic Number: 20051115:25
Server loaded:  APR 1.3.9, APR-Util 1.3.9
Compiled using: APR 1.3.9, APR-Util 1.3.9
Architecture:   64-bit
Server MPM:     Prefork
  threaded:     no
    forked:     yes (variable process count)

بيرل -v

This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi

أي حل لهذا سيكون موضع تقدير كبير :)


يحرر:لم أتمكن من العثور على طريقة مناسبة لإصلاح الأمور باستخدام mod_perl، ولكن الحل البديل التالي يعمل:

  • تعطيل mod_perl
  • تمكين mod_cgi
  • AddHandler cgi-script .pl
  • تعطيل suEXEC

كان الأخير ضروريًا لأنه أعطاني "نهاية مبكرة لرؤوس البرنامج النصي" عند تمكين suEXEC.

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

المحلول

لا، لا يوجد شيء يمكنك القيام به "لفصل الطلبات".ستتشارك جميع البرامج النصية التي يتم تشغيلها في عملية مترجم Perl واحدة في نفس البيئة، وتحت mod_Perl تكون هذه البيئة ثابتة.يمكنك محاولة الإعداد ModPerl::Registry لتشغيلها (إذا لم تكن قد قمت بذلك بالفعل) مما يجب أن يلفها في روتين فرعي خاص بها ويزيل بعض مشكلات مساحة الاسم، ولكن إذا لم تتم كتابة البرامج النصية مع وضع المثابرة في الاعتبار (*) فلا يزال يتعين عليك لتعديلها إلى حد ما على الأقل.

http://perl.apache.org/docs/2.0/user/intro/start_fast.html#Registry_Scripts

يمكنك أيضًا أن تواجه مشكلة عندما تستخدم البرامج النصية وحدات نمطية معينة مثل SOAP::Lite التي لها حالة عامة مشتركة عبر جميع الوحدات التي تستخدمها، على الرغم من أن هذه مشكلة نادرة جدًا.

لذلك لا، لسوء الحظ، لا يوجد شيء يمكنك القيام به للتأكد من أن البرامج النصية ستعمل بشكل جيد دون تغييرها.البعض قد يكون بخير، والبعض الآخر لن يكون.ربما ينبغي عليك إعداد خادم Apache CGI عادي إلى جانب خادم mod_perl المنفصل وترحيله تدريجيًا.لن تحصل على الأداء على خادم CGI العادي، لكنك لن تواجه المشكلات أيضًا.

(*) على وجه الخصوص، وهذا من الذاكرة منذ العديد من الأقمار، يجب عليهم تجنب تعيين المتغيرات العامة، والإعلان دائمًا عن المتغيرات باستخدام my, ، استخدم وحدة CGI (أو واجهة برمجة التطبيقات mod_perl) لتفاعل الطلب، وأشياء من هذا القبيل.

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